尽管 PodCIDR 在节点上可用,但 Kube-Flannel 无法获得 CIDR

roo*_*oot 5 kubernetes flannel kubeadm

目前我正在 1 Master 2 Node 环境中设置 Kubernetes。

我成功地初始化了 Master 并将节点添加到了集群中

kubectl 获取节点

当我将节点加入集群时,kube-proxy pod 成功启动,但 kube-flannel pod 出现错误并遇到 CrashLoopBackOff。

法兰绒pod.log:

I0613 09:03:36.820387       1 main.go:475] Determining IP address of default interface,
I0613 09:03:36.821180       1 main.go:488] Using interface with name ens160 and address 172.17.11.2,
I0613 09:03:36.821233       1 main.go:505] Defaulting external address to interface address (172.17.11.2),
I0613 09:03:37.015163       1 kube.go:131] Waiting 10m0s for node controller to sync,
I0613 09:03:37.015436       1 kube.go:294] Starting kube subnet manager,
I0613 09:03:38.015675       1 kube.go:138] Node controller sync successful,
I0613 09:03:38.015767       1 main.go:235] Created subnet manager: Kubernetes Subnet Manager - caasfaasslave1.XXXXXX.local,
I0613 09:03:38.015828       1 main.go:238] Installing signal handlers,
I0613 09:03:38.016109       1 main.go:353] Found network config - Backend type: vxlan,
I0613 09:03:38.016281       1 vxlan.go:120] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false,
E0613 09:03:38.016872       1 main.go:280] Error registering network: failed to acquire lease: node "caasfaasslave1.XXXXXX.local" pod cidr not assigned,
I0613 09:03:38.016966       1 main.go:333] Stopping shutdownHandler...,
Run Code Online (Sandbox Code Playgroud)

在节点上,我可以验证 PodCDIR 是否可用:

kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
172.17.12.0/24
Run Code Online (Sandbox Code Playgroud)

在 Masters kube-controller-manager 上,pod cidr 也在那里

[root@caasfaasmaster manifests]# cat kube-controller-manager.yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ""
  creationTimestamp: null
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-controller-manager
    - --leader-elect=true
    - --controllers=*,bootstrapsigner,tokencleaner
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --address=127.0.0.1
    - --use-service-account-credentials=true
    - --kubeconfig=/etc/kubernetes/controller-manager.conf
    - --root-ca-file=/etc/kubernetes/pki/ca.crt
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --allocate-node-cidrs=true
    - --cluster-cidr=172.17.12.0/24
    - --node-cidr-mask-size=24
    env:
    - name: http_proxy
      value: http://ntlmproxy.XXXXXX.local:3154
    - name: https_proxy
      value: http://ntlmproxy.XXXXXX.local:3154
    - name: no_proxy
      value: .XXXXX.local,172.17.11.0/24,172.17.12.0/24
    image: k8s.gcr.io/kube-controller-manager-amd64:v1.10.4
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10252
        scheme: HTTP
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: kube-controller-manager
    resources:
      requests:
        cpu: 200m
    volumeMounts:
    - mountPath: /etc/kubernetes/pki
      name: k8s-certs
      readOnly: true
    - mountPath: /etc/ssl/certs
      name: ca-certs
      readOnly: true
    - mountPath: /etc/kubernetes/controller-manager.conf
      name: kubeconfig
      readOnly: true
    - mountPath: /etc/pki
      name: ca-certs-etc-pki
      readOnly: true
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/pki
      type: DirectoryOrCreate
    name: ca-certs-etc-pki
  - hostPath:
      path: /etc/kubernetes/pki
      type: DirectoryOrCreate
    name: k8s-certs
  - hostPath:
      path: /etc/ssl/certs
      type: DirectoryOrCreate
    name: ca-certs
  - hostPath:
      path: /etc/kubernetes/controller-manager.conf
      type: FileOrCreate
    name: kubeconfig
status: {}
Run Code Online (Sandbox Code Playgroud)

XXXXX 用于匿名化

我使用以下 kubeadm comman 初始化了 master(也没有任何错误)

kubeadm init --pod-network-cidr=172.17.12.0/24 --service- 
cidr=172.17.11.129/25 --service-dns-domain=dcs.XXXXX.local
Run Code Online (Sandbox Code Playgroud)

有谁知道什么可能导致我的问题以及如何解决它们?

NAMESPACE     NAME                                                  READY     STATUS             RESTARTS   AGE       IP            NODE
kube-system   etcd-caasfaasmaster.XXXXXX.local                      1/1       Running            0          16h       172.17.11.1   caasfaasmaster.XXXXXX.local
kube-system   kube-apiserver-caasfaasmaster.XXXXXX.local            1/1       Running            1          16h       172.17.11.1   caasfaasmaster.XXXXXX.local
kube-system   kube-controller-manager-caasfaasmaster.XXXXXX.local   1/1       Running            0          16h       172.17.11.1   caasfaasmaster.XXXXXX.local
kube-system   kube-dns-75c5968bf9-qfh96                             3/3       Running            0          16h       172.17.12.2   caasfaasmaster.XXXXXX.local
kube-system   kube-flannel-ds-4b6kf                                 0/1       CrashLoopBackOff   205        16h       172.17.11.2   caasfaasslave1.XXXXXX.local
kube-system   kube-flannel-ds-j2fz6                                 0/1       CrashLoopBackOff   191        16h       172.17.11.3   caasfassslave2.XXXXXX.local
kube-system   kube-flannel-ds-qjd89                                 1/1       Running            0          16h       172.17.11.1   caasfaasmaster.XXXXXX.local
kube-system   kube-proxy-h4z54                                      1/1       Running            0          16h       172.17.11.3   caasfassslave2.XXXXXX.local
kube-system   kube-proxy-sjwl2                                      1/1       Running            0          16h       172.17.11.2   caasfaasslave1.XXXXXX.local
kube-system   kube-proxy-zc5xh                                      1/1       Running            0          16h       172.17.11.1   caasfaasmaster.XXXXXX.local
kube-system   kube-scheduler-caasfaasmaster.XXXXXX.local            1/1       Running            0          16h       172.17.11.1   caasfaasmaster.XXXXXX.local
Run Code Online (Sandbox Code Playgroud)

Pan*_*nde 11

未能获得租约只是意味着,pod 没有获得 podCIDR。尽管主节点上的清单显示 podCIDR 为真,但我也发生了这种情况,但它仍然无法正常工作并且漏斗进入崩溃回送。这就是我为修复它所做的。

从主节点,首先找出你的漏斗 CIDR

sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep -i cluster-cidr
Run Code Online (Sandbox Code Playgroud)

输出:

- --cluster-cidr=172.168.10.0/24
Run Code Online (Sandbox Code Playgroud)

然后从主节点运行以下命令:

kubectl patch node slave-node-1 -p '{"spec":{"podCIDR":"172.168.10.0/24"}}'
Run Code Online (Sandbox Code Playgroud)

其中,slave-node-1 是获取租约失败的节点 podCIDR 是您在上一个命令中找到的 cidr

希望这可以帮助。


VAS*_*VAS 4

根据法兰绒文档

至少,您必须告诉 flannel 它应该用于覆盖的 IP 范围(子网)。以下是最小 flannel 配置的示例:

{ "Network": "10.1.0.0/16" }
Run Code Online (Sandbox Code Playgroud)

因此,您需要为 Pod 指定一个最小大小为 的网络/16,并且它不应该是现有网络的一部分,因为 Flannel 使用封装将不同节点上的 Pod 连接到一个覆盖网络。

这是描述它的文档部分:

使用 Docker,每个容器都会分配一个 IP 地址,可用于与同一主机上的其他容器进行通信。为了通过网络进行通信,容器与主机的 IP 地址绑定,并且必须依赖端口映射来到达所需的容器。这使得在容器内运行的应用程序很难公布其外部 IP 和端口,因为这些信息对它们不可用。

flannel 通过为每个容器提供一个可用于容器到容器通信的 IP 来解决这个问题。它使用数据包封装来创建跨越整个集群的虚拟覆盖网络。更具体地说,flannel 为每个主机提供一个 IP 子网(默认为 /24),Docker 守护进程能够从中将 IP 分配给各个容器。

换句话说,您应该使用如下设置重新创建集群:

kubeadm init --pod-network-cidr=10.17.0.0/16 --service-cidr=10.18.0.0/24 --service-dns-domain=dcs.XXXXX.local
Run Code Online (Sandbox Code Playgroud)