CentOS 8部署microk8s coredns/calico组件启动失败解决方法
问题根因
CentOS 8默认的系统安全、网络规则和Ubuntu默认配置差异较大,是该故障的核心诱因,对应报错逻辑链如下:
- calico-kube-controllers抛出
clusterinformations.crd.projectcalico.org "default" not found错误,本质是Calico初始化阶段CRD资源未正确注入,叠加系统防火墙拦截Calico的BGP、VXLAN通信流量,导致网络插件启动流程中断 - coredns报就绪探针503、8181端口连接拒绝,是CNI网络未就绪的连锁反应:网络插件未正常运行时,Pod无法分配可用集群IP,coredns无法完成集群内服务端点同步,自然无法通过健康检查
- 日志中的MissingClusterDNS报错同样是calico异常的衍生问题,网络插件恢复后该报错会自动消失
另外CentOS 8默认使用nftables作为防火墙后端,microk8s 1.2x之前版本内置的Calico v3.13对nftables兼容性较差,也是触发初始化失败的常见原因。
分步修复方案
1. 配置CentOS 8系统前置环境
所有操作使用root权限执行:
- 调整SELinux策略,避免安全模块拦截容器网络操作
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 配置防火墙规则,生产环境可选择放通所需端口,测试/内网环境可直接关闭firewalld
# 测试环境直接关闭firewalld systemctl stop firewalld systemctl disable firewalld # 生产环境保留firewalld则执行以下规则放通 # firewall-cmd --permanent --add-port=179/tcp # Calico BGP # firewall-cmd --permanent --add-port=4789/udp # Calico VXLAN # firewall-cmd --permanent --add-port=5473/tcp # Calico Typha # firewall-cmd --permanent --add-port=6443/tcp # K8s API # firewall-cmd --add-masquerade --permanent # firewall-cmd --reload
- 关闭交换分区(K8s系列发行版强制要求)
swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- 切换iptables到legacy模式,解决Calico和nftables的兼容性问题
update-alternatives --set iptables /usr/sbin/iptables-legacy update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
- 加载容器网络所需内核模块,配置开机自动加载
modprobe br_netfilter modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh modprobe nf_conntrack cat > /etc/modules-load.d/calico.conf <<EOF br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF # 配置内核网络转发参数 cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system
2. 重置异常组件状态
# 停止microk8s服务 microk8s stop # 清理残留的Calico异常配置 rm -rf /var/snap/microk8s/common/var/lib/cni/calico rm -rf /var/snap/microk8s/current/var/run/calico # 启动服务后强制重建calico和dns组件 microk8s start microk8s disable dns microk8s disable calico microk8s enable calico microk8s enable dns
3. 极端场景手动补全Calico CRD资源
等待3分钟后执行microk8s kubectl get pods -n kube-system查看状态,如果calico-kube-controllers仍然报ClusterInformation不存在的错误,手动创建缺失资源:
microk8s kubectl apply -f - <<EOF apiVersion: crd.projectcalico.org/v1 kind: ClusterInformation metadata: name: default spec: calicoVersion: v3.13.2 clusterGUID: microk8s-default-cluster clusterType: k8s,bgp datastoreReady: true EOF
验证结果
等待2-3分钟组件重建完成后,再次查看kube-system命名空间下Pod状态,coredns、calico-node、calico-kube-controllers三个核心组件都会变为1/1 Running状态,无重启、探针失败报错。
内容的提问来源于stack exchange,提问作者sercanezelhan
相关产品推荐
相关产品推荐

