【问题标题】:Kube-Flannel cant get CIDR although PodCIDR available on node尽管 PodCIDR 在节点上可用,但 Kube-Flannel 无法获取 CIDR
【发布时间】:2018-11-22 19:44:09
【问题描述】:

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

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

kubectl get nodes

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

flannel-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...,

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

kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
172.17.12.0/24

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: {}

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

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

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

【问题讨论】:

    标签: kubernetes kubeadm flannel


    【解决方案1】:

    获取租约失败只是意味着,该 pod 没有获得 podCIDR。尽管主节点上的清单显示 podCIDR 为 true,但我也发生了这种情况,但它仍然无法正常工作,并且漏斗进入 crashbackloop。 这就是我为解决它所做的。

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

    sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep -i cluster-cidr
    

    输出:

    - --cluster-cidr=172.168.10.0/24
    

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

    kubectl patch node slave-node-1 -p '{"spec":{"podCIDR":"172.168.10.0/24"}}'
    

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

    希望这会有所帮助。

    【讨论】:

    • 我已经在初始化期间定义了我的集群网络 cidr,所以接受的答案对我不起作用。我应用了这个补丁,不久之后我的法兰绒豆荚就立起来了。谢谢。
    • 自从我使用 sudo kubeadm init --pod-network-cidr=172.31.0.0/24 创建集群后,所有节点上的 flannel pod 都失败了。我已经修补了所有节点(命令需要在 master 上运行)kubectl patch node <node-N> -p '{"spec":{"podCIDR":"172.31.10.0/24"}}' 并删除了 Creashed pod 以使 flannel pod 回到运行状态。
    【解决方案2】:

    据法兰绒documentation

    至少,您必须告诉 flannel 一个 IP 范围(子网) 它应该用于覆盖。这是一个最小值的例子 法兰绒配置:

    { "Network": "10.1.0.0/16" }
    

    因此,您需要为 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
    

    【讨论】:

    • 是的,我也想通了。基本上,我必须用配置文件初始化我的主人。在文件中,我将节点子网的范围指定为 /25。如果你想这样做要小心,因为配置选项是 alpha,你很容易遇到这个 github 问题。 github.com/kubernetes/kubeadm/issues/724 底线:不要更改默认参数,否则它会直接跳到你的脸上。
    • 如果您不想重新创建(初始化)整个集群,请按照以下回复中的建议修补所有节点。
    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2020-04-26
    • 2021-11-14
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多