部署kube-dns
https://console.cloud.google.com/gcr/images/google-containers/GLOBAL #kube-dns鏡像下載地址
kube-dns簡介
kube-dns 的 pod 中包含了 3 個容器,分別是:
1、kube-dns:提供service name域名的解析(用於k8s集群內部的域名解析)
2、dns-dnsmasq:提供DNS緩存(當一個容器訪問dns-dnsmasq獲取域名解析,dns-dnsmasq沒有解析,會到kube-dns去查詢,kube-dns查詢后,把解析發送給dns-dnsmasq,dns-dnsmasq再發送給容器,並且本身會緩存一份,當下次再有相同的請求,會直接由dns-dnsmasq處理),降低kubedns負載,提高性能
3、dns-sidecar:定期檢查kubedns和dnsmasq的健康狀態
注意:
kube-dns 容器里是沒有 service name 對應的 IP 地址的,這些數據全部都是存放到 etcd 中,所以當進行解析時,
dns-dnsmasq 沒有解析,會向 kube-dns 獲取解析,kube-dns 本身並沒有解析,kube-dns 會通過 api server 查詢 etcd 中的解析,從而把解析返還給 dns-dnsmasq,dns-dnsmasq 本身緩存一份,並且把解析發送給容器
部署
1、cd /usr/local/src/
2、tar xf kubernetes-client-linux-amd64.tar.gz
tar xf kubernetes-node-linux-amd64.tar.gz
tar xf kubernetes-server-linux-amd64.tar.gz
tar xf kubernetes.tar.gz
3、cd kubernetes/cluster/addons/dns/kube-dns/
4、cp kube-dns.yaml.base kube-dns.yaml
5、vim kube-dns.yaml #需要修改以下內容
spec:
selector:
k8s-app: kube-dns
clusterIP: 172.31.0.2 #指定kube-dns的service的IP地址;可以通過啟動一個pod,進入pod查看
/etc/resolv.conf 此文件,這里設置的地址需要與pod中指定的dns地址一致
containers:
- name: kubedns
image: harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13 #本地harbor地址
resources:
limits:
memory: 512Mi #指定kube-dns容器最大可以使用宿主機的內存
args:
- --domain=linux.local. #指定域名后綴;部署k8s集群時指定的service域名后綴
- --dns-port=10053
- --config-dir=/kube-dns-config
- --v=2
- name: dnsmasq
image: harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13
args:
- --server=/linux.local/127.0.0.1#10053 #指定域名后綴;針對linux.local域名的解析,交給
本機的10053端口去解析
- --server=/linux.test/172.31.5.20#53 #針對 linux.test 域名的解析,交給指定DNS服務 器解析,一般此服務器是針對公司內部的域名解析
- name: sidecar
image: harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
args:
- --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.linux.local,5,SRV
- --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.linux.local,5,SRV
6、cp kube-dns.yaml /root
7、cd /etc/ansible/manifests/
8、mkdir dns/{kube-dns,Coredns} -p
9、cd dns/kube-dns
10、docker load -i k8s-dns-dnsmasq-nanny-amd64_1.14.13.tar.gz #導入kube-dns所需要的鏡
11、docker tag gcr.io/google-containers/k8s-dns-dnsmasq-nanny-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13
12、docker push harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13
#上傳到本地harbor
13、docker load -i k8s-dns-kube-dns-amd64_1.14.13.tar.gz
docker tag gcr.io/google-containers/k8s-dns-kube-dns-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13
docker push harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13
docker load -i k8s-dns-sidecar-amd64_1.14.13.tar.gz
docker tag gcr.io/google-containers/k8s-dns-sidecar-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
docker push harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
14、kubectl apply -f /root/kube-dns.yaml #啟動kube-dns的pod
15、進入一個容器,ping 外網,如果能 ping 通,則 kube-dns 部署成功
16、不在同一個namespace內的service是不能直接訪問的,需要在容器中使用此方法:
ping kubernetes-dashboard.kubernetes-dashboard.svc.linux.local
#第一個 kubernetes-dashboard 是 service name,第二個 kubernetes-dashboard 是 namespace name,svc 是固定的,linux.local 為部署 k8s 集群時指定的 service 的域名后綴;在同一個 namespace 里的 pod 訪問 service,也盡量使用全稱域名訪問,不要只寫 service name 這個簡稱
17、kubectl exec busybox nslookup kubernetes.default.svc.linux.local
#也可以使用busybox容器,進行域名解析測試(不進入容器中)
部署coredns:
https://github.com/coredns/coredns #下載地址
https://github.com/coredns/deployment/tree/master/kubernetes #1.6版本部署方式
1、 cd /etc/ansible/manifests/dns
2、git clone https://github.com/coredns/deployment.git #將github上部署coredns的項目克隆下來
3、cd deployment/kubernetes/
4、./deploy.sh > coredns.yml
#將 coredns 的模板內容輸出到 yml 文件中,此項目在執行腳本之前必須提前已經安裝完 kube-dns,這個腳本會讀取 kube-dns 的一些信息
5、vim coredns.yml
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes linux.local in-addr.arpa ip6.arpa { #此處需要修改為自己配置的域名后綴
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . 223.6.6.6 #coredns能解析的話解析,不能解析的話轉發到指定地址進行解析,此處一般為公 司內部的DNS服務器
containers:
- name: coredns
image: harbor.linux.com/coredns/coredns:1.6.9 #鏡像地址換成本地的harbor
imagePullPolicy: IfNotPresent
resources:
limits:
memory: 512Mi #運行coredns使用宿主機的內存大小
6、cp coredns.yml /root
7、kubectl delete -f /root/kube-dns.yaml
8、kubectl apply -f /root/coredns.yml #構建coredns
9、進入一個容器中 ping 外網進行測試