• Kubernetes DNS服务搭建指南


    Kubernetes提供的虚拟DNS服务名为skydns,由四个组件组成:

    1. etcd:DNS存储
    2. kube2sky:强Kubernetes Master中的service(服务)注册到etcd。
    3. skyDNS:提供DNS域名解析服务。
    4. healthz:提供对skydns服务的健康检查。

    一 、skydns配置文件说明

    skydns服务将使用一个RC和一个Service实现,分别由配置文件skydns-rc.yaml和skydns-svc.yaml定义。

    RC的配置文件skydns-rc.yaml包含了定义实现四个组件的相应容器,具体内容如下:

      1 apiVersion: v1
      2 kind: ReplicationController
      3 metadata:
      4   name: kube-dns
      5   namespace: kube-system
      6   labels:
      7     k8s-app: kube-dns
      8     version: v12
      9     kubernetes.io/cluster-service: "true"
     10 spec:
     11   replicas: 1
     12   selector:
     13     k8s-app: kube-dns
     14     version: v12
     15   template:
     16     metadata:
     17       labels:
     18         k8s-app: kube-dns
     19         version: v12
     20         kubernetes.io/cluster-service: "true"
     21     spec:
     22       containers:
     23       - name: etcd
     24         image: 192.168.3.51:5656/etcd-amd64:v2.2.5
     25         resources:
     26           limits:
     27             cpu: 100m
     28             memory: 50Mi
     29           requests:
     30             cpu: 100m
     31             memory: 50Mi
     32         command:
     33         - /usr/local/bin/etcd
     34         - --data-dir
     35         - /tmp/data
     36         - --listen-client-urls
     37         - http://127.0.0.1:2379,http://127.0.0.1:4001
     38         - --advertise-client-urls
     39         - http://127.0.0.1:2379,http://127.0.0.1:4001
     40         - --initial-cluster-token
     41         - skydns-etcd
     42         volumeMounts:
     43         - name: etcd-storage
     44           mountPath: /tmp/data
     45       - name: kube2sky
     46         image: 192.168.3.51:5656/kube2sky-amd64:v1.15
     47         resources:
     48           limits:
     49             cpu: 100m
     50             memory: 50Mi
     51           requests:
     52             cpu: 100m
     53             memory: 50Mi
     54        # livenessProbe:
     55        #   httpGet:
     56        #     path: /healthz
     57        #     port: 8080
     58        #     scheme: HTTP
     59        #   initialDelaySeconds: 60
     60        #   timeoutSeconds: 5
     61        #   successThreshold: 1
     62        #   failureThreshold: 5
     63        # readinessProbe:
     64        #   httpGet:
     65        #     path: /readiness
     66        #     port: 8081
     67        #     scheme: HTTP
     68        #   initialDelaySeconds: 30
     69        #   timeoutSeconds: 5
     70         args:
     71         - --kube-master-url=http://192.168.3.69:8080
     72         - --domain=cluster.local
     73       - name: skydns
     74         image: 192.168.3.51:5656/skydns-amd64:v1.0
     75         resources:
     76           limits:
     77             cpu: 100m
     78             memory: 50Mi
     79           requests:
     80             cpu: 100m
     81             memory: 50Mi
     82         args:
     83         - -machines=http://127.0.0.1:4001
     84         - -addr=0.0.0.0:53
     85         - -ns-rotate=false
     86         - -domain=cluster.local
     87         ports:
     88         - containerPort: 53
     89           name: dns
     90           protocol: UDP
     91         - containerPort: 53
     92           name: dns-tcp
     93           protocol: TCP
     94       - name: healthz
     95         image: 192.168.3.51:5656/exechealthz-amd64:v1.2.0
     96         resources:
     97           limits:
     98             cpu: 10m
     99             memory: 20Mi
    100           requests:
    101             cpu: 10m
    102             memory: 20Mi
    103         args:
    104         - -cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null
    105         - -port=8080
    106         ports:
    107         - containerPort: 8080
    108           protocol: TCP
    109       volumes:
    110       - name: etcd-storage
    111         emptyDir: {}
    112       dnsPolicy: Default

     需要修改的几个配置参数如下:

      (1)kube2sky容器需要访问Kubernetes Master,需要配置Master所在物理主机的IP地址和端口号,本例中设置的参数--kube-master-url的值为http://192.168.3.69:8080;

      (2)四个容器的image参数这里使用的是作者私有的镜像库,如果您可以FQ则可以使用“image:gcr.io/google_containers/imagename:version”,同样也可以使用docker search根据imagname进行搜索,根据结果进行修改。

      (3)kube2sky容器和skydns容器的启动参数--domain,设置Kubernetes集群中Service所属的域名,本例中为“cluster.local”。启动后,kube2sky会通过APIServer监控集群中全部的Service的定义,生成相应的记录并保存到etcd中。kube2sky为每个Service生成以下两条记录。

    • <service_name>.<namespace_name>.<domain>
    • <service_name>.<namespace_name>.svc.<domain>    

    skydns的Service配置文件skydns-svc.yaml的内容如下:

     1 apiVersion: v1
     2 kind: Service
     3 metadata:
     4   name: kube-dns
     5   namespace: kube-system
     6   labels:
     7     k8s-app: kube-dns
     8     kubernetes.io/cluster-service: "true"
     9     kubernetes.io/name: "KubeDNS"
    10 spec:
    11   selector:
    12     k8s-app: kube-dns
    13   clusterIP: 10.254.16.254
    14   ports:
    15   - name: dns
    16     port: 53
    17     protocol: UDP
    18   - name: dns-tcp
    19     port: 53
    20     protocol: TCP

    注意: 

    • skydns服务使用的clusterIP需要指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址。
    • 这个IP地址需要在kube-apiserver启动参数--service-cluster-ip-range指定的IP地址范围内。

    二、修改每台Node上的kubelet的启动参数

      本例是通过修改/etc/kubernetes/kubelet来实现的:

      # Add your own!
      KUBELET_ARGS="--cluster-dns=10.254.16.254 --cluster-domain=cluster.local"
    

      注意根据自己的配置环境修改参数cluster_dns和cluster_domain。

          然后,重启kubelet服务。

    三、创建skydns RC和Service

        使用kubectl create完成skydns的RC和Service创建:

        #kubectl create -f skydns-rc.yaml
        #kubectl create -f skydns-svc.yaml
    

      查看RC、Pod和Service,确保容器启动成功:

    [root@master ~]# kubectl get rc --namespace=kube-system
    NAME       DESIRED   CURRENT   AGE
    kube-dns   1         1         14h
    [root@master~]# kubectl get pod --namespace=kube-system
    NAME                                    READY     STATUS    RESTARTS   AGE
    kube-dns-kvv13                          4/4       Running   0          14h
    [root@master ~]# kubectl get svc --namespace=kube-system
    NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
    kube-dns               10.254.16.254   <none>        53/UDP,53/TCP   14h
    

    四、通过DNS查找Service

      该工作是使用一个带有nslookup工具的Pod来验证DNS服务是否工作正常:

      

    # cat busybox.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
    spec:
      containers:
      - name: busybox
        image: 192.168.3.51:5656/busybox
        command:
        - sleep
        - "3600"
    

      运行kubectl create -f busybox.yaml完成创建。

         在容器运行成功启动之后,通过kubectl exec <service_name> nslookup进行测试:

    # kubectl exec busybox -- nslookup kubernetes
    Server:    10.254.16.254
    Address 1: 10.254.16.254
    
    Name:      kubernetes
    Address 1: 10.254.0.1
    

      如果某个服务属于不同的命名空间,那么进行Service查找时,需要带上namespace的名字,如下所示。

    # kubectl exec busybox -- nslookup kube-dns.kube-system
    Server:    10.254.16.254
    Address 1: 10.254.16.254
    
    Name:      kube-dns.kube-system
    Address 1: 10.254.16.254
    

      否则将会失败:

    # kubectl exec busybox -- nslookup kube-dns
    Server:    10.254.16.254
    Address 1: 10.254.16.254
    
    nslookup: can't resolve 'kube-dns'
    

    ps. 本例的实现参考了《Kubernetes权威指南:从Docker到Kubernetes实践全接触》(第2版) 

  • 相关阅读:
    网络基础
    socket编程初识
    socket之黏包
    socketserver和socket的补充(验证客户端合法性)
    操作系统介绍
    进程初识和multiprocessing模块之Process
    进程Process之join、daemon(守护)、terminate(关闭)
    进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)
    数字证书私钥sign及验证
    JAVA获取密钥公钥的keytool的使用
  • 原文地址:https://www.cnblogs.com/yujinyu/p/6112233.html
Copyright © 2020-2023  润新知