1.问题:
Flannel的状态显示为CrashLoopBackOff 时
[root@master keepalived]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-bpqxg 0/1 CrashLoopBackOff 1 (14s ago) 60s
kube-flannel kube-flannel-ds-gt9m4 0/1 CrashLoopBackOff 1 (44s ago) 59s
kube-flannel kube-flannel-ds-lmnxz 0/1 CrashLoopBackOff 1 (44s ago) 59s
kube-flannel kube-flannel-ds-t2h2m 0/1 CrashLoopBackOff 1 (14s ago) 60s
kube-flannel kube-flannel-ds-vgsjq 0/1 CrashLoopBackOff 1 (54s ago) 59s
kube-system coredns-65c54cc984-5s2rc 0/1 ContainerCreating 0 3h43m
kube-system coredns-65c54cc984-gv9zv 0/1 ContainerCreating 0 3h43m
kube-system etcd-master 1/1 Running 14 3h43m
kube-system etcd-master2 1/1 Running 0 3h41m
kube-system etcd-master3 1/1 Running 0 3h35m
kube-system kube-apiserver-master 1/1 Running 0 3h43m
kube-system kube-apiserver-master2 1/1 Running 0 3h41m
kube-system kube-apiserver-master3 1/1 Running 0 3h35m
kube-system kube-controller-manager-master 1/1 Running 1 (3h41m ago) 3h43m
kube-system kube-controller-manager-master2 1/1 Running 0 3h41m
kube-system kube-controller-manager-master3 1/1 Running 0 3h35m
kube-system kube-proxy-26n24 1/1 Running 0 3h23m
kube-system kube-proxy-44mr4 1/1 Running 0 3h22m
kube-system kube-proxy-kg22m 1/1 Running 0 3h36m
kube-system kube-proxy-tj6nw 1/1 Running 0 3h43m
kube-system kube-proxy-xfmw9 1/1 Running 0 3h41m
kube-system kube-scheduler-master 1/1 Running 19 (3h41m ago) 3h43m
kube-system kube-scheduler-master2 1/1 Running 0 3h41m
kube-system kube-scheduler-master3 1/1 Running 0 3h35m
2. 查看 kube-flannel 日志
可以通过 kubectl logs 命令查看 kube-flannel 的日志,找出它为何处于 CrashLoopBackOff 状态。
kubectl logs <flannel-pod-name> -n kube-flannel
#将 <flannel-pod-name> 替换为实际的 kube-flannel Pod 名称,如 kube-flannel-ds-7qlgm。
从日志中可以看到,kube-flannel 出现了以下错误:
Error registering network: failed to acquire lease: subnet "10.244.0.0/16" specified in the flannel net config doesn't contain "172.16.4.0/24" PodCIDR of the "node1" node
这意味着 Flannel 的网络配置子网 10.244.0.0/16 与 node1 节点的 PodCIDR 172.16.4.0/24 不匹配。
3. 检查 Flannel ConfigMap 配置
确保 Flannel ConfigMap 的配置与集群的 PodCIDR 配置相匹配。可以使用以下命令查看 ConfigMap 的内容:
[root@master keepalived]# kubectl get configmap kube-flannel-cfg -n kube-flannel -o yaml
apiVersion: v1
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"cni-conf.json":"{\n \"name\": \"cbr0\",\n \"cniVersion\": \"0.3.1\",\n \"plugins\": [\n {\n \"type\": \"flannel\",\n \"delegate\": {\n \"hairpinMode\": true,\n \"isDefaultGateway\": true\n }\n },\n {\n \"type\": \"portmap\",\n \"capabilities\": {\n \"portMappings\": true\n }\n }\n ]\n}\n","net-conf.json":"{\n \"Network\": \"10.244.0.0/16\",\n \"EnableNFTables\": false,\n \"Backend\": {\n \"Type\": \"vxlan\"\n }\n}\n"},"kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app":"flannel","k8s-app":"flannel","tier":"node"},"name":"kube-flannel-cfg","namespace":"kube-flannel"}}
creationTimestamp: "2024-08-09T02:57:06Z"
labels:
app: flannel
k8s-app: flannel
tier: node
name: kube-flannel-cfg
namespace: kube-flannel
resourceVersion: "1964"
uid: 0b36f97e-7143-4966-9f73-c34aed3e6792
4.确认 PodCIDR 配置
确保集群中的 PodCIDR 配置与你的 Flannel Network 配置匹配。你可以在 Master 节点上查看 PodCIDR 配置:
[root@master keepalived]# kubectl get nodes -o yaml | grep podCIDR
podCIDR: 172.16.0.0/24
podCIDRs:
podCIDR: 172.16.1.0/24
podCIDRs:
podCIDR: 172.16.2.0/24
podCIDRs:
podCIDR: 172.16.4.0/24
podCIDRs:
podCIDR: 172.16.3.0/24
podCIDRs:
5. 更新 Flannel ConfigMap
编辑 kube-flannel-cfg ConfigMap:
kubectl edit configmap kube-flannel-cfg -n kube-flannel
将 net-conf.json 中的 Network 字段修改为 172.16.0.0/12(这包括了所有的 PodCIDR 范围):
{
"Network": "172.16.0.0/12",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
保存并退出编辑器。
6. 重新启动 Flannel DaemonSet
更新配置后,重新启动 Flannel DaemonSet 以应用更改:
[root@master keepalived]# kubectl rollout restart daemonset kube-flannel-ds -n kube-flannel
daemonset.apps/kube-flannel-ds restarted
7. 验证 Flannel Pods 状态
检查 Flannel Pods 的状态,确保它们已成功启动:
[root@master keepalived]# kubectl get pods -n kube-flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-2vmjl 1/1 Running 0 4s
kube-flannel-ds-6jjp5 1/1 Running 0 4s
kube-flannel-ds-785b7 1/1 Running 0 4s
kube-flannel-ds-846xc 1/1 Running 0 4s
kube-flannel-ds-98rxw 1/1 Running 0 4s