前言
配置 calico
网络插件时,kubectl get node
报错: NoReady
kubectl describe node node
Name: node
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=node
kubernetes.io/os=linux
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /run/containerd/containerd.sock
node.alpha.kubernetes.io/ttl: 0
projectcalico.org/IPv4Address: 192.168.58.246/24
projectcalico.org/IPv4IPIPTunnelAddr: 10.244.167.128
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Mon, 22 Apr 2024 03:20:16 +0000
Taints: node.kubernetes.io/not-ready:NoExecute
node.kubernetes.io/not-ready:NoSchedule
Unschedulable: false
Lease:
HolderIdentity: node
AcquireTime: <unset>
RenewTime: Mon, 22 Apr 2024 05:36:58 +0000
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Mon, 22 Apr 2024 05:35:09 +0000 Mon, 22 Apr 2024 05:35:09 +0000 CalicoIsUp Calico is running on this node
MemoryPressure False Mon, 22 Apr 2024 05:33:18 +0000 Mon, 22 Apr 2024 03:20:16 +0000 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Mon, 22 Apr 2024 05:33:18 +0000 Mon, 22 Apr 2024 03:20:16 +0000 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Mon, 22 Apr 2024 05:33:18 +0000 Mon, 22 Apr 2024 03:20:16 +0000 KubeletHasSufficientPID kubelet has sufficient PID available
Ready False Mon, 22 Apr 2024 05:33:18 +0000 Mon, 22 Apr 2024 03:20:16 +0000 KubeletNotReady container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
故障原因
网络插件的网卡发现机制,修改 IP_AUTODETECTION_METHOD
对应的 value
值。
官方提供的 yaml
文件中, ip
识别策略(IPDETECTMETHOD)没有配置,即默认为 first-found
,这会导致一个网络异常的 ip
作为 nodeIP
被注册,从而影响 node-to-nodemesh
。
IP_AUTODETECTION_METHOD
配置项默认为 first-found
,这种模式中 calico
会使用第一获取到的有效网卡,虽然会排除 docker
网络,localhost
,但是在复杂网络环境下还是有出错的可能。在这次异常中 master
上的 calico
选择了一个非主网卡。
为了解决这种情况,IP_AUTODETECTION_METHOD
还提供了两种配置 can-reach=DESTINATION
,interface=INTERFACE-REGEX
。
can-reach=DESTINATION
配置可以理解为 calico
会从部署节点路由中获取到达目的 ip
或者域名的源 ip
地址。
interface=INTERFACE-REGEX
配置可以指定 calico
使用匹配的网卡上的第一个IP地址。列出网卡和IP地址的顺序取决于系统。匹配支持 goalong
的正则语法。
解决方法
修改配置文件 calico.yaml
的 CALICO_IPV4POOL_CIDR
、IP_AUTODETECTION_METHOD
配置项
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
namespace: kube-system
labels:
k8s-app: calico-node
spec:
...
containers:
...
env:
...
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
...
- name: IP_AUTODETECTION_METHOD
value: "can-reach=${DNS 服务器 IP 地址}"
去掉 CALICO_IPV4POOL_CIDR
注释(注意-要与其他项的-对齐,否则会报错),并配置 value
值,使其与 kubeadm
初始化集群中的 pod_network_cidr
配置项保持一致
增加 IP_AUTODETECTION_METHOD
配置项,value
值后面的网段配置为 DNS
服务器 IP
地址
-
CALICO_IPV4POOL_CIDR: 集群 Pod 的 IP 的 cidr 网段
-
CALICO_IPV4POOL_IPIP: 集群 Pod 之间的数据包路由模式
- IPIP 模式填写: "Always"
- Bgp 模式填写: "Off"
- 跨网段模式填写: "CrossSubnet" (跨网段模式即 IPIP-Bgp 混合模式: 同子网内路由采用 Bgp 模式,跨子网路由采用 IPIP 模式)
-
IP_AUTODETECTION_METHOD: calico 实例发现节点目标物理网卡的方法
- 不配置 IP_AUTODETECTION_METHOD:默认使用"first-found"寻找节点物理网卡方法,即寻找到第一个网卡设定为节点的目标物理网卡
- "interface=${正则表达式}": 使用正则表达式寻找节点的目标物理网卡
- "can-reach=${DNS 服务器 IP 地址}": 使用 ping 通 DNS 服务器 IP 的方法寻找节点的目标物理网卡
- "cidr=${物理网卡 IP 所在的 CIDR 网段}": 使用 CIDR 的网段匹配方法寻找节点的目标物理网卡
然后重新执行 kubectl apply -f calico.yaml
kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2d18h v1.28.2
node Ready <none> 137m v1.28.2
解决完成!
标签:node,Container,22,IP,网卡,报错,Mon,ready,0000 From: https://www.cnblogs.com/niuben/p/18150524