CNI 플러그인 관련 오류 해결하기
CNI 플러그인 관련 오류 해결하기 (Troubleshooting CNI plugin-related errors)
CNI 플러그인 관련 오류를 피하려면, 사용 중인 쿠버네티스 버전과 함께 제대로 동작하도록 테스트된 컨테이너 런타임을 사용하거나 그 버전으로 업그레이드하고 있는지 확인하세요.
출처: 문서
본문
"Incompatible CNI versions" 및 "Failed to destroy network for sandbox" 오류에 대하여
containerd v1.6.0-v1.6.3에서는 CNI 플러그인이 업그레이드되지 않았고/않았거나 CNI 구성 파일에 CNI 구성 버전이 선언되지 않았을 때, 파드 CNI 네트워크 설정과 해제에 서비스 문제가 존재해요. containerd 팀은 "이 문제들은 containerd v1.6.4에서 해결됐다"고 보고해요.
containerd v1.6.0-v1.6.3에서 CNI 플러그인을 업그레이드하지 않거나 CNI 구성 버전을 선언하지 않으면, 다음의 "Incompatible CNI versions" 또는 "Failed to destroy network for sandbox" 오류 조건을 만날 수 있어요.
Incompatible CNI versions 오류
CNI 플러그인의 버전이 구성 버전이 플러그인 버전보다 최신이라 구성의 플러그인 버전과 올바르게 일치하지 않으면, 파드 시작 시 containerd 로그에 다음과 비슷한 오류 메시지가 표시될 가능성이 높아요.
incompatible CNI versions; config is "1.0.0", plugin supports ["0.1.0" "0.2.0" "0.3.0" "0.3.1" "0.4.0"]
이 문제를 해결하려면 CNI 플러그인과 CNI 구성 파일을 업데이트하세요.
Failed to destroy network for sandbox 오류
CNI 플러그인 구성에 플러그인의 버전이 없으면 파드는 실행될 수 있어요. 하지만 파드를 중지하면 다음과 비슷한 오류가 발생해요.
ERROR[2022-04-26T00:43:24.518165483Z] StopPodSandbox for "b" failed
error="failed to destroy network for sandbox \"bbc85f891eaf060c5a879e27bba9b6b06450210161dfdecfbb2732959fb6500a\": invalid version \"\": the version is empty"
이 오류는 네트워크 네임스페이스가 아직 연결된 채로 파드를 not-ready 상태로 남겨 둬요. 이 문제에서 복구하려면 CNI 구성 파일을 편집해 누락된 버전 정보를 추가하세요. 다음에 파드를 중지하려는 시도는 성공할 거예요.
CNI 플러그인과 CNI 구성 파일 업데이트하기
containerd v1.6.0-v1.6.3을 사용 중이고 "Incompatible CNI versions" 또는 "Failed to destroy network for sandbox" 오류를 만났다면, CNI 플러그인을 업데이트하고 CNI 구성 파일을 편집하는 것을 고려하세요.
각 노드에 대한 일반적인 단계의 개요는 다음과 같아요.
- 노드를 안전하게 drain하고 cordon하세요.
- 컨테이너 런타임과 kubelet 서비스를 중지한 후 다음 업그레이드 작업을 수행하세요.
- CNI 플러그인을 실행 중이라면 최신 버전으로 업그레이드하세요.
- CNI가 아닌 플러그인을 사용 중이라면 CNI 플러그인으로 교체하세요. 플러그인의 최신 버전을 사용하세요.
- 아래의 "containerd 구성 파일 예시" 섹션에 표시된 대로, 플러그인이 지원하는 CNI 사양 버전을 지정하거나 일치하도록 플러그인 구성 파일을 업데이트하세요.
- containerd의 경우 최신 버전(v1.0.0 이상)의 CNI loopback 플러그인을 설치했는지 확인하세요.
- 노드 구성 요소(예: kubelet)를 쿠버네티스 v1.24로 업그레이드하세요.
- 컨테이너 런타임의 가장 최신 버전으로 업그레이드하거나 설치하세요.
- 컨테이너 런타임과 kubelet을 다시 시작해 노드를 클러스터로 다시 가져오세요. 노드를 uncordon하세요(
kubectl uncordon <nodename>).
containerd 구성 파일 예시
다음 예시는 최신 CNI 사양 버전(v1.0.0)을 지원하는 containerd 런타임 v1.6.x에 대한 구성을 보여 줘요.
시스템 구성에 대한 추가 지침은 플러그인과 네트워킹 제공자의 문서를 참조하세요.
쿠버네티스에서 containerd 런타임은 기본 동작으로 파드에 loopback 인터페이스 lo를 추가해요. containerd 런타임은 loopback이라는 CNI 플러그인을 통해 loopback 인터페이스를 구성해요. loopback 플러그인은 cni 지정이 있는 containerd 릴리스 패키지의 일부로 배포돼요. containerd v1.6.0 이상에는 CNI v1.0.0 호환 loopback 플러그인과 다른 기본 CNI 플러그인이 포함돼요. loopback 플러그인의 구성은 containerd 내부에서 수행되며 CNI v1.0.0을 사용하도록 설정돼요. 이는 이 최신 containerd가 시작될 때 loopback 플러그인의 버전이 v1.0.0 이상이어야 한다는 뜻이기도 해요.
다음 bash 명령은 예시 CNI 구성을 생성해요. 여기서 구성 버전의 1.0.0 값이 cniVersion 필드에 할당되어, containerd가 CNI bridge 플러그인을 호출할 때 사용돼요.
cat <<EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
"cniVersion": "1.0.0",
"name": "containerd-net",
"plugins": [
{
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"promiscMode": true,
"ipam": {
"type": "host-local",
"ranges": [
[{
"subnet": "10.88.0.0/16"
}],
[{
"subnet": "2001:db8:4860::/64"
}]
],
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "::/0" }
]
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"externalSetMarkChain": "KUBE-MARK-MASQ"
}
]
}
EOF
앞선 예시의 IP 주소 범위를 사용 사례와 네트워크 주소 지정 계획에 기반한 값으로 업데이트하세요.