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을 구성합니다.
- 개인 레지스트리에 대한 세부 정보를 사용하여 예제 포드 규격을 생성합니다.
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>
은 이전에 생성한 레지스트리 서비스 이미지 끌어오기 암호의 이름으로 바꿉니다.
- 정의한 포드 규격을 기반으로 Tanzu Kubernetes 클러스터에 워크로드를 생성합니다.
kubectl --kubeconfig=<path>/cluster-kubeconfig apply -f <pod.yaml>
포드는 레지스트리에서 끌어온 이미지에서 생성해야 합니다.
외부 개인 레지스트리의 신뢰 필드
TkgServiceConfiguration
의 additionalTrustedCAs
섹션에 인증서 항목(PEM으로 인코딩된 공용 인증서의 base64로 인코딩된 문자열)을 추가합니다. 데이터는 TkgServiceConfiguration에 일반 텍스트로 저장된 공용 인증서입니다.
필드 | 설명 |
---|---|
trust |
섹션 마커. 데이터를 허용하지 않습니다. |
additionalTrustedCAs |
섹션 마커. 각각에 대한 이름과 데이터가 는 인증서 어레이를 포함합니다. |
name |
TLS 인증서의 이름입니다. |
data |
PEM으로 인코딩된 공용 인증서의 base64로 인코딩된 문자열입니다. |
외부 개인 레지스트리 인증서 제거
TkgServiceConfiguration
의 additionalTrustedCAs
섹션에 있는 인증서 목록에서 인증서를 제거하고 TkgServiceConfiguration
을 Tanzu 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를 사용하여 구성에 적용했던 인증서가 제대로 적용되었는지 여부를 확인할 수 있습니다.
/etc/ssl/certs/
폴더에서tkg-<cert_name>.pem
이라는 파일을 확인합니다. 여기서<cert_name>
은TkgServiceConfiguration
에 추가된 인증서의 "name" 속성입니다. 인증서가TkgServiceConfiguration
에 있는 인증서와 일치하고 개인 레지스트리 사용이 여전히 작동하지 않으면 다음 단계를 수행하여 추가 진단을 진행합니다.openssl s_client -connect hostname:port_num
명령을 실행하여 자체 서명된 인증서를 사용하는 대상 서버에 다음 openssl 연결 테스트를 실행합니다. 여기서 hostname은 자체 서명된 인증서를 사용하는 개인 레지스트리의 호스트 이름/DNS 이름이고 port_num은 서비스가 실행되고 있는 포트 번호(일반적으로 HTTPS의 경우 443임)입니다. 자체 서명된 인증서를 사용하는 끝점에 연결하려고 할 때 openssl이 정확히 어떤 오류를 반환하는지 확인하고, 거기서부터 상황을 해결할 수 있습니다(예를 들어TkgServiceConfiguration
에 올바른 인증서를 추가하여). Tanzu Kubernetes 클러스터에 잘못된 인증서가 내장되어 있는 경우 올바른 인증서로 Tanzu Kubernetes Grid 서비스 구성을 업데이트하고, Tanzu Kubernetes 클러스터를 삭제한 다음 올바른 인증서가 포함된 구성을 사용하여 다시 생성해야 합니다.