본문 바로가기

개발하자

Kubernetes Calico 노드 'XXXXXXXXXX'이(가) 이미 IPv4 주소 XXXXXXX를 사용하고 있습니다. 충돌 루프백오프

반응형

Kubernetes Calico 노드 'XXXXXXXXXX'이(가) 이미 IPv4 주소 XXXXXXX를 사용하고 있습니다. 충돌 루프백오프

AWS Kubernetes Quickstart를 사용하여 VPC와 개인 서브넷에 Kubernetes 클러스터를 만들었습니다. 한동안은 잘 돌아가고 있었다. 내 쿠버네티스 클러스터에 칼리코를 설치했어. 나는 두 개의 노드와 마스터가 있다. 마스터의 칼리코 포드는 정상적으로 실행되고 노드의 칼리코 포드는 crashloopbackoff 상태입니다:

NAME                                                               READY     STATUS             RESTARTS   AGE
calico-etcd-ztwjj                                                  1/1       Running            1          55d
calico-kube-controllers-685755779f-ftm92                           1/1       Running            2          55d
calico-node-gkjgl                                                  1/2       CrashLoopBackOff   270        22h
calico-node-jxkvx                                                  2/2       Running            4          55d
calico-node-mxhc5                                                  1/2       CrashLoopBackOff   9          25m

충돌한 포드 중 하나 설명:

ubuntu@ip-10-0-1-133:~$ kubectl describe pod calico-node-gkjgl -n kube-system
Name:           calico-node-gkjgl
Namespace:      kube-system
Node:           ip-10-0-0-237.us-east-2.compute.internal/10.0.0.237
Start Time:     Mon, 17 Sep 2018 16:56:41 +0000
Labels:         controller-revision-hash=185957727
                k8s-app=calico-node
                pod-template-generation=1
Annotations:    scheduler.alpha.kubernetes.io/critical-pod=
Status:         Running
IP:             10.0.0.237
Controlled By:  DaemonSet/calico-node
Containers:
  calico-node:
    Container ID:   docker://d89979ba963c33470139fd2093a5427b13c6d44f4c6bb546c9acdb1a63cd4f28
    Image:          quay.io/calico/node:v3.1.1
    Image ID:       docker-pullable://quay.io/calico/node@sha256:19fdccdd4a90c4eb0301b280b50389a56e737e2349828d06c7ab397311638d29
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Tue, 18 Sep 2018 15:14:44 +0000
      Finished:     Tue, 18 Sep 2018 15:14:44 +0000
    Ready:          False
    Restart Count:  270
    Requests:
      cpu:      250m
    Liveness:   http-get http://:9099/liveness delay=10s timeout=1s period=10s #success=1 #failure=6
    Readiness:  http-get http://:9099/readiness delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:
      ETCD_ENDPOINTS:                     <set to the key 'etcd_endpoints' of config map 'calico-config'>  Optional: false
      CALICO_NETWORKING_BACKEND:          <set to the key 'calico_backend' of config map 'calico-config'>  Optional: false
      CLUSTER_TYPE:                       kubeadm,bgp
      CALICO_DISABLE_FILE_LOGGING:        true
      CALICO_K8S_NODE_REF:                 (v1:spec.nodeName)
      FELIX_DEFAULTENDPOINTTOHOSTACTION:  ACCEPT
      CALICO_IPV4POOL_CIDR:               192.168.0.0/16
      CALICO_IPV4POOL_IPIP:               Always
      FELIX_IPV6SUPPORT:                  false
      FELIX_IPINIPMTU:                    1440
      FELIX_LOGSEVERITYSCREEN:            info
      IP:                                 autodetect
      FELIX_HEALTHENABLED:                true
    Mounts:
      /lib/modules from lib-modules (ro)
      /var/lib/calico from var-lib-calico (rw)
      /var/run/calico from var-run-calico (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from calico-cni-plugin-token-b7sfl (ro)
  install-cni:
    Container ID:  docker://b37e0ec7eba690473a4999a31d9f766f7adfa65f800a7b2dc8e23ead7520252d
    Image:         quay.io/calico/cni:v3.1.1
    Image ID:      docker-pullable://quay.io/calico/cni@sha256:dc345458d136ad9b4d01864705895e26692d2356de5c96197abff0030bf033eb
    Port:          <none>
    Host Port:     <none>
    Command:
      /install-cni.sh
    State:          Running
      Started:      Mon, 17 Sep 2018 17:11:52 +0000
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 17 Sep 2018 16:56:43 +0000
      Finished:     Mon, 17 Sep 2018 17:10:53 +0000
    Ready:          True
    Restart Count:  1
    Environment:
      CNI_CONF_NAME:       10-calico.conflist
      ETCD_ENDPOINTS:      <set to the key 'etcd_endpoints' of config map 'calico-config'>      Optional: false
      CNI_NETWORK_CONFIG:  <set to the key 'cni_network_config' of config map 'calico-config'>  Optional: false
    Mounts:
      /host/etc/cni/net.d from cni-net-dir (rw)
      /host/opt/cni/bin from cni-bin-dir (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from calico-cni-plugin-token-b7sfl (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          False
  PodScheduled   True
Volumes:
  lib-modules:
    Type:          HostPath (bare host directory volume)
    Path:          /lib/modules
    HostPathType:
  var-run-calico:
    Type:          HostPath (bare host directory volume)
    Path:          /var/run/calico
    HostPathType:
  var-lib-calico:
    Type:          HostPath (bare host directory volume)
    Path:          /var/lib/calico
    HostPathType:
  cni-bin-dir:
    Type:          HostPath (bare host directory volume)
    Path:          /opt/cni/bin
    HostPathType:
  cni-net-dir:
    Type:          HostPath (bare host directory volume)
    Path:          /etc/cni/net.d
    HostPathType:
  calico-cni-plugin-token-b7sfl:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  calico-cni-plugin-token-b7sfl
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     :NoSchedule
                 :NoExecute
                 :NoSchedule
                 :NoExecute
                 CriticalAddonsOnly
                 node.kubernetes.io/disk-pressure:NoSchedule
                 node.kubernetes.io/memory-pressure:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute
                 node.kubernetes.io/unreachable:NoExecute
Events:
  Type     Reason   Age                  From                                               Message
  ----     ------   ----                 ----                                               -------
  Warning  BackOff  4m (x6072 over 22h)  kubelet, ip-10-0-0-237.us-east-2.compute.internal  Back-off restarting failed container

동일한 포드에 대한 로그:

ubuntu@ip-10-0-1-133:~$ kubectl logs calico-node-gkjgl -n kube-system -c calico-node
2018-09-18 15:14:44.605 [INFO][8] startup.go 251: Early log level set to info
2018-09-18 15:14:44.605 [INFO][8] startup.go 269: Using stored node name from /var/lib/calico/nodename
2018-09-18 15:14:44.605 [INFO][8] startup.go 279: Determined node name: ip-10-0-0-237.us-east-2.compute.internal
2018-09-18 15:14:44.609 [INFO][8] startup.go 101: Skipping datastore connection test
2018-09-18 15:14:44.610 [INFO][8] startup.go 352: Building new node resource Name="ip-10-0-0-237.us-east-2.compute.internal"
2018-09-18 15:14:44.610 [INFO][8] startup.go 367: Initialize BGP data
2018-09-18 15:14:44.614 [INFO][8] startup.go 564: Using autodetected IPv4 address on interface ens3: 10.0.0.237/19
2018-09-18 15:14:44.614 [INFO][8] startup.go 432: Node IPv4 changed, will check for conflicts
2018-09-18 15:14:44.618 [WARNING][8] startup.go 861: Calico node 'ip-10-0-0-237' is already using the IPv4 address 10.0.0.237.
2018-09-18 15:14:44.618 [WARNING][8] startup.go 1058: Terminating
Calico node failed to start

따라서 노드 IP 주소를 찾는 데 충돌이 있거나 Calico는 IP가 이미 다른 노드에 할당되어 있다고 생각하는 것 같습니다. 빠른 검색을 통해 이 스레드를 찾았습니다. IP_AUTODETECTION_MODE를 can-reach=DESTINATION으로 설정하여 이 문제를 해결해야 한다는 것을 알았습니다. 이 경우 "can-reach=10.0.237"이 될 것으로 예상합니다. 이 구성은 calico/node 컨테이너에 설정된 환경 변수입니다. 나는 컨테이너 자체에 포격을 시도해 왔지만, 쿠벡틀은 컨테이너를 찾을 수 없다고 말했다:

ubuntu@ip-10-0-1-133:~$ kubectl exec calico-node-gkjgl --stdin --tty /bin/sh -c calico-node -n kube-system
error: unable to upgrade connection: container not found ("calico-node")

칼리코가 IP를 할당할 수 없어서 그런 것 같아요. 그래서 호스트에 로그온하고 도커를 사용하여 컨테이너에서 셸링을 시도했습니다:

root@ip-10-0-0-237:~# docker exec -it k8s_POD_calico-node-gkjgl_kube-system_a6998e98-ba9a-11e8-a9fa-0a97f5a48ef4_1 /bin/bash
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory"

그래서 나는 컨테이너에 실행할 셸이 없다고 생각한다. 왜 쿠버네티스가 그걸 실행하지 못했는지 이해가 되네요. 외부에서 명령을 실행하여 환경 변수를 나열하려고 했지만 찾을 수 없었습니다. 그러나 다음 명령을 잘못 실행했을 수 있습니다:

root@ip-10-0-0-237:~# docker inspect -f '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' k8s_POD_calico-node-gkjgl_kube-system_a6998e98-ba9a-11e8-a9fa-0a97f5a48ef4_1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

root@ip-10-0-0-237:~# docker exec -it k8s_POD_calico-node-gkjgl_kube-system_a6998e98-ba9a-11e8-a9fa-0a97f5a48ef4_1 printenv IP_AUTODETECTION_METHOD
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"printenv\": executable file not found in $PATH"

root@ip-10-0-0-237:~# docker exec -it k8s_POD_calico-node-gkjgl_kube-system_a6998e98-ba9a-11e8-a9fa-0a97f5a48ef4_1 /bin/env
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"/bin/env\": stat /bin/env: no such file or directory"

좋아요, 그럼 제가 잘못된 방향으로 가고 있는 것 같아요. Kubernetes를 사용하여 Calico 구성 파일을 변경하고 다시 배포해야 합니까? 시스템 어디에서 찾을 수 있습니까? 나는 환경 변수를 어디에 설정해야 할지 찾지 못했다.




를 보면 이미 로 기본값이 설정되어 있습니다.

내 생각에 무언가 또는 IP 주소가 이전 calico의 'run'에 의해 공개되지 않거나 calico 버전의 버그일 것이다.

시도:

  1. 크래시백오프 루프에 있는 Calico 포드를 삭제합니다

    kubectl -n kube-system delete calico-node-gkjgl calico-node-mxhc5
    

    포드가 다시 생성되고 초기화됩니다.

  2. Calico를 최신 버전으로 업그레이드하십시오. 다음을 따르십시오. 헵티오의 Calico 설치에서 etcd 데이터스토어를 사용하고 있는 것 같습니다.

  3. Heptio의 AWS AMI가 어떻게 작동하는지 이해하고 문제가 있는지 확인하십시오. 이 작업은 시간이 걸릴 수 있으므로 지원팀에 문의할 수도 있습니다.

  4. 다른 방법으로 Calico를 사용하여 Kubernetes를 설치해 보십시오. 잘 문서화되어 있음




나에게 효과가 있었던 것은 노드에 남아있는 도커 네트워크를 제거하는 것이었다. 각 노드의 현재 네트워크를 나열한 다음 필요 없는 네트워크를 제거해야 했습니다. . 그렇게 한 후 calico 배포 포드가 정상적으로 실행되었습니다




나는 문제를 디버깅하고 해결한 후에 문제의 원인을 알아냈습니다. Kubernetes 외에도 클러스터에서 실행 중인 다른 서비스(예: 를 사용)가 있었습니다. 이로 인해 클러스터의 네트워크에 문제가 발생했습니다.

명령에 따라 도커에는 다음과 같은 네트워크가 있습니다:

NETWORK ID     NAME             DRIVER    SCOPE
39c36916cc71   bridge           bridge    local
b90b28ce31ec   docker_default   bridge    local
f045c30c679f   host             host      local
36aa4115b540   none             null      local

생성한 컨테이너를 제거한 다음 명령을 실행합니다. 내 경우 네트워크를 삭제하거나 제거할 네트워크를 알고 있으면 명령을 실행하여 제거할 수 있습니다


반응형