关于更换CNI插件的一些细节

CoreDNS 异常确实会间接影响 Calico 的安装,尤其是 tigera-operator 的启动。以下是具体的影响机制和解决方案:


1. CoreDNS 如何影响 Calico 安装?

(1) tigera-operator 依赖 DNS 解析

  • tigera-operator 在启动时需要访问 Kubernetes API Server(通常是 https://kubernetes.default.svc.cluster.local:443)。
  • 如果 CoreDNS 不正常,operator 无法解析该地址,导致初始化失败。
  • 表现:tigera-operator Pod 卡在 ContainerCreating 或不断重启,日志报错类似:
    Failed to create client: Get "https://kubernetes.default.svc.cluster.local:443": dial tcp: lookup kubernetes.default.svc.cluster.local on [::1]:53: read udp [::1]:XXXX->[::1]:53: read: connection refused
    

(2) Calico Pod 依赖 Operator

  • tigera-operator 负责创建和管理 calico-nodecalico-kube-controllers 等组件。
  • 如果 operator 起不来,整个 Calico 安装流程会卡住

2. 根本原因

  • 恶性循环
    1. CoreDNS 需要网络插件(如 Calico)提供 Pod 网络。
    2. Calico 安装需要 tigera-operator 能解析 API Server。
    3. tigera-operator 依赖 CoreDNS 解析域名。
    4. 如果两者都未就绪,系统会死锁

3. 解决方案(分步操作)

步骤 1:临时绕过 DNS 依赖

在安装 Calico 前,手动为 tigera-operator 指定 API Server 的 IP(避免依赖 DNS):

# 获取 API Server 的 ClusterIP
API_SERVER_IP=$(kubectl get svc kubernetes -n default -o jsonpath='{.spec.clusterIP}')

# 修改 Calico 安装文件,添加环境变量(示例片段)
env:
- name: KUBERNETES_SERVICE_HOST
  value: "${API_SERVER_IP}"  # 替换为实际 IP
- name: KUBERNETES_SERVICE_PORT
  value: "443"

步骤 2:优先修复 CoreDNS

如果 CoreDNS Pod 卡在 Terminating

# 强制删除(参考之前的方法)
kubectl delete pod -n kube-system coredns-xxxx --grace-period=0 --force

# 临时使用 HostNetwork 模式启动 CoreDNS(确保它能运行)
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: coredns
  namespace: kube-system
spec:
  template:
    spec:
      hostNetwork: true  # 使用主机网络,绕过 Calico 依赖
      containers:
      - name: coredns
        image: coredns/coredns:1.8.6
EOF

步骤 3:安装 Calico

# 使用修改后的 Calico 配置文件安装
kubectl apply -f calico.yaml

# 等待 tigera-operator 启动
kubectl get pods -n tigera-operator -w

步骤 4:恢复 CoreDNS 正常模式

Calico 运行后,重新部署 CoreDNS 为普通模式(非 HostNetwork):

kubectl delete ds -n kube-system coredns
kubectl apply -f coredns-normal.yaml  # 使用标准 DaemonSet 配置

4. 关键检查点

  1. 确认 tigera-operator 日志

    kubectl logs -n tigera-operator -l k8s-app=tigera-operator
    

    正常应看到:

    Successfully created Calico APIServer
    
  2. 检查 Calico 节点状态

    kubectl get pods -n calico-system
    
  3. 验证 DNS 解析

    kubectl run test-dns --image=busybox:1.28 --rm -it -- nslookup kubernetes.default
    

5. 预防措施

  • 在安装 CNI 前,临时使用 HostNetwork 模式运行 CoreDNS
  • 使用 kubeadm 时,可以通过以下命令跳过 DNS 检查:
    kubeadm init --skip-phases=addon/coredns
    

总结

问题根源 解决方案
tigera-operator 依赖 DNS 手动指定 API Server IP 或临时修复 CoreDNS
CoreDNS 依赖 CNI 临时使用 hostNetwork: true
死锁状态 分阶段安装:先 Calico,后恢复 CoreDNS
posted on 2025-06-12 09:13  Leo-Yide  阅读(76)  评论(0)    收藏  举报