关于更换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-operatorPod 卡在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-node、calico-kube-controllers等组件。- 如果 operator 起不来,整个 Calico 安装流程会卡住。
2. 根本原因
- 恶性循环:
- CoreDNS 需要网络插件(如 Calico)提供 Pod 网络。
- Calico 安装需要
tigera-operator能解析 API Server。 tigera-operator依赖 CoreDNS 解析域名。- 如果两者都未就绪,系统会死锁。
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. 关键检查点
-
确认
tigera-operator日志:kubectl logs -n tigera-operator -l k8s-app=tigera-operator正常应看到:
Successfully created Calico APIServer -
检查 Calico 节点状态:
kubectl get pods -n calico-system -
验证 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 |
浙公网安备 33010602011771号