Kubernetes 服務自動發現CoreDNS


前言

Service服務,是一個概念,邏輯通過selector標簽代理指定后端pod。眾所周知,pod生命周期短,狀態不穩定,pod錯誤異常后新生成的Pod IP會發生變化,之前Pod的訪問方式均不可達。通過service對pod做代理,service有固定的IP和Port,IP:Port組合自動通過selector標簽關聯后端Pod,即使Pod發生改變,kubernetes內部更新這組關聯關系,使得service能夠匹配到新的Pod。這樣,通過service提供的固定Ip,用戶再也不用關心需要訪問哪個Pod,以及Pod是否發生改變,大大提高了服務質量。如果Pod使用Deployment創建了多個副本,那么service就能代理多個相同的Pod,通過kube-proxy,實現負載均衡

服務發現在微服務架構里,各個服務之間經常進行通信,服務發現就是解決不同服務之間通信的問題。比如一個nginx的pod,要訪問一個mysql服務,就需要知道mysql服務的Ip和Port,獲取Ip和Port的過程就是服務發現。

服務發現

1.環境變量:
Pod創建的時候,服務的IP和Port會以環境變量的形式注入到pod里
2.dns:
K8s集群部署一個Dns服務器,Service創建成功后,會在Dns服務器里寫入一些記錄,想要訪問某個服務,通過Dns服務器解析出對應的Ip和Port,從而實現k8s集群內部的服務訪問
 
CoreDns可以解決Service的發現問題,k8s將Service的名稱當做域名注冊到CoreDns中,通過Service的名稱就可以訪問其提供的服務
 

CoreDNS簡介

CoreDNS是一個Go語言實現的鏈式插件DNS服務端, 實現了集群內部通過服務名進行可以訪問,是CNCF成員,是一個 高性能、易擴展的DNS服務端。可以很方便的部署在k8s集群中,用來代替kube-dns

 

CoreDNS部署 

使用yaml方式部署CoreDNS

1、yaml資源配置清單

• rbac

$ vi /data/k8s-yaml/coredns/rbac.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: coredns namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: kubernetes.io/bootstrapping: rbac-defaults addonmanager.kubernetes.io/mode: Reconcile name: system:coredns rules: - apiGroups: - "" resources: - endpoints - services - pods - namespaces verbs: - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" labels: kubernetes.io/bootstrapping: rbac-defaults addonmanager.kubernetes.io/mode: EnsureExists name: system:coredns roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:coredns subjects: - kind: ServiceAccount name: coredns namespace: kube-system

 

• ConfigMap

$ vi /data/k8s-yaml/coredns/cm.yaml
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | .:53 { errors log health ready kubernetes cluster.local 192.168.0.0/16 forward . 10.4.7.11 cache 30 loop reload loadbalance }

關鍵參數解釋:

kubernetes cluster.local 192.168.0.0/16:Cluster網段(該網段就是service ip地址范圍)

forward . 10.4.7.11:制定上級dns服務器地址

 

• Deployment

$ vi /data/k8s-yaml/coredns/dp.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: coredns namespace: kube-system labels: k8s-app: coredns kubernetes.io/name: "CoreDNS" spec: replicas: 1 selector: matchLabels: k8s-app: coredns template: metadata: labels: k8s-app: coredns spec: priorityClassName: system-cluster-critical serviceAccountName: coredns containers: - name: coredns image: harbor.od.com/public/coredns:v1.6.1 args: - -conf - /etc/coredns/Corefile volumeMounts: - name: config-volume mountPath: /etc/coredns ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP - containerPort: 9153 name: metrics protocol: TCP livenessProbe: httpGet: path: /health port: 8080 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 dnsPolicy: Default volumes: - name: config-volume configMap: name: coredns items: - key: Corefile path: Corefile

 

• Server

$ vi /data/k8s-yaml/coredns/svc.yaml
apiVersion: v1 kind: Service metadata: name: coredns namespace: kube-system labels: k8s-app: coredns kubernetes.io/cluster-service: "true" kubernetes.io/name: "CoreDNS" spec: selector: k8s-app: coredns clusterIP: 192.168.0.2 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 - name: metrics port: 9153 protocol: TCP

關鍵參數解釋:

clusterIP: 192.168.0.2  指定了coredns的server cluster ip地址(必須要和kubelet的--cluster-dns ip一致)

 

2、創建資源

$ kubectl apply -f rbac.yaml
$ kubectl apply -f cm.yaml
$ kubectl apply -f dp.yaml
$ kubectl apply -f svc.yaml

 

3、查看CoreDns是否運行

$ kubectl get pods -n kube-system
NAME                       READY   STATUS    RESTARTS   AGE
coredns-6dd977c48b-rvb7h   1/1     Running   0          31s

$ kubectl get svc -n kube-system
NAME      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE
coredns   ClusterIP   192.168.0.2   <none>        53/UDP,53/TCP,9153/TCP   3m20s

 

4、通過core dns解析svc名稱獲取到cluster-ip

# svc名稱.命名空間.svc.cluster.local
$ dig -t A nginx-ds.default.svc.cluster.local @192.168.0.2 +short
192.168.155.175

 

5、進入pod查看域名解析文件

$ kubectl exec -it nginx-ds-gbt9g bash
root@nginx-ds-gbt9g:/# cat /etc/resolv.conf
nameserver 192.168.0.2   # CoreDns地址
search default.svc.cluster.local svc.cluster.local cluster.local 4
options ndots:5

在容器內部是可以訪問到本k8s集群里的所有svc

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM