首页 > 技术文章 > K8s附加组件DNS服务

jiawei2527 2020-09-26 20:01 原文

     Kubernetes中有一个很重要的特性,服务自发现。一旦一个service被创建,该service的service IP和service port等信息都可以被注入到pod中供它们使用。Kubernetes主要支持两种service发现 机制:环境变量和DNS。没有dns服务的时候,kubernetes会采用环境变量的形式,一旦有很多个service,环境变量会变得很复杂,为了解决这个问题,k8s通过Add-On增值包的方式引入了DNS系统,把服务名作为DNS域名,这样程序就可以直接使用服务名来创建通信连接。

    作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围的DNS服务来完成服务名到Cluster IP的解析。

1. k8s提供的虚拟DNS服务名为skydns,主要由4个组件组成。

1)etcd:DNS存储

2)kube2sky:将k8s master中的service服务注册到etcd

3)kubeDNS:提供DNS域名解析服务

4)healthz:提供对skydns服务的健康检查功能

2. 下载skydns资料包

[root@kub_master k8s]# wget https://www.qstack.com.cn/skydns.zip
--2020-09-26 17:54:34--  https://www.qstack.com.cn/skydns.zip
Resolving www.qstack.com.cn (www.qstack.com.cn)... 36.159.114.145, 111.62.73.19, 36.159.114.146, ...
Connecting to www.qstack.com.cn (www.qstack.com.cn)|36.159.114.145|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3411 (3.3K) [application/zip]
Saving to: ‘skydns.zip’

100%[===============================================================================================>] 3,411       --.-K/s   in 0s      

2020-09-26 17:54:35 (267 MB/s) - ‘skydns.zip’ saved [3411/3411]
[root@kub_master k8s]# unzip skydns.zip 
Archive:  skydns.zip
   creating: skydns/
  inflating: skydns/skydns-rc.yaml   
  inflating: skydns/skydns-svc.yaml  
  inflating: skydns/test_dns_pod.yaml  

 3. skydns服务由一个RC和一个Service的定义组成,分别由配置文件skydns-rc.yaml 和skydns-svc.yaml定义。

[root@kub_master skydns]# vim skydns-rc.yaml 
[root@kub_master skydns]# cat skydns-rc.yaml |grep  master
          # we poll on pod startup for the Kubernetes master service and
        - --kube-master-url=http://192.168.0.212:8080    #master所在物理主机的IP地址和端口号
[root@kub_master skydns]# kubectl create -f skydns-rc.yaml 
deployment "kube-dns" created
[root@kub_master skydns]# kubectl get pods --namespace=kube-system
NAME                        READY     STATUS    RESTARTS   AGE
kube-dns-4072910292-4qb6c   4/4       Running   0          2m
[root@kub_master skydns]# kubectl get deployment --namespace=kube-system
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-dns   1         1         1            1           2m
[root@kub_master skydns]# vim skydns-svc.yaml 
[root@kub_master skydns]# cat skydns-svc.yaml |grep -i clusterip
  clusterIP: 192.168.230.254

skydns服务使用的cluster ip需要指定一个固定的ip地址,每个node的kubelet进程都将使用这个ip地址,不能通过k8s自动分配。

另外这个ip地址需要在kube-apiserver启动参数--service-cluster-ip-range指定的ip地址范围内。

[root@kub_master skydns]# kubectl create -f skydns-svc.yaml 
service "kube-dns" created
[root@kub_master skydns]# kubectl get svc --namespace=kube-system
NAME       CLUSTER-IP        EXTERNAL-IP   PORT(S)         AGE
kube-dns   192.168.230.254   <none>        53/UDP,53/TCP   14s

4. 查看在kube-system命名空间内的所有资源

[root@kub_master skydns]# kubectl get all --namespace=kube-system
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/kube-dns   1         1         1            1           10m

NAME           CLUSTER-IP        EXTERNAL-IP   PORT(S)         AGE
svc/kube-dns   192.168.230.254   <none>        53/UDP,53/TCP   1m

NAME                     DESIRED   CURRENT   READY     AGE
rs/kube-dns-4072910292   1         1         1         10m

NAME                           READY     STATUS    RESTARTS   AGE
po/kube-dns-4072910292-4qb6c   4/4       Running   0          10m

5. 在创建skydns容器之前,先修改每个node上kubelet的启动参数。

[root@kub_node1 ~]# vim /etc/kubernetes/kubelet 
[root@kub_node1 ~]# cat /etc/kubernetes/kubelet 
###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"

# The port for the info server to serve on
KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=192.168.0.184"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.0.212:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.0.212:5000/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS="--cluster_dns=192.168.230.254 --cluster_domain=cluster.local"
[root@kub_node1 ~]# systemctl restart kubelet

6.检验dns是否生效

#创建测试pod

[root@kub_master skydns]# vim test_dns_pod.yaml 
[root@kub_master skydns]# cat test_dns_pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: busybox
    role: master
  name: busybox2
spec:
  containers:
  - name: busybox
    image: docker.io/busybox:latest
    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "3600"
[root@kub_master skydns]# kubectl create -f test_dns_pod.yaml 
pod "busybox2" created
[root@kub_master skydns]# kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
busybox2                         1/1       Running   0          19s
mysql-wp-3651026459-v31gc        1/1       Running   0          1h
mysql-x6ql5                      1/1       Running   0          2h
myweb-03lkh                      1/1       Running   0          2h
myweb-d5h4z                      1/1       Running   0          2h
wp-deployment-3182043070-2jmkb   1/1       Running   0          59m
wp-deployment-3182043070-r7bmq   1/1       Running   0          59m

#进入pod测试

[root@kub_master ~]# kubectl get svc
NAME         CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
kubernetes   192.168.0.1       <none>        443/TCP          5d
mysql        192.168.41.34     <none>        3306/TCP         2h
mysql-wp     192.168.6.183     <none>        3306/TCP         44m
myweb        192.168.7.143     <nodes>       8080:30001/TCP   2h
wp           192.168.191.107   <nodes>       80:30002/TCP     43m
[root@kub_master skydns]# kubectl exec -it busybox2 bash
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:235: starting container process caused "exec: \"bash\": executable file not found in $PATH"

[root@kub_master skydns]# kubectl exec -it busybox2 sh
/ # nslookup wp
Server:        192.168.230.254
Address:    192.168.230.254:53

Name:    wp.default.svc.cluster.local
Address: 192.168.191.107

7. 有DNS服务后,创建不同服务之间不需要使用cluster ip地址,直接用服务名即可连接

#删除tomcat下的全部资源
[root@kub_master tomcat_demo]# cd tomcat_demo [root@kub_master tomcat_demo]# ll total 16 -rw-r--r-- 1 root root 420 Sep 26 16:34 mysql-rc.yaml -rw-r--r-- 1 root root 145 Sep 26 16:34 mysql-svc.yaml -rw-r--r-- 1 root root 495 Sep 26 17:02 tomcat-rc.yaml -rw-r--r-- 1 root root 162 Sep 26 17:03 tomcat-svc.yaml [root@kub_master tomcat_demo]# kubectl delete -f . replicationcontroller "mysql" deleted service "mysql" deleted replicationcontroller "myweb" deleted service "myweb" deleted [root@kub_master tomcat_demo]# kubectl get pods NAME READY STATUS RESTARTS AGE busybox2 1/1 Running 0 11m mysql-wp-3651026459-v31gc 1/1 Running 0 1h wp-deployment-3182043070-2jmkb 1/1 Running 0 1h wp-deployment-3182043070-r7bmq 1/1 Running 0 1h
#修改rc文件
[root@kub_master tomcat_demo]# vim tomcat-rc.yaml [root@kub_master tomcat_demo]# cat tomcat-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: 192.168.0.212:5000/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql' #修改成service 服务名 - name: MYSQL_SERVICE_PORT value: '3306'
#批量创建
[root@kub_master tomcat_demo]# kubectl create -f . replicationcontroller "mysql" created service "mysql" created replicationcontroller "myweb" created service "myweb" created [root@kub_master tomcat_demo]# kubectl get all NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/mysql-wp 1 1 1 1 1h deploy/wp-deployment 2 2 2 2 1h NAME DESIRED CURRENT READY AGE rc/mysql 1 1 1 11s rc/myweb 2 2 2 11s NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes 192.168.0.1 <none> 443/TCP 5d svc/mysql 192.168.185.140 <none> 3306/TCP 11s svc/mysql-wp 192.168.6.183 <none> 3306/TCP 1h svc/myweb 192.168.183.179 <nodes> 8080:30001/TCP 11s svc/wp 192.168.191.107 <nodes> 80:30002/TCP 1h NAME DESIRED CURRENT READY AGE rs/mysql-wp-3651026459 1 1 1 1h rs/wp-deployment-3182043070 2 2 2 1h NAME READY STATUS RESTARTS AGE po/busybox2 1/1 Running 0 14m po/mysql-ms870 1/1 Running 0 11s po/mysql-wp-3651026459-v31gc 1/1 Running 0 1h po/myweb-5zpl5 1/1 Running 0 11s po/myweb-g09wf 1/1 Running 0 11s po/wp-deployment-3182043070-2jmkb 1/1 Running 0 1h po/wp-deployment-3182043070-r7bmq 1/1 Running 0 1h

测试访问

 

推荐阅读