文檔說明
實驗環(huán)境:kubernetes Version v1.9.6
網(wǎng)絡(luò)CNI:fannel
存儲CSI: NFS Dynamic Class
DNS: kube-DNS 替換CoreDNS
背景
CoreDNS是一個Go語言實現(xiàn)的鏈?zhǔn)讲寮﨑NS服務(wù)端趁仙,是CNCF成員洪添,是一個高性能、易擴展的DNS服務(wù)端雀费「缮荩可以很方便的部署在k8s集群中,用來代替kube-dns盏袄。
Our goal is to make CoreDNS the cloud-native DNS server and service discovery solution.
部署 CoreDNS 需要使用到官方提供的兩個文件 deploy.sh和coredns.yaml.sed(這兩個文件已經(jīng)放入manifest的coredns目錄中)
deploy.sh
是一個用于在已經(jīng)運行kube-dns的集群中生成運行CoreDNS部署文件(manifest)的工具腳本忿峻。它使用 coredns.yaml.sed
文件作為模板,創(chuàng)建一個ConfigMap和CoreDNS的deployment辕羽,然后更新集群中已有的kube-dns 服務(wù)的selector使用CoreDNS的deployment逛尚。重用已有的服務(wù)并不會在服務(wù)的請求中發(fā)生沖突。
deploy.sh
文件并不會刪除kube-dns的deployment或者replication controller。如果要刪除kube-dns菩暗,你必須在部署CoreDNS后手動的刪除kube-dns。
你需要仔細(xì)測試manifest文件,以確保它能夠?qū)δ愕募赫_\行。這依賴于你的怎樣構(gòu)建你的集群以及你正在運行的集群版本辆它。 對manifest文件做一些修改是有比要的。
在最佳的案例場景中,使用CoreDNS替換Kube-DNS只需要使用下面的兩個命令:
$ ./deploy.sh | kubectl apply -f -
$ kubectl delete --namespace=kube-system deployment kube-dns
注意:我們建議在部署CoreDNS后刪除kube-dns协屡。否則如果CoreDNS和kube-dns同時運行材原,服務(wù)查詢可能會隨機的在CoreDNS和kube-dns之間產(chǎn)生。
對于非RBAC部署,你需要編輯生成的結(jié)果yaml文件:
- 從yaml文件的
Deployment
部分刪除serviceAccountName: coredns
- 刪除
ServiceAccount
、ClusterRole
和ClusterRoleBinding
部分
替換過程中碰到的error及Q&A:
Q: plugin/loop: Seen “HINFO IN xxx.” more than twice, loop detected
修改 kubelet的配置文件,加上 --resovf-conf標(biāo)志
--resolv-conf=/run/systemd/resolve/resolv.conf # Ubuntu 18.04
--resolv-conf=/etc/resolv.conf #default
路徑:/etc/systemd/system/kubelet.service 或者 /etc/systemd/system/kubelet.service.d 目錄下的配置
systemctl daemon-reload && systemctl restart kubelet
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
#--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest
ExecStart=/opt/kube/bin/kubelet \
--address=192.168.2.11 \
--hostname-override=192.168.2.11 \
--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.1 \
--experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
--cert-dir=/etc/kubernetes/ssl \
--client-ca-file=/etc/kubernetes/ssl/ca.pem \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/kube/bin \
--cluster-dns=10.68.0.2 \
--cluster-domain=cluster.local. \
--hairpin-mode hairpin-veth \
--allow-privileged=true \
--fail-swap-on=false \
--anonymous-auth=false \
--logtostderr=true \
--v=2 \
--resolv-conf=/run/systemd/resolve/resolv.conf #Ubuntu 18.04 DNS配置
#kubelet cAdvisor 默認(rèn)在所有接口監(jiān)聽 4194 端口的請求, 以下iptables限制內(nèi)網(wǎng)訪問
ExecStartPost=/sbin/iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -s 172.16.0.0/12 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -p tcp --dport 4194 -j DROP
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
參考文檔
https://jimmysong.io/kubernetes-handbook/practice/coredns.html
https://github.com/coredns/coredns/issues/2087
https://zhengyinyong.com/coredns-basis.html
http://johng.cn/minikube-fatal-pluginloop-seen/
https://kubernetes.io/docs/setup/independent/troubleshooting-kubeadm/#coredns-pods-have-crashloopbackoff-or-error-state