개요

2023년 4월 3일부터 쿠버네티스 프로젝트의 레지스트리가 기존 k8s.gcr.io 레지스트리에서 새로운 레지스트리인 registry.k8s.io 레지스트리로 변경됨에 따라 k8s.gcr.io 레지스트리를 참조하는 이미지에 대한 지원이 중단되었습니다. 이에 따라 기존 이미지들에 대해 배포가 중단되거나 임의로 제거될 수 있기때문에 서비스 중인 클러스터가 사용중인 모든 이미지에 대해 검사를 실시하고 이슈가 있는 이미지 레지스트리를 새로운 커뮤니티 레지스트로 변경하고자 합니다.

  • 이슈 전문


검사

이슈 레지스트리는 두가지 방법으로 체크가 가능합니다.

첫번째 방법으로는 터미널에서 다음의 명령을 실행하는 것입니다.

$ kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

이 명령은 현재 접속중인 클러스터의 모든 네임스페이스 파드 컨테이너 이미지들에 대해 리스트를 출력합니다.

1

리스트의 내용을 참조하여 k8s.gcr.io 레지스트리를 사용하는 이미지를 확인할 수 있습니다. 제가 접속중인 클러스터에서는 External-dns 이미지가 이슈 레지스트리를 사용하고 있는 것으로 확인되었습니다.

만약 클러스터에 사용하는 이미지가 많거나 이슈 레지스트리 이미지가 많아서 좀더 시각적으로 체크하고 싶다면 두번째 방법을 추천합니다. Kubectl Krew 매니저에서 제공하는 Community-images 플러그인을 사용하는 방법입니다.

먼저 Krew 매니저가 설치되어있지 않다면 다음 명령어를 통해 설치해줍니다.

$ (
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

Krew 설치후엔 쉘 환경변수에 설치한 플러그인 매니저를 등록해줍니다.

$ export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

등록 후에는 Community-images 플러그인을 설치합니다.

$ kubectl krew install community-images

등록과 설치 과정을 마친 후에는 다음 명령어를 통해 클러스터 이미지를 검사할 수 있습니다.

$ kubectl community-images

2

첫번째 방법과 마찬가지로 external-dns 이미지에 대한 이슈를 확인할 수 있습니다.


업데이트

검사된 이미지에 대해서 레지스트리를 업데이트해주는 작업은 여러가지 방법이 있습니다.

가장 많이 쓰이는 쿠버네티스 패키지 매니저 헬름은 이미 대부분의 이미지를 새로운 registry.k8s.io 레지스트리로 업데이트되었기때문에 헬름 레포지토리를 업데이트한 뒤 재설치를 해주는 과정을 거치면 됩니다.

// helm 레포지토리 업데이트
$ helm repo update

레포지토리를 업데이트한 이후 헬름을 통해 이슈 이미지를 업그레이드 및 재생성할 수 있습니다.

$ helm upgrade <RELEASE_NAME> <CHART_NAME> --namespace <NAMESPACE> --recreate-pods

3

재생성시 Image tag를 확인해보면 이슈가 해결된 새로운 레지스트리로 변경되었음을 확인할 수 있습니다.

이 방법은 레지스트리를 업데이트하기 위해 리소스를 재설치하는 과정을 거치기때문에 의존성을 가지거나 config등을 지니는 경우 복잡한 문제가 발생할 수 있기때문에 해당 리소스의 이미지를 직접 변경해주는 방법을 사용할 수 있습니다.

$ kubectl edit <RESOURCE_TYPE> <RESOURCE_NAME>

4

Containers 의 Image를 직접 k8s.gcr.io 에서 registry.k8s.io 로 수정 후 저장해줍니다. 쿠버네티스 커뮤니티에 따르면 대부분의 이미지를

변경 이후 다음 명령어를 통해 디플로이먼트를 재시작하면 됩니다.

$ kubectl rollout restart deployment/<DEPLOYMENT_NAME>

5

Community-images를 통해서도 정상적인 레지스트리로 변경되었음을 확인할 수 있습니다.