Tanzu Kubernetes 클러스터 포드에서 외부 컨테이너 레지스트리를 사용할 수 있습니다. 이것은 내장된 Harbor 레지스트리 사용에 대한 대안입니다.

외부 개인 레지스트리 사용 사례

컨테이너 레지스트리는 컨테이너 이미지를 저장 및 공유하기 위한 중앙 집중식 저장소 역할을 하는 Kubernetes 배포에 중요한 기능을 제공합니다. 가장 일반적으로 사용되는 공용 컨테이너 레지스트리는 DockerHub입니다. 개인 컨테이너 레지스트리 오퍼링은 많이 있습니다. VMware Harbor는 오픈 소스, 클라우드 네이티브, 개인 컨테이너 레지스트리입니다. vSphere with Tanzu에는 vSphere 포드Tanzu Kubernetes 클러스터에서 실행되는 포드에 대한 개인 컨테이너 레지스트리로 사용할 수 있는 Harbor 인스턴스가 내장되어 있습니다. 자세한 내용은 감독자 클러스터에서 내장된 Harbor 레지스트리를 사용하도록 설정의 내용을 참조하십시오.

vSphere with Tanzu와 함께 제공되는 내장된 Harbor 레지스트리에는 NSX-T 네트워킹이 필요합니다. vSphere 네트워킹을 사용하는 경우에는 사용할 수 없습니다. 또한 Tanzu Kubernetes 클러스터와 통합하려는 자체적인 개인 컨테이너 레지스트리를 이미 실행 중일 수 있습니다. 이 경우 자체 서명된 인증서가 있는 개인 레지스트리를 신뢰하도록 Tanzu Kubernetes Grid 서비스를 구성하여 Tanzu Kubernetes 클러스터에서 실행되는 Kubernetes 포드가 외부 레지스트리를 사용하도록 할 수 있습니다.

외부 개인 레지스트리 요구 사항

Tanzu Kubernetes 클러스터에서 외부 개인 레지스트리를 사용하려면 vSphere with Tanzu 버전 7 U2 이상을 사용해야 합니다.

Tanzu Kubernetes 클러스터 및 Tanzu Kubernetes 릴리스 노드 VM에서 실행되는 Kubernetes 포드에서만 자체적인 개인 레지스트리를 사용할 수 있습니다. ESXi 호스트에서 기본적으로 실행되는 vSphere 포드에서는 자체적인 개인 레지스트리를 사용할 수 없습니다. vSphere 포드에 지원되는 레지스트리는 vSphere with Tanzu 플랫폼에 내장된 Harbor 레지스트리입니다.

개인 레지스트리에 대해 Tanzu Kubernetes Grid 서비스를 구성하면 프로비저닝된 새 클러스터가 개인 레지스트리를 지원하게 됩니다. 기존 클러스터가 개인 레지스트리를 지원하려면 TkgServiceConfiguration을 적용하기 위해 롤링 업데이트가 필요합니다. Tanzu Kubernetes 클러스터 업데이트의 내용을 참조하십시오. 또한 사용자 지정 TkgServiceConfiguration을 처음 생성하면 시스템에서 롤링 업데이트가 시작됩니다.

외부 개인 레지스트리 구성

Tanzu Kubernetes 클러스터에서 자체적인 개인 레지스트리를 사용하려면 HTTPS를 통해 개인 레지스트리 컨텐츠를 제공하도록 하나 이상의 자체 서명된 인증서로 Tanzu Kubernetes Grid 서비스를 구성합니다.

TkgServiceConfiguration은 개인 레지스트리에 대해 자체 서명된 인증서를 지원하도록 업데이트됩니다. 특히 trust 필드가 있는 새 additionalTrustedCAs 섹션이 추가되어 Tanzu Kubernetes 클러스터가 신뢰해야 하는 자체 서명된 인증서를 얼마든지 정의할 수 있습니다. 이 기능을 사용하면 인증서 목록을 쉽게 정의하고 순환이 필요할 경우 인증서를 업데이트할 수 있습니다.

TkgServiceConfiguration이 업데이트되고 적용되고 나면 다음에 클러스터가 생성될 때 새 클러스터에 TLS 인증서가 적용됩니다. 다시 말해, TkgServiceConfiguration.trust.additionalTrustedCAs에 업데이트를 적용해도 Tanzu Kubernetes 클러스터에 대한 자동 롤링 업데이트가 트리거되지 않습니다.

apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TkgServiceConfiguration
metadata:
  name: tkg-service-configuration
spec:
  defaultCNI: antrea
  trust:
    additionalTrustedCAs:
      - name: first-cert-name
        data: base64-encoded string of a PEM encoded public cert 1
      - name: second-cert-name
        data: base64-encoded string of a PEM encoded public cert 2
업데이트를 적용하려면 다음 명령을 실행합니다.
kubectl apply -f tkgserviceconfiguration.yaml

Tanzu Kubernetes Grid 서비스 규격이 개인 레지스트리 인증서로 업데이트되기 때문에 Tanzu Kubernetes 클러스터에서 내장된 Harbor 레지스트리를 사용할 때처럼 Tanzu Kubernetes 클러스터 kubeconfig에 공용 키를 추가할 필요가 없습니다.

개인 컨테이너 레지스트리에서 이미지를 끌어오도록 Tanzu Kubernetes 워크로드 구성

Tanzu Kubernetes 클러스터 워크로드를 위해 개인 컨테이너 레지스트리에서 이미지를 끌어오려면 개인 레지스트리 세부 정보를 사용하여 워크로드 YAML을 구성합니다.

이 절차는 전용 컨테이너 레지스트리 또는 내장된 Harbor 레지스트리에서 이미지를 끌어오는 데 사용할 수 있습니다. 이 예에서는 내장된 Harbor 레지스트리에 저장된 이미지를 사용하고 이전에 구성된 이미지 끌어오기 암호를 활용하는 포드 규격을 생성합니다.
  1. 개인 레지스트리에 대한 세부 정보를 사용하여 예제 포드 규격을 생성합니다.
    apiVersion: v1
    kind: Pod
    metadata:
      name: <workload-name>
      namespace: <kubernetes-namespace>
    spec:
      containers:
      - name: private-reg-container
        image: <Registry-IP-Address>/<vsphere-namespace>/<image-name>:<version>
      imagePullSecrets:
      - name: <registry-secret-name>
    • <workload-name>을 포드 워크로드의 이름으로 바꿉니다.
    • <kubernetes-namespace>는 포드를 생성할 클러스터의 Kubernetes 네임스페이스로 바꿉니다. 이것은 레지스트리 서비스 이미지 끌어오기 암호가 클러스터 Tanzu Kubernetes에 저장되는 동일한 Kubernetes 네임스페이스(예: 기본 네임스페이스)여야 합니다.
    • <Registry-IP-Address>감독자 클러스터에서 실행되는 내장된 Harbor 레지스트리 인스턴스의 IP 주소로 바꿉니다.
    • <vsphere-namespace>는 대상 Tanzu Kubernetes가 프로비저닝된 vSphere 네임스페이스로 바꿉니다.
    • <image-name>은 원하는 이미지 이름으로 바꿉니다.
    • <version>은 적절한 이미지 버전(예: "latest")으로 바꿉니다.
    • <registry-secret-name>은 이전에 생성한 레지스트리 서비스 이미지 끌어오기 암호의 이름으로 바꿉니다.
  2. 정의한 포드 규격을 기반으로 Tanzu Kubernetes 클러스터에 워크로드를 생성합니다.
    kubectl --kubeconfig=<path>/cluster-kubeconfig apply -f <pod.yaml>

    포드는 레지스트리에서 끌어온 이미지에서 생성해야 합니다.

외부 개인 레지스트리의 신뢰 필드

TkgServiceConfigurationadditionalTrustedCAs 섹션에 인증서 항목(PEM으로 인코딩된 공용 인증서의 base64로 인코딩된 문자열)을 추가합니다. 데이터는 TkgServiceConfiguration에 일반 텍스트로 저장된 공용 인증서입니다.

표 1. 개인 레지스트리의 신뢰 필드
필드 설명
trust 섹션 마커. 데이터를 허용하지 않습니다.
additionalTrustedCAs 섹션 마커. 각각에 대한 이름과 데이터가 는 인증서 어레이를 포함합니다.
name TLS 인증서의 이름입니다.
data PEM으로 인코딩된 공용 인증서의 base64로 인코딩된 문자열입니다.

외부 개인 레지스트리 인증서 제거

TkgServiceConfigurationadditionalTrustedCAs 섹션에 있는 인증서 목록에서 인증서를 제거하고 TkgServiceConfigurationTanzu Kubernetes Grid 서비스에 적용합니다.

외부 개인 레지스트리 인증서 순환

인증서를 순환하기 위해 VI 관리자 또는 DevOps 엔지니어가 TkgServiceConfiguration 또는 Tanzu Kubernetes 클러스터 규격의 인증서 내용을 변경하고 이 구성을 적용하여 TKC에 대한 롤링 업데이트를 트리거합니다.

외부 개인 레지스트리 인증서 문제 해결

신뢰할 수 있는 인증서로 Tanzu Kubernetes Grid 서비스를 구성하고 자체 서명된 인증서를 kubeconfig 클러스터에 추가하면 자체 서명된 인증서를 사용하는 개인 레지스트리에서 컨테이너 이미지를 성공적으로 끌어올 수 있습니다.

다음 명령은 포드 워크로드에 대해 컨테이너 이미지를 성공적으로 끌어왔는지 확인하는 데 유용할 수 있습니다.

kubectl describe pod PODNAME

이 명령은 주어진 포드에 대한 자세한 상태 및 오류 메시지를 보여줍니다. 클러스터에 사용자 지정 인증서를 추가하기 전에 이미지 끌어오기를 시도하는 예:

Events:
  Type     Reason                        Age               From               Message
  ----     ------                        ----              ----               -------
  Normal   Scheduled                     33s               default-scheduler  ...
  Normal   Image                         32s               image-controller   ...
  Normal   Image                         15s               image-controller   ...
  Normal   SuccessfulRealizeNSXResource  7s (x4 over 31s)  nsx-container-ncp  ...
  Normal   Pulling                       7s                kubelet            Waiting test-gc-e2e-demo-ns/testimage-8862e32f68d66f727d1baf13f7eddef5a5e64bbd-v10612
  Warning  Failed                        4s                kubelet            failed to get images: ... Error: ... x509: certificate signed by unknown authority
다음 명령을 실행하는 경우:
kubectl get pods
전체 포드 상태 보기에서도 ErrImagePull 오류를 볼 수 있습니다.
NAME                                         READY   STATUS         RESTARTS   AGE
testimage-nginx-deployment-89d4fcff8-2d9pz   0/1     Pending        0          17s
testimage-nginx-deployment-89d4fcff8-7kp9d   0/1     ErrImagePull   0          79s
testimage-nginx-deployment-89d4fcff8-7mpkj   0/1     Pending        0          21s
testimage-nginx-deployment-89d4fcff8-fszth   0/1     ErrImagePull   0          50s
testimage-nginx-deployment-89d4fcff8-sjnjw   0/1     ErrImagePull   0          48s
testimage-nginx-deployment-89d4fcff8-xr5kg   0/1     ErrImagePull   0          79s
"x509: certificate signed by unknown authority" 및 "ErrImagePull" 오류는 클러스터가 개인 컨테이너 레지스트리에 연결할 수 있는 올바른 인증서로 구성되지 않았음을 나타냅니다. 인증서가 누락되었거나 잘못 구성되었습니다.

인증서를 구성한 후 개인 레지스트리에 연결하는 데 오류가 발생하는 경우 구성에 적용된 인증서가 클러스터에 적용되었는지 확인할 수 있습니다. SSH를 사용하여 구성에 적용했던 인증서가 제대로 적용되었는지 여부를 확인할 수 있습니다.

SSH를 통해 작업자 노드에 연결하여 두 가지 조사 단계를 수행할 수 있습니다.
  1. /etc/ssl/certs/ 폴더에서 tkg-<cert_name>.pem이라는 파일을 확인합니다. 여기서 <cert_name>TkgServiceConfiguration에 추가된 인증서의 "name" 속성입니다. 인증서가 TkgServiceConfiguration에 있는 인증서와 일치하고 개인 레지스트리 사용이 여전히 작동하지 않으면 다음 단계를 수행하여 추가 진단을 진행합니다.
  2. openssl s_client -connect hostname:port_num 명령을 실행하여 자체 서명된 인증서를 사용하는 대상 서버에 다음 openssl 연결 테스트를 실행합니다. 여기서 hostname은 자체 서명된 인증서를 사용하는 개인 레지스트리의 호스트 이름/DNS 이름이고 port_num은 서비스가 실행되고 있는 포트 번호(일반적으로 HTTPS의 경우 443임)입니다. 자체 서명된 인증서를 사용하는 끝점에 연결하려고 할 때 openssl이 정확히 어떤 오류를 반환하는지 확인하고, 거기서부터 상황을 해결할 수 있습니다(예를 들어 TkgServiceConfiguration에 올바른 인증서를 추가하여). Tanzu Kubernetes 클러스터에 잘못된 인증서가 내장되어 있는 경우 올바른 인증서로 Tanzu Kubernetes Grid 서비스 구성을 업데이트하고, Tanzu Kubernetes 클러스터를 삭제한 다음 올바른 인증서가 포함된 구성을 사용하여 다시 생성해야 합니다.