왜 컨테이너가 시작되지 않습니까?
다음 중 하나 이상의 문제가 있는 것을 볼 수 있습니다.
-
작업자 노드가 새 팟(Pod)을 작성할 수 없습니다. 팟(Pod)이 작업자 노드에 성공적으로 배치되지만 컨테이너가
ContainerCreating상태에서 멈춰 있습니다. -
ContainerCreating상태의 팟(Pod)에 대해oc describe pod <pod>을 실행하면 다음 이벤트 중 하나와 유사한 이벤트가 표시됩니다.Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "XXX": failed to request 1 IPv4 addresses. IPAM allocated only 0desc = failed to create pod network sandbox ... error adding container to network "k8s-pod-network": cannot allocate new block due to per host block limit -
다음 명령을 실행하면, 워커 노드에서 하나 이상의 ‘
calico-node’ 포드가 시작에 실패하여 ‘CrashLoopBackOff’ 상태가 됩니다.oc logs -n calico-system <calico-node_pod>로그의 마지막 줄에는 다음과 같은 메시지가 포함되어 있습니다:
Unable to autoassign an address - pools are likely exhausted. type="ipipTunnelAddress"
증상에 나열된 IP 주소 관련 메시지가 표시되지 않는 경우에는 레지스트리 할당량에 도달하여 컨테이너가 시작되지 않는 것일 수 있습니다.
증상에 나열된 IP 주소 관련 메시지가 표시되는 경우에는 Calico 플러그인에 대한 IP 주소 관리자(IPAM)에서 클러스터에 있는 모든 팟(Pod) IP 주소가 사용 중이라고 잘못 감지하여 컨테이너가 시작되지 않는 것일 수 있습니다. Calico IPAM이 사용 가능한 IP 주소를 감지하지 못하여 클러스터에 있는 새 팟(Pod)에 IP 주소를 지정하지 않고, 따라서 팟(Pod)을 시작할 수 없는 것입니다.
레지스트리 할당량 문제 해결
가상 사설 클라우드 클래식 인프라
레지스트리 할당량 문제를 해결하려면 IBM Cloud Container Registry의 스토리지를 비우십시오.
IP 주소 문제 해결
가상 사설 클라우드 클래식 인프라
IP 주소 문제를 해결하려면 Calico IPAM 레코드에서 완전히 제거되지 않은 개별 IP 주소 및 IP 주소 블록을 해제하여 클러스터에 있는 팟(Pod)에서 재사용할 수 있도록 하십시오.
클러스터는 지원되는 버전을 실행해야 합니다. 클러스터에서 더 이상 사용되지 않거나 지원되지 않는 버전을 실행 중인 경우, 먼저 클러스터를 업데이트하십시오.
1단계: 개별 IP 주소 해제
먼저 Calico IPAM 레코드에서 완전히 제거되지 않은 개별 IP 주소를 확인하고 해제하여 클러스터에 있는 팟(Pod)에서 재사용할 수 있도록 하십시오.
-
Calico CLI 설치 및 구성의 단계에 따라
calicoctl클라이언트의 버전 3.18 이상을 다운로드하고, 클러스터에 대해 올바른 Calico 구성을 사용하고, 대상 클러스터에 대해 Calico 구성이 올바르게 작동하고 있는지 확인하십시오. 클러스터에서 구버전의 Calico 를 실행 중이라 하더라도,calicoctl버전 3.18 을 사용하여 다음 단계의 명령을 실행할 수 있습니다. -
Calico IPAM에서 사용 중인 것으로 잘못 감지한 IP 주소의 유무를 확인하십시오.
calicoctl ipam check -
출력에서 행
Scanning for IPs that are allocated but not actually in use...를 포함하는 섹션을 찾으십시오. IP 주소가 IPAM에서 할당되어 있으나 실제로는 사용 중이 아닌 경우에는 다음 단계로 진행하여 이를 해제하십시오. 이 출력 예에서는 181개의 IP 주소를 해제할 수 있습니다.... Scanning for IPs that are allocated but not actually in use... Found 181 IPs that are allocated in IPAM but not actually in use. Scanning for IPs that are in use by a workload or node but not allocated in IPAM... Found 0 in-use IPs that are not in active IP pools. Found 0 in-use IPs that are in active IP pools but have no corresponding IPAM allocation. Check complete; found 181 problems. -
Calico IPAM에서 이전에 팟(Pod) 엔드포인트에 지정된 IP 주소를 해제하십시오. 다음 단계에서 데이터 저장소를 잠그고 나면 기존 팟(Pod)은 계속해서 실행되지만 작성되는 모든 팟(Pod)은
ContainerCreating상태로 유지되며 데이터 저장소를 잠금 해제하기 전까지 시작할 수 없다는 점을 참고하십시오. 이 데이터 저장소 잠금은 IP 주소를 해제하는 동안 IPAM 레코드가 수정되지 않도록 합니다. 자세한 내용은 ‘ Calico ’ 오픈 소스 문서를 참조하십시오.- Calico IPAM 레코드의 데이터 저장소를 잠그십시오.
calicoctl datastore migrate lock ``` 2. IPAM 검사 결과를 저장하십시오. ```sh {: pre} calicoctl ipam check -o report.json ``` 3. 사용되지 않는 IP 주소를 해제하십시오. 이 프로세스는 해제해야 하는 IP 주소의 수에 따라 최대 20분 동안 실행될 수 있습니다. ```sh {: pre} calicoctl ipam release --from-report=report.json ``` 4. 데이터 저장소를 잠금 해제하십시오. ```sh {: pre} calicoctl datastore migrate unlock ``` 5. 사용되지 않는 모든 IP 주소가 해제되었는지 확인하십시오. ```sh {: pre} calicoctl ipam check ``` 출력 예 ```sh {: screen} Check complete; found 0 problems. ``` -
선택사항: 데이터 저장소가 성공적으로 잠금 해제되었으며 이제 IP 주소를 지정할 수 있는지 확인하려면 팟(Pod)을 작성하고 이것이 올바르게 시작되는지 확인하십시오.
- 예를 들면, 간단한 NGINX 팟(Pod)을 작성하십시오.
oc run test --image=nginx --generator=run-pod/v1 ``` 2. 팟(Pod)에 IP 주소가 있으며 성공적으로 실행 중인지 확인하십시오. ```sh {: pre} oc get po test ``` 3. 테스트 팟(Pod)을 삭제하십시오. ```sh {: pre} oc delete pod test ``` -
사용되지 않는 IP 주소 블록을 확인려면 다음 절로 진행하십시오.
2단계: IP 주소 블록 해제
다음으로, 작업자 노드에 지정되었지만 해당 작업자 노드에서 사용하지 않는 전체 IP 주소 블록을 확인하고 정리하십시오.
경우에 따라 작업자 노드에 두 번째 또는 세 번째 IP 주소 블록이 지정되면 해당 작업자 노드가 이전에 사용한 전체 IP 주소 블록이 나중에 전혀 사용되지 않을 수 있습니다. 또한 작업자 노드를 제거하거나 대체할 때 calico-kube-controllers가 임시로 실행될 작업자 노드가 없거나 CNI 플러그인 또는 containerd 런타임에서 문제가 발생하여 Calico IPAM의
IP 주소 블록 정리에 실패할 수 있습니다.
IP 블록이 사용 가능한지 확인하는 것은 Kubernetes 버전 1.19 이상을 실행하는 모든 클래식 클러스터와 모든 VPC 클러스터에서 특히 중요합니다. 이러한 클러스터에서는 strictAffinity Calico 설정이 true로 설정되어 작업자 노드가 다른 작업자 노드에 지정된 블록의 IP 주소를 사용하는 것이 아니라 지정된 IP 블록의 IP 주소만 사용하도록 합니다. 시간
경과에 따라 노드에 지정되었지만 사용되지 않는 블록이 더 이상 작업자 노드에 IP 주소 블록을 지정할 수 없는 상태까지 누적될 수 있습니다.
-
개별 IP 주소를 해제하는 단계를 따르십시오.
-
Calico IPAM 레코드에 대한 데이터 저장소를 잠글지 여부를 선택하십시오.
- 데이터 저장소를 잠그면 기존 팟(Pod)은 계속 실행되지만 작성되는 모든 팟(Pod)은
ContainerCreating상태로 유지되며 데이터 저장소를 잠금 해제하기 전까지 시작할 수 없습니다. 이 데이터 저장소 잠금을 사용하면 사용되지 않는 블록을 확인한 후 해당 블록을 해제하기 전에는 팟(Pod)을 작성할 수 없습니다. - 데이터 저장소를 잠그지 않는 경우에는 삭제한 해제 블록의 IP 주소를 사용한 새 팟(Pod)이 없는지 즉시 확인해야 합니다.
calicoctl datastore migrate lock - 데이터 저장소를 잠그면 기존 팟(Pod)은 계속 실행되지만 작성되는 모든 팟(Pod)은
-
Calico IPAM 레코드를 나열하십시오. 출력에서 블록이 지정된 작업자 노드에 의해 사용되고 있지 않음을 나타내는,
IPS IN USE가 0인 블록을 찾으십시오.calicoctl ipam show --show-blocks이 출력 예에서는
172.24.10.64/26블록에 사용 중인 IP 주소가 없습니다.... Block | 172.24.10.64/26 | 64 | 0 (0%) | 64 (100%) | ... -
이러한 각 블록에 대해 다음 단계를 완료하여 블록을 해제하십시오.
- 현재 해당 블록의 IP 주소를 사용하는 팟(Pod)이 없는 것을 확인하십시오.
oc get pods -A ``` 2. 해당 블록에 대한 `BlockAffinity`를 가져오십시오. 블록의 마침표 및 슬래시를 하이픈(-)으로 바꾸십시오. 예를 들어, 블록 `172.24.10.64/26`의 경우 다음 명령의 형식은 `172-24-10-64-26`입니다. ```sh {: pre} oc get blockaffinity | grep <block> ``` 3. `BlockAffinity`을(를) 삭제하십시오. ```sh {: pre} oc delete blockaffinity <block_affinity> ``` 4. 해당 블록에 대한 `IPAMBlock`를 가져오십시오. 블록의 마침표 및 슬래시를 하이픈(-)으로 바꾸십시오. 예를 들어, 블록 `172.24.10.64/26`의 경우 다음 명령의 형식은 `172-24-10-64-26`입니다. ```sh {: pre} oc get ipamblock | grep <block> ``` 5. `IPAMBlock`을(를) 삭제하십시오. ```sh {: pre} oc delete ipamblock <ipam_block> ``` 6. 2단계에서 데이터 저장소를 잠그지 않은 경우: `BlockAffinity` 및 `IPAMBlock`을 삭제하기 직전에 팟(Pod)이 작성되지 않았는지 확인하십시오. 팟(Pod)이 작성된 경우에는 이 블록에 대한 `BlockAffinity` 및 `IPAMBlock`을 다시 삭제해야 합니다. 그런 다음 이 팟(Pod)이 다른 블록의 IP 주소를 사용하여 다시 작성되도록 `oc delete pod <pod>`을 실행하여 이 블록의 IP 주소를 사용하는 팟(Pod)을 삭제하십시오. ```sh {: pre} oc get pods -A ``` 7. `IPS IN USE` 가 0인 다른 블록에 대해서도 이 단계를 반복하십시오. -
2단계에서 데이터 저장소를 잠근 경우: 데이터 저장소를 잠금 해제하십시오.
calicoctl datastore migrate unlock