一、k8s dns简介及原理介绍

1.1 功能:

为自动发现k8s中我们创建的service服务而生。我们大家都知道,在k8s中,每创建一个pod,系统会默认分配一个podIP,但是这个podIP的生存周期随着pod的重启而结束,一旦pod重新启动,系统就会重新分配一个ip给该pod,导致我们无法访问该pod,所以k8s中提出了service(服务)的概念,我们可以在创建完deployment后(最新版本中一般使用deployment来创建和管理pod),再为该deployment创建一个service,k8s系统会为该service分配一个虚拟的,称之为clusterIP的地址,相较于pod会由于人为或其它原因重启导致podIP发生变化而言,serviceIP相对比较稳定,这样,我们就可以通过serviceIP:port的方式访问到pod,但是,这样还有一个弊端,那就是在分布式项目中,会涉及到多个服务相互调用的问题,我们如何解决这些服务之间可以直接通过service的名字来相互调用,至此,就引出了k8s dns的概念。
k8s dns可以时刻监听系统中service的变化,包括service地址变化以及增多还是减少的变化,把这些变化记录下来,转化成service名字对应的serviceIP,供所有的pod节点使用,这样我们在相互调用的服务中就可以只写想调用的服务的service名字,访问的时候,先去访问k8s dns 获得service名字对于的ip,然后直接去访问这个service服务,也就访问到了运行服务的pod。

1.2 实现原理

k8s dns实现的功能一共由3个组件来完成,3个容器运行在同一个pod中,这三个组件分别是:

  • kubedns:通过时刻监控service的变化,监控到了什么就把它记录下来,记录的是service和ip之间的映射关系,称为DNS解析记录,记录在内存当中,使用树形结构在内存中保存监控到的记录。
  • dnsmasq:从前面记录的地方查询相关service的解析记录,之所以用dnsmasq来查询,因为它提供DNS查询缓存,在内存中完成查询,查询速度非常快!
  • exechealthz:kubedns和dnsmasq两个组件一个负责监控并记录,另外一个负责帮其它服务做查询, 两个组件必须要同时运行,如果其中一个出问题了,那么dns系统将无法解析,于是需要有另一个组件专门来监控它们的健康状态,这个组件就是exechealthz。

二、配置及部署kubedns

2.1 上官网下载部署所需yaml文件

上官方网址下载需要的yaml部署文件:https://github.com/kubernetes/kubernetes/tree/release-1.8/cluster/addons/dns
包括四个yaml文件

[root@k8s-master v1.8.2]# ls
kubedns-cm.yaml  kubedns-controller.yaml.base  kubedns-sa.yaml  kubedns-svc.yaml.base
[root@k8s-master v1.8.2]# mv kubedns-controller.yaml.base kubedns-controller.yaml
[root@k8s-master v1.8.2]# mv kubedns-svc.yaml.base kubedns-svc.yaml

2.2 修改yaml文件

2.2.1 kubedns-cm.yaml和kubedns-sa.yaml文件不需要修改
2.2.2 修改kubedns-controller.yaml

在这里插入图片描述

        args:
        - --domain=cluster.local.			#修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
        - --dns-port=10053
        - --config-dir=/kube-dns-config
        - --v=2
        env:
        - name: PROMETHEUS_PORT
          value: "10055"
        ports:
        - containerPort: 10053
          name: dns-local
          protocol: UDP
        - containerPort: 10053
          name: dns-tcp-local
          protocol: TCP
        #- --no-negcache
        - --log-facility=-
        - --server=/cluster.local/127.0.0.1#10053		#修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
        - --server=/in-addr.arpa/127.0.0.1#10053
        - --server=/ip6.arpa/127.0.0.1#10053
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        # see: https://github.com/kubernetes/kubernetes/issues/29055 for details
        resources:
          requests:
            cpu: 150m
            memory: 20Mi
        volumeMounts:
        - name: kube-dns-config
        args:
        - --v=2
        - --logtostderr
        - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,A		#修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
        - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,A		#修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
        ports:
        - containerPort: 10054
          name: metrics
          protocol: TCP
        resources:
          requests:
            memory: 20Mi
            cpu: 10m
      dnsPolicy: Default  # Don't use cluster DNS.
      serviceAccountName: kube-dns                                                                                                                       

2.2.3 修改kubedns-svc.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.254.0.2			#修改为kubelet服务启动参数--cluster-dns设置的值
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

2.3 部署kubedns

[root@k8s-master ~]# kubectl create -f kubedns-cm.yaml -f kubedns-sa.yaml -f kubedns-controller.yaml -f kubedns-svc.yaml

[root@k8s-master ~]# kubectl get pod,svc -n kube-system
NAME                                       READY     STATUS    RESTARTS   AGE
po/kube-dns-5749767bc8-7jdl8               3/3       Running   0          12d

NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
svc/kube-dns               ClusterIP   10.254.0.2       <none>        53/UDP,53/TCP   12d

三、验证kubedns

kubedns安装完后,我们可以进入任意一个pod中执行通过ping service名字来验证安装是否成功
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐