集群?jiǎn)栴}
系統(tǒng)
Error: unknown flag: --etcd-quorum-read
刪除service 里面的相應(yīng)字段
start request repeated too quickly for kube-apiserver.service
查看是不是有之前的進(jìn)程占用,然后將service 字段摳出來(lái)手動(dòng)啟動(dòng)查看可否成功,也可顯示錯(cuò)誤
health check for peer acd2ba924953b1ec could not connect: dial tcp 192.168.81.60:2380: getsockopt: connection refused
分析是因?yàn)閑tcd1的配置文件/etc/etcd/etcd.conf中的ETCD_INITIAL_CLUSTER_STATE是new,而在配置中ETCD_INITIAL_CLUSTER寫(xiě)入了etcd2/3的IP:PORT,這時(shí)etcd1嘗試去連接etcd2、etcd3,但是etcd2、3的etcd服務(wù)此時(shí)還未啟動(dòng),因此需要先啟動(dòng)etcd2和3的etcd服務(wù),再去啟動(dòng)etcd1。
dial tcp 127.0.0.1:2379: getsockopt: connection refused
etcd.conf ETCD_LISTEN_CLIENT_URLS 選項(xiàng)中加入 https://127.0.0.1:2379`
Unable to connect to the server: x509: certificate is valid for etcd1, etcd2, node1, node2, kube.NETes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster, kubernetes.default.svc.cluster.local, not k8s1
修改/root/cfssl/kubernetes/kubernetes-server-csr.json 加入錯(cuò)誤中的k8s
FAIled at step CHDIR spawning /usr/local/bin/kubelet: No such file or directory
mkdir /var/lib/kubelet (具體看service 里面WorkingDirectory)
failed to run Kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from Docker cgroup driver: "cgroupfs"
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/local/bin/dockerd --exec-opt native.cgroupdriver=systemd 具體按照?qǐng)?bào)錯(cuò)修改
etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4
vim /etcd/etcd/etcd.conf ETCD_LISTEN_CLIENT_URLS=https://192.168.50.12:2379,https://127.0.0.1:2379;
master 狀態(tài) flanned 正常 pod 內(nèi)部通訊 互相ping 通node 狀態(tài) 宿主機(jī) 能ping 通百度容器 能ping 宿主機(jī)svc
現(xiàn)象
容器 不能ping 百度
kubectl run -it --rm DNS-test --image=busybox:1.28.4 sh 測(cè)試dns
Error registering network: failed to acquire lease: node "k8s-node2" pod cid
kubectl patch node k8s-master -p '{"spec":{"podCIDR":"10.244.0.0/12"}}' kubectl patch node k8s-node1 -p '{"spec":{"podCIDR":"10.244.0.0/12"}}'
Unable to connect to the server: x509: certificate signed by unknown authori
原因:重新初始化環(huán)境沒(méi)有清理干凈
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]:
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
在/etc/profile末尾增加export KUBECONFIG=/etc/kubernetes/admin.conf添加完后執(zhí)行source /etc/profile
svc不能被解析的原因
現(xiàn)象
pod 能ping 外網(wǎng) 但是不能解析百度 能ping114 不能ping svc 地址
解決
對(duì)應(yīng)的node上面沒(méi)有開(kāi)啟轉(zhuǎn)發(fā)(具體問(wèn)題可以先查看node上面的kube-proxy logs 因?yàn)閟vc 是通過(guò) kube-proxy分發(fā)出去的)echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
Error registering network: failed to acquire lease: node "master2" pod cidr not assigned
設(shè)置 pod ip 的網(wǎng)段 ,網(wǎng)段之所以是 10.244.0.0/16,是因?yàn)楹竺姘惭b flannel 網(wǎng)絡(luò)插件時(shí),yaml 文件里面的 ip 段也是這個(gè),兩個(gè)保持一致,不然可能會(huì)使得 Node 間 Cluster IP 不通。這個(gè)參數(shù)必須得指定,如果這里不設(shè)置的話后面安裝 flannel 網(wǎng)絡(luò)插件時(shí)會(huì)報(bào)這個(gè)錯(cuò)誤
Applying cgroup … caused: mkdir …no space left on device或者在describe pod的時(shí)候出現(xiàn)cannot allocate memory
解決方法
當(dāng)大量pod 出現(xiàn)evictive情況
說(shuō)明節(jié)點(diǎn)資源不夠,清理空間
ingress 獲取源地址ip為127.0.0.1 問(wèn)題
https://Github.com/kubernetes/ingress-Nginx/issues/8052#issuecomment-1003699587
如果ingress-nginx啟用了enable-ssl-passthrough,就需要添加enable-real-ip: true
forwarded-for-header: proxy_protocol
到configmap里面就可以了
etcd 節(jié)點(diǎn)異常恢復(fù)(openshift)
master 節(jié)點(diǎn)故障,docker ps -a |grep etcd |grep -v POD 發(fā)現(xiàn)etcd 異常退出
查看日志
docker logs -f etcd...
···
etcdserer : open wal error: wal : file not found
恢復(fù)步驟
將故障節(jié)點(diǎn)剝離集群,恢復(fù)后添加
etcdctl2 cluster-health
獲取問(wèn)題節(jié)點(diǎn)的member id
etcdclt2 member remove $memberid
將問(wèn)題節(jié)點(diǎn)移除
----
停止問(wèn)題節(jié)點(diǎn)上的etcd 服務(wù)
mkdir -pv /etc/orgin/node/pods-stopped
mv /etc/origin/node/pods/* /etc/orgin/node/pods-stopped
rm -rf /var/lib/etcd/*
----
更新ansible中的inventory host 內(nèi)容,設(shè)置new etcd 配置
[osev3:clildren]
masters
etcd
nodes
new_etcd
----
從集群中釋放問(wèn)題節(jié)點(diǎn)
----
更新etcd 擴(kuò)容腳本
ansible-playbook playbooks/openshift-master/openshift_node_groups.yaml
----
驗(yàn)證
etcdctl clister-health
節(jié)點(diǎn)not ready
rpc error: code = ResourceExhausted desc = grpc: trying to send message larger than max (xxxxxxx vs. 8388608)
描述
集群有個(gè)master節(jié)點(diǎn)NotReady。kubelet報(bào)錯(cuò) “Warning ContainerGCFailed ... ”
Warning ContainerGCFailed ...
rpc error: code = ResourceExhausted desc = grpc: trying to send message larger
than max (xxxxxxx vs. 8388608)
這個(gè)錯(cuò)和下面是一個(gè)問(wèn)題。
rpc error: code = ResourceExhausted desc = grpc: received message larger
than max (xxxxx vs. 4194304)
原因
-
kubelet與cri-o通信,cri-o返回信息大小超過(guò)grpc的限制
-
kubelet無(wú)法與cri-o通信,導(dǎo)致內(nèi)部大量錯(cuò)誤出現(xiàn)
超過(guò)的根源在于容器數(shù)量過(guò)多,grpc返回信息過(guò)大,從而你超過(guò)了限制,無(wú)法正確返回。
解決方法
查看GRPC Buff塊大小,擴(kuò)大至8MB。擴(kuò)大方法參考
https://github.com/cri-o/cri-o/pull/2027github.com/cri-o/cri-o/pull/2027
假如已經(jīng)是8MB,仍然報(bào)錯(cuò),則可能是鏡像等docker資源需要清理。可以執(zhí)行
docker system prune
為了根除此類錯(cuò)誤,可以在節(jié)點(diǎn)上設(shè)置完善的Garbage Collection機(jī)制。參考
Garbage Collectiondocs.openshift.com/container-platform/3.11/admin_guide/garbage_collection.html
node 拉取鏡像速度很快,但是起pod 鏡像很慢
Pods get stuck in ContainerCreating state when pulling image takes long
https://github.com/kubernetes/kubernetes/issues/83471
apiserver 前面使用的是 f5的負(fù)載均 策略有問(wèn)題,導(dǎo)致請(qǐng)求全部打在了master1上、
應(yīng)用故障
不同ns之前的pod怎么訪問(wèn)
創(chuàng)建一個(gè)networkpolicy 的 Ingress
apiVersion: extension/v1beta1 Kind: NetworkPolicy metadata: generation: name: allow-from-{ns1}-namespace namespace: {ns2} spec: ingress: - from: - namespaceSelector: matchLabels: name: {ns1} podSelector: {} policyType: - Ingress
pod內(nèi)出現(xiàn)no space left on device
說(shuō)明持久化存儲(chǔ)資源不足
pod處于running 域名訪問(wèn)404
檢查route ingress 是否為正常狀態(tài) 本地配置host是否解析正常
network plugin cni failed to set up pod
關(guān)鍵詞: cni networkplugin
報(bào)錯(cuò): networkPlugin cni filed to send cni request: post http://xxx/dial .var/run/openshift/cni-server.sock: connet: connetc refuse
解決
找到調(diào)度的節(jié)點(diǎn),重啟sdn
kubectl get openshift-sdn delete po --grace-period=0 --force sdn-xxx
不通pod 通過(guò)service hostname 訪問(wèn)不通
經(jīng)過(guò)排查為 networkplicy 缺少
https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
pod 不斷被重建
因?yàn)閚s開(kāi)啟可vpa導(dǎo)致
admission是會(huì)去手動(dòng)改request值 updater組件會(huì)發(fā)現(xiàn)request大于推薦去驅(qū)逐 然后admission掛了 改不了request pod一起來(lái) updater發(fā)現(xiàn)它大于推薦request 就會(huì)驅(qū)逐 然后一直循環(huán)在驅(qū)逐
然后pod會(huì)提示找不到cm
應(yīng)用做更新,所有的yaml都在一個(gè)文件里面,可能是cm更新的慢了,然后pod會(huì)提示找不到cm,pod重啟還是會(huì)找不到cm
timeout expired waiting for volumes to attach or mount for pod
eureka的問(wèn)題:pod不存在了,容器存在,up中有ip,可以調(diào)度
pod狀態(tài)terminating,強(qiáng)制刪除了,但是容器沒(méi)有刪除導(dǎo)致的
pod自動(dòng)重啟,pod名字不變,ip 和創(chuàng)建時(shí)間變化
VPA目前驅(qū)逐pod后 pod名字不會(huì)變 但是ip和創(chuàng)建時(shí)間會(huì)變,VPA關(guān)閉后無(wú)此現(xiàn)象
壓力測(cè)試 短連接 pod 負(fù)載不均衡
會(huì)話保持必須關(guān)閉
a應(yīng)用配置ssl 之后跳轉(zhuǎn)到了其他的地址
a 應(yīng)用使用了b 應(yīng)用的證書(shū)
pod 存活幾秒鐘重啟
vpa-admin-controller 異常pod
FAQ
service 選擇不通的depoy 的pod
service 通過(guò)label 選擇pod, 可以在A,B 的deploy 分別添加一個(gè)相同的標(biāo)簽,svc 中的selector 使用這個(gè)相同的標(biāo)簽,這樣就可以選擇A 和 B 的deploy創(chuàng)建的pod
通過(guò)router4層可以下載,通過(guò)7層下載502 gataway
檢查haproxy的問(wèn)題,開(kāi)啟haproxy的日志
ip地址沖突排查
表現(xiàn)為ping 不通,telnet 失敗
arping -I ens33 10.0.13.3
如果存在多個(gè)mac 地址,則表明地址沖突
如何刪除terminating 的ns
現(xiàn)象
kubectl get ns
demo terminating 50d
查看編排內(nèi)容
kubectl get ns demo -o json
"spec": {
"finalizers": [
"kubernetes"
]
},
刪除上面這段 然后導(dǎo)入到新的jjson 文件里面
curl -k -H "Content-Type: application/json" -X PUT --data-binary @1.sjon http://127.0.0.1:8001/api/v1/namespaces/demo/finalize
configmap 中的entrypoint.sh 無(wú)執(zhí)行權(quán)限
在configmap下面增加熟悉mode:493(十進(jìn)制,八進(jìn)制就是755)
configmap:
name: xxx
items:
- key: entrypoinyt.sh
path: entrypoiny.sh
mode: 493
build image no space left on device
怎么修改
修改docker 啟動(dòng)參數(shù)
vim /etc/systemd/system/multi-user.target.wants/docker.service
在 exec 參數(shù)后面加上 --graph=/xx/xxx/xx
systemctl daemon-reload
systemctl restart docker
修改daemon.jsono
{
"data-root": "/xxx/xxx"
}
the server doesn’t have a resource type ‘xxx’
~/.kube 客戶端認(rèn)證文件失效或者損壞,從其他節(jié)點(diǎn)的root用戶拷一份過(guò)來(lái)即可
tcp router 不通,無(wú)法通過(guò)tcp連接到服務(wù)
登陸到router 部署的節(jié)點(diǎn)
netstat -tnlp 查看端口是否正常監(jiān)聽(tīng)
kubectl -n default routerxxx rsh
grep -i "xxxx" -r ./
查看tcp-router是否有明顯錯(cuò)誤日志
kubectl -n defaut logs -f routerxxx --tail=10
查看端口范圍
iptables -nL INPUT
怎么指定用戶id啟動(dòng)應(yīng)用runasuser
創(chuàng)建sa
kubectl create sa -n xxx xxx
添加sa到對(duì)應(yīng)的scc
kubectl adm policy add-scc-to-user anyuid -n xx -z xxx
修改部署文件
serviceAccount: xxx
serviceAccountName: xxx
spec.template.spec.container[]
securityContext:
runAsuser: xxx
node可以解析,pod不能解析
解決 Kubernetes 中 Pod 無(wú)法正常域名解析問(wèn)題分析與 IPVS parseIP Error 問(wèn)題
系統(tǒng)環(huán)境:
CoreDNS 版本:1.6.7
Docker 版本:19.03.8
Kubernetes 版本:1.18.1
操作系統(tǒng)版本:centos 7.8
CentOS 內(nèi)核版本:3.10.0-1062
參考地址:
Kubernetes Github
CentOS 升級(jí)內(nèi)核版本
Kubernetes 官方文檔 - Services
Kubernetes 官方文檔 - 調(diào)試DNS服務(wù)
Kubernetes 官方文檔 - 自定義DNS服務(wù)
Issues "ipvs do not sync endpoint error: parseIP Error"
問(wèn)題分析比較長(zhǎng),分析的懷疑人生...
一、問(wèn)題描述
最近將 Kubernetes 升級(jí)到 1.18.1 版本,不過(guò)升級(jí)完后,查看工作節(jié)點(diǎn)的部分 Pod 無(wú)法啟動(dòng),查看消息全是
connetion timeout
的問(wèn)題,一看連接超時(shí)的地址大部分是以域名方式連接集群內(nèi)部地址(ClusterIP),少部分是以域名方式連接集群外部地址,通過(guò) IP 進(jìn)行遠(yuǎn)程連接的應(yīng)用倒是沒(méi)有問(wèn)題(例如,應(yīng)用通過(guò) IP 連接 MySQL),由此判斷,初步懷疑很可能是 DNS 出現(xiàn)了問(wèn)題,后來(lái)慢慢發(fā)現(xiàn) kube-proxy 中的錯(cuò)誤,再定位到 IPVS parseIP Error 錯(cuò)誤,再到解決問(wèn)題。下面是分析及姐問(wèn)題的過(guò)程。
二、部署 DNS 調(diào)試工具
為了探針是否為 DNS 問(wèn)題,這里需要提前部署用于測(cè)試 DNS 問(wèn)題的 dnsutils 鏡像,該鏡像中包含了用于測(cè)試 DNS 問(wèn)題的工具包,非常利于我們分析與發(fā)現(xiàn)問(wèn)題。接下來(lái),我們將在 Kubernetes 中部署這個(gè)工具鏡像。
1、創(chuàng)建 DNS 工具 Pod 部署文件
創(chuàng)建用于部署的 Deployment 資源文件 ndsutils.yaml:
ndsutils.yaml
apiVersion: v1
kind: Pod
metadata:
name: dnsutils
spec:
containers:
- name: dnsutils
image: mydlqclub/dnsutils:1.3
imagePullPolicy: IfNotPresent
command: ["sleep","3600"]
2、通過(guò) Kubectl 工具部署 NDS 工具鏡像
通過(guò) Kubectl 工具,將對(duì)上面 DNS 工具鏡像部署到 Kubernetes 中:
-n:指定應(yīng)用部署的 Namespace 空間。
$ kubectl create -f ndsutils.yaml -n kube-system
三、問(wèn)題分析
1、進(jìn)入 DNS 工具 Pod 的命令行
上面 DNS 工具已經(jīng)部署完成,我們可也通過(guò) Kubectl 工具進(jìn)入 Pod 命令行,然后,使用里面的一些工具進(jìn)行問(wèn)題分析,命令如下:
exec:讓指定 Pod 容器執(zhí)行某些命令。
-i:將控制臺(tái)內(nèi)容傳入到容器。
-t:進(jìn)入容器的 tty 使用 bash 命令行。
-n:指定上面部署 DNS Pod 所在的 Namespace。
$ kubectl exec -it dnsutils /bin/sh -n kube-system
2、通過(guò) Ping 和 Nsloopup 命令測(cè)試
進(jìn)入容器 sh 命令行界面后,先使用 ping 命令來(lái)分別探測(cè)觀察是否能夠 ping 通集群內(nèi)部和集群外部的地址,觀察到的信息如下:
## Ping 集群外部,例如這里 ping 一下百度
$ ping www.baidu.com
ping: bad address 'www.baidu.com'
## Ping 集群內(nèi)部 kube-apiserver 的 Service 地址
$ ping kubernetes.default
ping: bad address 'kubernetes.default'
## 使用 nslookup 命令查詢域名信息
$ nslookup kubernetes.default
;; connection timed out; no servers could be reached
## 直接 Ping 集群內(nèi)部 kube-apiserver 的 IP 地址
$ ping 10.96.0.1
PING 10.96.0.1 (10.96.0.1): 56 data bytes
64 bytes from 10.96.0.1: seq=0 ttl=64 time=0.096 ms
64 bytes from 10.96.0.1: seq=1 ttl=64 time=0.050 ms
64 bytes from 10.96.0.1: seq=2 ttl=64 time=0.068 ms
## 退出 dnsutils Pod 命令行
$ exit
可以觀察到兩次 ping 域名都不能 ping 通,且使用 nsloopup 分析域名信息時(shí)超時(shí)。然而,使用 ping kube-apiserver 的 IP 地址 "10.96.0.1" 則可以正常通信,所以,排除網(wǎng)絡(luò)插件(flannel、calico 等)的問(wèn)題。初步判斷,很可能是 CoreDNS 組件的錯(cuò)誤引起的某些問(wèn)題,所以接下來(lái)我們測(cè)試 CoreDNS 是否正常。
3、檢測(cè) CoreDNS 應(yīng)用是否正常運(yùn)行
首先,檢查 CoreDNS Pod 是否正在運(yùn)行,如果 READY 為 0,則顯示 CoreDNS 組件有問(wèn)題:
-l:指定根據(jù) label 標(biāo)簽進(jìn)行查找,篩選有該 label 的 Pod。
-n:指定 CoreDNS 組件部署的 Namespace。
$ kubectl get pods -l k8s-app=kube-dns -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-669f77d7cc-8pkpw 1/1 Running 2 6h5m
coredns-669f77d7cc-jk9wk 1/1 Running 2 6h5m
可也看到 CoreDNS 兩個(gè) Pod 均正常啟動(dòng),所以再查看兩個(gè) Pod 中的日志信息,看看有無(wú)錯(cuò)誤日志:
$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name);
do kubectl logs --namespace=kube-system $p; done
.:53
[INFO] plugin/reload: Running configuration MD5 = 4e235fcc3696966e76816bcd9034ebc7
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
.:53
[INFO] plugin/reload: Running configuration MD5 = 4e235fcc3696966e76816bcd9034ebc7
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
通過(guò)上面信息可以觀察到,日志中信息也是正常啟動(dòng)沒(méi)有問(wèn)題。再接下來(lái),查看下 CoreDNS 的入口 Service "kube-dns" 是否存在:
kube-dns 的 IP 為 10.96.0.10,集群內(nèi)的 Pod 都是通過(guò)該 IP 與 DNS 組件進(jìn)行交互,查詢 DNS 信息。
$ kubectl get service -n kube-system | grep kube-dns
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP
上面顯示 Service "kube-dns" 也存在,但是 Service 是通過(guò) endpoints 和 Pod 進(jìn)行綁定的,所以看看這個(gè) CoreDNS 的 endpoints 是否存在,及信息是否正確:
$ kubectl get endpoints kube-dns -n kube-system
NAME ENDPOINTS
kube-dns 10.244.0.21:53,d10.244.2.82:53,10.244.0.21:9153
可以看到 endpoints 配置也是正常的,正確的與兩個(gè) CporeDNS Pod 進(jìn)行了關(guān)聯(lián)。
經(jīng)過(guò)上面一系列檢測(cè) CoreDNS 組件確實(shí)是正常運(yùn)行。接下來(lái),觀察 CoreDNS 域名解析日志,進(jìn)而確定 Pod 中的域名解析請(qǐng)求是否能夠正常進(jìn)入 CoreDNS。
4、觀察 CoreDNS 域名解析日志信息
使用
kubectl edit
命令來(lái)修改存儲(chǔ)于 Kubernetes
ConfigMap
中的
CoreDNS
配置參數(shù)信息,添加
log
參數(shù),讓 CoreDNS 日志中顯示域名解析信息:
CoreDNS 配置參數(shù)說(shuō)明:
errors: 輸出錯(cuò)誤信息到控制臺(tái)。
health:CoreDNS 進(jìn)行監(jiān)控檢測(cè),檢測(cè)地址為 http://localhost:8080/health 如果狀態(tài)為不健康則讓 Pod 進(jìn)行重啟。
ready: 全部插件已經(jīng)加載完成時(shí),將通過(guò) endpoints 在 8081 端口返回 HTTP 狀態(tài) 200。
kubernetes:CoreDNS 將根據(jù) Kubernetes 服務(wù)和 pod 的 IP 回復(fù) DNS 查詢。
prometheus:是否開(kāi)啟 CoreDNS Metrics 信息接口,如果配置則開(kāi)啟,接口地址為 http://localhost:9153/metrics
forward:任何不在Kubernetes 集群內(nèi)的域名查詢將被轉(zhuǎn)發(fā)到預(yù)定義的解析器 (/etc/resolv.conf)。
cache:?jiǎn)⒂镁彺妫?0 秒 TTL。
loop:檢測(cè)簡(jiǎn)單的轉(zhuǎn)發(fā)循環(huán),如果找到循環(huán)則停止 CoreDNS 進(jìn)程。
reload:監(jiān)聽(tīng) CoreDNS 配置,如果配置發(fā)生變化則重新加載配置。
loadbalance:DNS 負(fù)載均衡器,默認(rèn) round_robin。
## 編輯 coredns 配置
$ kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
Corefile: |
.:53 {
log #添加log
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
保存更改后 CoreDNS 會(huì)自動(dòng)重新加載配置信息,不過(guò)可能需要等上一兩分鐘才能將這些更改傳播到 CoreDNS Pod。等一段時(shí)間后,再次查看 CoreDNS 日志:
$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name);
do kubectl logs --namespace=kube-system $p; done
.:53
[INFO] plugin/reload: Running configuration MD5 = 6434d0912b39645ed0707a3569fd69dc
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] 127.0.0.1:47278 - 55171 "HINFO IN 4940754309314083739.5160468069505858354. udp 57 false 512" NXDOMAIN qr,rd,ra 57 0.040844011s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
.:53
[INFO] plugin/reload: Running configuration MD5 = 6434d0912b39645ed0707a3569fd69dc
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
[INFO] 127.0.0.1:32896 - 49064 "HINFO IN 1027842207973621585.7098421666386159336. udp 57 false 512" NXDOMAIN qr,rd,ra 57 0.044098742s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
可以看到 CoreDNS 已經(jīng)重新加載了配置,我們?cè)俅芜M(jìn)入 dnsuitls Pod 中執(zhí)行 ping 命令:
## 進(jìn)入 DNSutils Pod 命令行
$ kubectl exec -it dnsutils /bin/sh -n kube-system
## 執(zhí)行 ping 命令
$ ping www.baidu.com
## 退出 dnsutils Pod 命令行
$ exit
然后,再次查看 CoreDNS 的日志信息:
$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name);
do kubectl logs --namespace=kube-system $p; done
.:53
[INFO] plugin/reload: Running configuration MD5 = 6434d0912b39645ed0707a3569fd69dc
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] 127.0.0.1:47278 - 55171 "HINFO IN 4940754309314083739.5160468069505858354. udp 57 false 512" NXDOMAIN qr,rd,ra 57 0.040844011s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
.:53
[INFO] plugin/reload: Running configuration MD5 = 6434d0912b39645ed0707a3569fd69dc
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
[INFO] 127.0.0.1:32896 - 49064 "HINFO IN 1027842207973621585.7098421666386159336. udp 57 false 512" NXDOMAIN qr,rd,ra 57 0.044098742s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
發(fā)現(xiàn)和之前沒(méi)有執(zhí)行 ping 命令時(shí)候一樣,沒(méi)有 DNS 域名解析的日志信息,說(shuō)明 Pod 執(zhí)行域名解析時(shí),請(qǐng)求并沒(méi)有進(jìn)入 CoreDNS 中。接下來(lái)在查看 Pod 中 DNS 配置信息,進(jìn)而分析問(wèn)題。
5、查看 Pod 中的 DNS 配置信息
一般 Pod 中的
DNS
策略默認(rèn)為
ClusterFirst
,該參數(shù)起到的作用是,優(yōu)先從
Kubernetes DNS
插件地址讀取
DNS
配置。所以,我們正常創(chuàng)建的 Pod 中,DNS 配置 DNS 服務(wù)器地址應(yīng)該指定為 Kubernetes 集群的 DNS 插件 Service 提供的虛擬 IP 地址。
注:其中 DNS 策略(dnsPolicy)支持四種類型:
Default: 從 DNS 所在節(jié)點(diǎn)繼承 DNS 配置,即該 Pod 的 DNS 配置與宿主機(jī)完全一致。
ClusterFirst:預(yù)先從 Kubenetes 的 DNS 插件中進(jìn)行 DNS 解析,如果解析不成功,才會(huì)使用宿主機(jī)的 DNS 進(jìn)行解析。
ClusterFirstWithHostNet:Pod 是用 HOST 模式啟動(dòng)的(hostnetwork),用 HOST 模式表示 Pod 中的所有容器,都使用宿主機(jī)的 /etc/resolv.conf 配置進(jìn)行 DNS 解析,但如果使用了 HOST 模式,還繼續(xù)使用 Kubernetes 的 DNS 服務(wù),那就將 dnsPolicy 設(shè)置為 ClusterFirstWithHostNet。
None:完全忽略 kubernetes 系統(tǒng)提供的 DNS,以 Pod Spec 中 dnsConfig 配置為主。
為了再分析原因,我們接著進(jìn)入 dnsutils Pod 中,查看 Pod 中 DNS 配置文件
/etc/resolv.conf
配置參數(shù)是否正確:
resolv.conf 配置參數(shù)說(shuō)明:
search: 指明域名查詢順序。
nameserver: 指定 DNS 服務(wù)器的 IP 地址,可以配置多個(gè) nameserver。
## 進(jìn)入 dnsutils Pod 內(nèi)部 sh 命令行
$ kubectl exec -it dnsutils /bin/sh -n kube-system
## 查看 resolv.conf 配置文件
$ cat /etc/resolv.conf
nameserver 10.96.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
## 退出 DNSutils Pod 命令行
$ exit
可以看到 Pod 內(nèi)部的 resolv.conf 內(nèi)容,其中 nameserver 指定 DNS 解析服務(wù)器 IP 為 "10.96.0.10" ,這個(gè) IP 地址正是本人 Kubernetes 集群 CoreDNS 的 Service "kube-dns" 的 cluterIP,說(shuō)明當(dāng) Pod 內(nèi)部進(jìn)行域名解析時(shí),確實(shí)是將查詢請(qǐng)求發(fā)送到 Service "kube-dns" 提供的虛擬 IP 進(jìn)行域名解析。
那么,既然 Pod 中 DNS 配置文件沒(méi)問(wèn)題,且 CoreDNS 也沒(méi)問(wèn)題,會(huì)不會(huì)是 Pod 本身域名解析不正常呢?或者 Service "kube-dns" 是否能夠正常轉(zhuǎn)發(fā)域名解析請(qǐng)求到 CoreDNS Pod 中?
當(dāng)然,猜想是沒(méi)有用的,進(jìn)行一下測(cè)試來(lái)觀察問(wèn)題到底出在哪里。
6、進(jìn)行觀察來(lái)定位問(wèn)題所在
上面懷疑是 Pod 本身解析域名有問(wèn)題,不能正常解析域名。或者 Pod 沒(méi)問(wèn)題,但是請(qǐng)求域名解析時(shí)將請(qǐng)求發(fā)送到 Service "kube-dns" 后不能正常轉(zhuǎn)發(fā)請(qǐng)求到 CoreDNS Pod。 為了驗(yàn)證這兩點(diǎn),我們可以修改 Pod 中的 /etc/resolv.conf 配置來(lái)進(jìn)行測(cè)試驗(yàn)證。
修改
resolv.conf
中
DNS
解析請(qǐng)求地址為
阿里云 DNS
服務(wù)器地址,然后執(zhí)行
ping
命令驗(yàn)證是否為
Pod
解析域名是否有問(wèn)題:
## 進(jìn)入 dnsutils Pod 內(nèi)部 sh 命令行
$ kubectl exec -it dnsutils /bin/sh -n kube-system
## 編輯 /etc/resolv.conf 文件,修改 nameserver 參數(shù)為阿里云提供的 DNS 服務(wù)器地址
$ vi /etc/resolv.conf
nameserver 223.5.5.5
#nameserver 10.96.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
## 修改完后再進(jìn)行 ping 命令測(cè)試,看看是否能夠解析 www.mydlq.club 網(wǎng)址
$ ping www.mydlq.club
PING www.mydlq.club (140.143.8.181) 56(84) bytes of data.
64 bytes from 140.143.8.181 (140.143.8.181): icmp_seq=1 ttl=128 time=9.70 ms
64 bytes from 140.143.8.181 (140.143.8.181): icmp_seq=2 ttl=128 time=9.21 ms
## 退出 DNSutils Pod 命令行
$ exit
上面可也觀察到 Pod 中更換 DNS 服務(wù)器地址后,域名解析正常,說(shuō)明 Pod 本身域名解析是沒(méi)有問(wèn)題的。
接下來(lái)再修改
resolv.conf
中
DNS
解析請(qǐng)求地址為
CoreDNS Pod
的
IP
地址,這樣讓
Pod
直接連接
CoreDNS Pod
的
IP
,而不通過(guò)
Service
進(jìn)行轉(zhuǎn)發(fā),再進(jìn)行
ping
命令測(cè)試,進(jìn)而判斷
Service
kube-dns
是否能夠正常轉(zhuǎn)發(fā)請(qǐng)求到
CoreDNS Pod
的問(wèn)題:
## 查看 CoreDNS Pod 的 IP 地址
$ kubectl get pods -n kube-system -o wide | grep coredns
coredns-669f77d7cc-rss5f 1/1 Running 0 10.244.2.155 k8s-node-2-13
coredns-669f77d7cc-rt8l6 1/1 Running 0 10.244.1.163 k8s-node-2-12
## 進(jìn)入 dnsutils Pod 內(nèi)部 sh 命令行
$ kubectl exec -it dnsutils /bin/sh -n kube-system
## 編輯 /etc/resolv.conf 文件,修改 nameserver 參數(shù)為阿里云提供的 DNS 服務(wù)器地址
$ vi /etc/resolv.conf
nameserver 10.244.2.155
nameserver 10.244.1.163
#nameserver 10.96.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
## 修改完后再進(jìn)行 ping 命令測(cè)試,看看是否能夠解析 www.mydlq.club 網(wǎng)址
$ ping www.mydlq.club
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=127 time=6.054 ms
64 bytes from 39.156.66.18: seq=1 ttl=127 time=4.678 ms
## 退出 DNSutils Pod 命令行
$ exit
## 觀察 CoreDNS 日志信息,查看有無(wú)域名解析相關(guān)日志
$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name);
do kubectl logs --namespace=kube-system $p; done
.:53
[INFO] plugin/reload: Running configuration MD5 = 6434d0912b39645ed0707a3569fd69dc
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] 127.0.0.1:47278 - 55171 "HINFO IN 4940754309314083739.5160468069505858354. udp 57 false 512" NXDOMAIN qr,rd,ra 57 0.040844011s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
[INFO] 10.244.1.162:40261 - 21083 "AAAA IN www.mydlq.club.kube-system.svc.cluster.local. udp 62 false 512" NXDOMAIN qr,aa,rd 155 0.000398875s
[INFO] 10.244.1.162:40261 - 20812 "A IN www.mydlq.club.kube-system.svc.cluster.local. udp 62 false 512" NXDOMAIN qr,aa,rd 155 0.000505793s
[INFO] 10.244.1.162:55066 - 53460 "AAAA IN www.mydlq.club.svc.cluster.local. udp 50 false 512" NXDOMAIN qr,aa,rd 143 0.000215384s
[INFO] 10.244.1.162:55066 - 53239 "A IN www.mydlq.club.svc.cluster.local. udp 50 false 512" NXDOMAIN qr,aa,rd 143 0.000267642s
.:53
[INFO] plugin/reload: Running configuration MD5 = 6434d0912b39645ed0707a3569fd69dc
CoreDNS-1.6.7
linux/amd64, go1.13.6, da7f65b
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
[INFO] 127.0.0.1:32896 - 49064 "HINFO IN 1027842207973621585.7098421666386159336. udp 57 false 512" NXDOMAIN qr,rd,ra 57 0.044098742s
[INFO] plugin/reload: Running configuration MD5 = a4809ab99f6713c362194263016e6fac
[INFO] Reloading complete
[INFO] 10.244.1.162:40261 - 21083 "AAAA IN www.mydlq.club.kube-system.svc.cluster.local. udp 62 false 512" NXDOMAIN qr,aa,rd 155 0.000217299s
[INFO] 10.244.1.162:40261 - 20812 "A IN www.mydlq.club.kube-system.svc.cluster.local. udp 62 false 512" NXDOMAIN qr,aa,rd 155 0.000264552s
[INFO] 10.244.1.162:55066 - 53460 "AAAA IN www.mydlq.club.svc.cluster.local. udp 50 false 512" NXDOMAIN qr,aa,rd 143 0.000144795s
[INFO] 10.244.1.162:55066 - 53239 "A IN www.mydlq.club.svc.cluster.local. udp 50 false 512" NXDOMAIN qr,aa,rd 143 0.000221163s
經(jīng)過(guò)上面兩個(gè)測(cè)試,已經(jīng)可以得知,如果
Pod DNS
配置中直接修改
DNS
服務(wù)器地址為
CoreDNS Pod
的
IP
地址,
DNS
解析確實(shí)沒(méi)有問(wèn)題,能夠正常解析。不過(guò),正常的情況下 Pod 中 DNS 配置的服務(wù)器地址一般是 CoreDNS 的 Service 地址,不直接綁定 Pod IP(因?yàn)?Pod 每次重啟 IP 都會(huì)發(fā)生變化)。 所以問(wèn)題找到了,正是在 Pod 向 CoreDNS 的 Service "kube-dns" 進(jìn)行域名解析請(qǐng)求轉(zhuǎn)發(fā)時(shí),出現(xiàn)了問(wèn)題,一般
Service
的問(wèn)題都跟
Kube-proxy
組件有關(guān),接下來(lái)觀察該組件是否存在問(wèn)題。
7、分析 Kube-Proxy 是否存在問(wèn)題
觀察 Kube-proxy 的日志,查看是否存在問(wèn)題:
## 查看 kube-proxy Pod 列表
$ kubectl get pods -n kube-system | grep kube-proxy
kube-proxy-6kdj2 1/1 Running 3 9h
kube-proxy-lw2q6 1/1 Running 3 9h
kube-proxy-mftlt 1/1 Running 3 9h
## 選擇一個(gè) kube-proxy Pod,查看最后 5 條日志內(nèi)容
$ kubectl logs kube-proxy-6kdj2 --tail=5 -n kube-system
E0326 15:20:23.159364 1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]
E0326 15:20:23.159388 1 proxier.go:1192] Failed to sync endpoint for service: 10.8.0.10:53/UPD, err: parseIP Error ip=[10 96 0 16 0 0 0 0 0 0 0 0 0 0 0 0]
E0326 15:20:23.159479 1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]
E0326 15:20:23.159501 1 proxier.go:1192] Failed to sync endpoint for service: 10.8.0.10:53/TCP, err: parseIP Error ip=[10 96 0 16 0 0 0 0 0 0 0 0 0 0 0 0]
E0326 15:20:23.159595 1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]
通過(guò) kube-proxy Pod 的日志可以看到,里面有很多 Error 級(jí)別的日志信息,根據(jù)關(guān)鍵字
IPVS
、
parseIP Error
可知,可能是由于 IPVS 模塊對(duì) IP 進(jìn)行格式化導(dǎo)致出現(xiàn)問(wèn)題。
因?yàn)檫@個(gè)問(wèn)題是升級(jí)到 kubernetes 1.18 版本才出現(xiàn)的,所以去 Kubernetes Github 查看相關(guān) issues,發(fā)現(xiàn)有人在升級(jí) Kubernetes 版本到 1.18 后,也遇見(jiàn)了相同的問(wèn)題,經(jīng)過(guò) issue 中 Kubernetes 維護(hù)人員討論,分析出原因可能為新版 Kubernetes 使用的 IPVS 模塊是比較新的,需要系統(tǒng)內(nèi)核版本支持,本人使用的是 CentOS 系統(tǒng),內(nèi)核版本為 3.10,里面的 IPVS 模塊比較老舊,缺少新版 Kubernetes IPVS 所需的依賴。
根據(jù)該 issue 討論結(jié)果,解決該問(wèn)題的辦法是,更新內(nèi)核為新的版本。
注:該 issues 地址為 https://github.com/kubernetes/kubernetes/issues/89520
四、解決問(wèn)題
1、升級(jí)系統(tǒng)內(nèi)核版本
升級(jí) Kubernetes 集群各個(gè)節(jié)點(diǎn)的 CentOS 系統(tǒng)內(nèi)核版本:
## 載入公鑰
$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
## 安裝 ELRepo 最新版本
$ yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
## 列出可以使用的 kernel 包版本
$ yum list available --disablerepo=* --enablerepo=elrepo-kernel
## 安裝指定的 kernel 版本:
$ yum install -y kernel-lt-4.4.218-1.el7.elrepo --enablerepo=elrepo-kernel
## 查看系統(tǒng)可用內(nèi)核
$ cat /boot/grub2/grub.cfg | grep menuentry
menuentry 'CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)' --class centos (略)
menuentry 'CentOS Linux (4.4.218-1.el7.elrepo.x86_64) 7 (Core)' --class centos ...(略)
## 設(shè)置開(kāi)機(jī)從新內(nèi)核啟動(dòng)
$ grub2-set-default "CentOS Linux (4.4.218-1.el7.elrepo.x86_64) 7 (Core)"
## 查看內(nèi)核啟動(dòng)項(xiàng)
$ grub2-editenv list
saved_entry=CentOS Linux (4.4.218-1.el7.elrepo.x86_64) 7 (Core)
重啟系統(tǒng)使內(nèi)核生效:
$ reboot
啟動(dòng)完成查看內(nèi)核版本是否更新:
$ uname -r
4.4.218-1.el7.elrepo.x86_64
2、測(cè)試 Pod 中 DNS 是否能夠正常解析
進(jìn)入 Pod 內(nèi)部使用 ping 命令測(cè)試 DNS 是否能正常解析:
## 進(jìn)入 dnsutils Pod 內(nèi)部 sh 命令行
$ kubectl exec -it dnsutils /bin/sh -n kube-system
## Ping 集群外部,例如這里 ping 一下百度
$ ping www.baidu.com
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=1 ttl=127 time=7.20 ms
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=2 ttl=127 time=6.60 ms
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=3 ttl=127 time=6.38 ms
## Ping 集群內(nèi)部 kube-api 的 Service 地址
$ ping kubernetes.default
64 bytes from kubernetes.default.svc.cluster.local (10.96.0.1): icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from kubernetes.default.svc.cluster.local (10.96.0.1): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from kubernetes.default.svc.cluster.local (10.96.0.1): icmp_seq=3 ttl=64 time=0.064 ms
可以看到 Pod 中的域名解析已經(jīng)恢復(fù)正常。
pod ping 不通node
環(huán)境說(shuō)明
pod ---> router--->svc---redis pod
namesapce 1 的pod 訪問(wèn)不了router 訪問(wèn)拒絕
原因: apiserver 重啟導(dǎo)致sdn重啟,防火墻策略沒(méi)有生效,重啟防火墻后解決