K3S CoreDNS 在大集群里出现超时处理
出了问题别急,照着下面一步步来,全程复制粘贴即可。
第 1 步:确认 master 节点的 label(10 秒)
kubectl get nodes -l role=master
能列出 3 台节点 → label 没问题,继续。列不出来,换成:
kubectl get nodes --show-labels | grep master
看实际 label 名是什么(可能是 node-role.kubernetes.io/master),后面命令里对应替换。
第 2 步:一条命令改好 CoreDNS
kubectl -n kube-system patch deploy coredns --type='json' -p='[
{"op": "replace", "path": "/spec/template/spec/nodeSelector", "value": {"kubernetes.io/os": "linux", "role": "master"}},
{"op": "add", "path": "/spec/template/spec/tolerations", "value": [{"key": "node-role.kubernetes.io/master", "operator": "Exists", "effect": "NoSchedule"}]}
]'
第 3 步:副本缩到 3,等待滚动完成
kubectl -n kube-system scale deploy coredns --replicas=3
kubectl -n kube-system rollout status deploy coredns
第 4 步:确认 pod 落在 3 台 master 上
kubectl -n kube-system get pods -l k8s-app=kube-dns -o wide
NODE 列应该显示 3 个 master 节点名,且全部 Running。
第 5 步:验证问题是否解决
进 media-server:
kubectl exec -n <namespace> -it <pod-name> -- sh
里面跑 30 连测:
for i in $(seq 30); do
nslookup <dst-service> 10.43.0.10 2>&1 | grep -E "Address:|can't" | tail -1
done | sort | uniq -c
- 30 次全是
Address: 10.43.201.125→ 修好了 - 还有
can't find→ 再排查
第 6 步(修好后做,防止复发):把改动写进 k3s 源文件
在每一台 master 上编辑:
vi /var/lib/rancher/k3s/server/manifests/coredns.yaml
找到 nodeSelector 改成:
nodeSelector:
kubernetes.io/os: linux
role: master
同级加上:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
保存。这样以后 k3s 重启不会把你的改动冲掉。