一、DNS服务概述

service发现是k8s中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到ClusterIP的解析。
k8s主要有两种service发现机制:环境变量和DNS。没有DNS服务的时候,k8s会采用环境变量的形式,但一旦有多个service,环境变量会变复杂,为解决该问题,我们使用DNS服务。
k8sDNS服务的发展经历了三个阶段:SkyDNS、KubeDNS和CoreDNS,其架构由复杂向简单演变。
这里配置的是KubeDNS。
KubeDNS由3个容器组成:kubedns、dnsmasq和sidecar:
kubedns:该容器监控Kubernetes中的service资源变化,根据service的名称和IP地址生成DNS记录,并将DNS记录保存在内存中;
dnsmasq:该容器从kubedns中获取DNS记录,提供DNS缓存,为客户端容器应用提供DNS查询服务;
sidecar:提供对kubedns和dnsmasq服务的健康检查功能。

二、DNS服务配置

由于国内的网络问题,需要自己找一下dns相应的镜像并把它们放入私有仓库中,否则deployment下载不了:

docker pull mirrorgooglecontainers/dnsmasq-metrics-amd64:1.0
docker pull mirrorgooglecontainers/exechealthz-amd64:1.2
docker pull mirrorgooglecontainers/kube-dnsmasq-amd64:1.4
docker pull mirrorgooglecontainers/kubedns-amd64:1.9

打tag并把它们放入私有仓库中
在这里插入图片描述

1、用yaml创建dns服务的rc:kubedns-rc.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
spec:
  strategy:
    rollingUpdate:
      maxSurge: 10%
      maxUnavailable: 0
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
        scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
    spec:
      containers:
      - name: kubedns
        image: registry.cn-hangzhou.aliyuncs.com/google-containers/kubedns-amd64:1.9
        args:
        - --domain=cluster.local.
        - --dns-port=10053
        - --config-map=kube-dns
        - --v=2
        - --kube-master-url=http://192.168.56.4:8080 # 这个地址为之前配置的KUBE_MASTER的地址
        env:
        - name: PROMETHEUS_PORT
          value: "10055"
        ports:
        - containerPort: 10053
          name: dns-local
          protocol: UDP
        - containerPort: 10053
          name: dns-tcp-local
          protocol: TCP
        - containerPort: 10055
          name: metrics
          protocol: TCP
      - name: dnsmasq
        image: 192.168.3.88/kube-dnsmasq-amd64:1.4 #换成自己私有仓库中预先下好的镜像地址
        args:
        - --cache-size=1000
        - --no-resolv
        - --server=127.0.0.1#10053
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP

2、用yaml创建dns服务的service:kubedns-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.254.230.254 #这个地址可以随便设,但必须在10.254网段下
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

3、在master以及所有节点中修改配置:

vim /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"

cluster_dns地址与kubedns-svc.yaml中的clusterIP保持一致
cluster_domain与kubedns-rc.yaml 中的domain保持一致
4、配置完后需要重启部分服务:
master节点:

systemctl stop etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
systemctl start etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler

node节点:

systemctl stop kubelet docker kube-proxy flanneld 
systemctl start flanneld docker kubelet kube-proxy

5、创建rc:

kubectl create -f  kubedns-rc.yaml

6、创建service:

kubectl create -f  kubedns-svc.yaml

由于这些deployment放在了kube-system的namespace,而我们默认访问的是default,所以查看这些资源时要加上–namespace=kube-system参数。

kubectl get all --namespace=kube-system

7、查看DNS服务创建情况

$ kubectl get svc,ep,pod --all-namespaces
NAMESPACE     NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default       svc/kubernetes   10.254.0.1      <none>        443/TCP         3d
kube-system   svc/kube-dns     10.254.230.254    <none>        53/UDP,53/TCP   1h

NAMESPACE     NAME                         ENDPOINTS                     AGE
default       ep/kubernetes                192.168.1.114:6443            3d
kube-system   ep/kube-dns                  172.16.77.3:53,172.16.77.3:53   1h

NAMESPACE     NAME                           READY     STATUS    RESTARTS   AGE
kube-system   po/kube-dns-2768888805-978hl   2/2       Running   0          1h

可以看到svc都成功运行。
8、接下来创建一个容器来验证DNS服务是否配置成功:

test_dns_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: busybox3
    role: master
  name: busybox3
spec:
  containers:
  - name: busybox3
    image: docker.io/busybox:1.28.4
    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "3600"

(*busybox的镜像一定要为1.28.4以下,否则后续nslookup会不成功)

kubectl create -f test_dns_pod.yaml

进入该容器:

kubectl exec -it busybox3 sh

执行nslookup+任意服务名或服务cluster-ip即可显示出该服务的相关信息。
在这里插入图片描述

至此DNS服务已配置成功,以后可以直接用service的名称来访问该service。
*如果某个service属于不同的命名空间,那么在进行service查找时,需要补充Namespace的名称(补充在服务名之后,用.连接),组合成完整的域名,否则会查找失败。
例如查找kube-dns:

nslookup kube-dns.kube-system
Logo

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

更多推荐