出了问题别急,照着下面一步步来,全程复制粘贴即可。

第 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 重启不会把你的改动冲掉。

标签: none

添加新评论