Kubernetes addons 之 coredns部署

Kubernetes addons 之 coredns部署

2019.06.04 18:04:35字數 1045閱讀 121

DNS 是 Kubernetes 的核心功能之一,經過 kube-dns 或 CoreDNS 做爲集羣的必備擴展來提供命名服務。css

Kubernetes基於DNS的服務發現

在Kubernetes集羣推薦使用Service Name做爲服務的訪問地址,所以須要一個Kubernetes集羣範圍的DNS服務實現從Service Name到Cluster Ip的解析,這就是Kubernetes基於DNS的服務發現功能。前端

Kubernetes DNS服務發展史

 
Kubernetes DNS服務發展史

 

從Kubernetes 1.11開始,可以使用CoreDNS做爲Kubernetes的DNS插件進入GA狀態,Kubernetes推薦使用CoreDNS做爲集羣內的DNS服務。 CoreDNS從2017年初就成爲了CNCF的的孵化項目,CoreDNS的特色就是十分靈活和可擴展的插件機制,各類插件實現不一樣的功能,如重定向、定製DNS記錄、記錄日誌等等。下圖描述了CoreDNS的總體架構:nginx

 

 
coredns

DNS 格式

Service
A records
  • 普通(不是headless)service被分配了一個名爲my-svc.my-namespace.svc.cluster.local形式的DNS A記錄。 這解析爲服務的羣集IP。
  • Headless(without a cluster IP) Service 也爲DNS A records綁定了一個my-svc.my-namespace.svc.cluster.local形式記錄。 與普通service不一樣,這將解析爲服務選擇的pod的IP集合。 當客戶端訪問時,會輪詢訪問該IP集合
SRV records

SRV 記錄的建立是根據普通(或 Headless Service )ports 名稱建立的,對於每一個端口的命名,SRV記錄的格式爲_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local..對於普通的service,my-svc.my-namespace.svc.cluster.local將解析爲端口號和域名,對於
headless service,將解析成多條記錄,對於service引用的每個pod,auto-generated-name.my-svc.my-namespace.svc.cluster.local將解析成包含端口號和域名的記錄
更多內容請參考 kubernetes dns 規範
)git

CoreDNS ConfigMap選項

在Kubernetes中,咱們安裝的CoreDNS使用瞭如下默認的Corefile配置。github

apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system labels: addonmanager.kubernetes.io/mode: EnsureExists data: Corefile: | .:53 { errors health kubernetes cluster.local. in-addr.arpa ip6.arpa { pods insecure upstream fallthrough in-addr.arpa ip6.arpa } prometheus :9153 proxy . /etc/resolv.conf cache 30 loop reload loadbalance } 

Upstream 用於解析指向外部主機的服務(外部服務)。算法

  • prometheus:CoreDNS的度量標準能夠在http//localhost:9153/Prometheus格式的指標中找到。
  • proxy:任何不在Kubernetes集羣域內的查詢都將轉發到預約義的解析器(/etc/resolv.conf)。
  • cache:這將啓用前端緩存。
  • loop:檢測簡單的轉發循環,若是找到循環則中止CoreDNS進程。
  • reload:容許自動從新加載已更改的Corefile。編輯ConfigMap配置後,請等待兩分鐘以使更改生效。
  • loadbalance:這是一個循環DNS負載均衡器,能夠在答案中隨機化A,AAAA和MX記錄的順序。

Kubernetes配置使用CoreDNS

  1. 進入源碼包,咱們在部署Dashboard的時候已經解壓縮了kubernetes-src.tar.gz,進入 kubernetes/cluster/addons/dns/coredns目錄
[root@k8s coredns]# ls coredns.yaml.base coredns.yaml.in coredns.yaml.sed Makefile transforms2salt.sed transforms2sed.sed #查看transforms2sed.sed的內容: [root@k8s coredns]# cat transforms2sed.sed s/__PILLAR__DNS__SERVER__/$DNS_SERVER_IP/g s/__PILLAR__DNS__DOMAIN__/$DNS_DOMAIN/g s/__PILLAR__CLUSTER_CIDR__/$SERVICE_CLUSTER_IP_RANGE/g s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: __SOURCE_FILENAME__/g 
  1. $DNS_SERVER_IP$DNS_DOMAIN替換成kubelet配置的內容。
[root@k8s cfg]# cat kubelet.config kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: 10.0.52.14 port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: - "10.0.0.2" clusterDomain: cluster.local. failSwapOn: false authentication: anonymous: enabled: true 

這裏將$DNS_SERVER_IP替換成10.0.0.2,將$DNS_DOMAIN替換成cluster.local.api

  1. 執行下面的命令,生成部署coreDNS所需的coredns.yaml文件:
sed -f transforms2sed.sed coredns.yaml.base > coredns.yaml
  1. 替換鏡像,將k8s.gcr.io/coredns:1.2.6替換成coredns/coredns:1.2.6
     
    coredns.yaml
  2. 部署dns
kubectl apply -f coredns.yaml #查看coredns的Pod,確認全部Pod都處於Running狀態: [root@k8s coredns]# kubectl get pods -n kube-system -l k8s-app=kube-dns NAME READY STATUS RESTARTS AGE coredns-dc8bbbcf9-k28h8 1/1 Running 0 18s 
  1. 測試DNS
    6.1 部署nginx,部署文件以下:
[root@k8s ~]# cat nginx.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: labels: run: nginx name: nginx namespace: default spec: type: NodePort ports: - port: 80 targetPort: 80 selector: app: nginx [root@k8s ~]# kubectl create -f nginx.yaml deployment.apps/nginx-deployment created service/nginx created [root@k8s ~]# kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-deployment-7544fc9954-d274k 1/1 Running 0 18s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 3d2h service/nginx NodePort 10.0.0.86 <none> 80:45498/TCP 18s 

6.2 部署busybox,測試DNS功能緩存

[root@k8s ~]# kubectl run -it --image=busybox:1.28.4 --rm --restart=Never sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local
/ # nslookup nginx
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      nginx
Address 1: 10.0.0.86 nginx.default.svc.cluster.local
/ # nslookup nginx.default.svc.cluster.local
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      nginx.default.svc.cluster.local
Address 1: 10.0.0.86 nginx.default.svc.cluster.local
/ # cat /etc/resolv.conf 
nameserver 10.0.0.2
search default.svc.cluster.local. svc.cluster.local. cluster.local.
options ndots:5

DNS服務是Kubernetes賴以實現服務發現的核心組件之一,默認狀況下只會建立一個DNS Pod,在生產環境中咱們須要對coredns進行擴容。 有兩種方式:架構

  • 手動擴容 kubectl scale deploy/coredns --replicas=<num_you_want> -n kube-system
[root@k8s ~]# kubectl scale deploy/coredns --replicas=2 -n kube-system deployment.extensions/coredns scaled [root@k8s ~]# kubectl get deploy -n kube-system NAME READY UP-TO-DATE AVAILABLE AGE coredns 2/2 2 2 13m [root@k8s ~]# 
  1. 查看dns規則

如圖所示,nginx service的cluster IP:port爲10.0.0.86:80,對應的pod的ip爲:172.12.9.4,172.12.95.3,172.12.9.5app


 
nginx組件

經過ipvsadm 命令查看,顯示各個ip和端口的轉發規則,若是所示10.0.0.86:80是經過rr(Round-Robin)默認調度算法來實現到172.12.9.4:80,172.12.95.3:80,172.12.9.5:80的pod中的轉發和負載。


 
相關文章
相關標籤/搜索