문제
자체 서명된 인증서(또는 내부 CA에서 서명한 인증서)가 있는 개인 레지스트리는 x509: 이미지 풀링 중에 알 수 없는 기관에서 서명한 인증서를 생성합니다. 즉, 요청자(TKG 클러스터 작업자 노드)가 레지스트리에서 제공하는 인증서를 신뢰하지 않아 이미지 풀링이 실패합니다.
해결책
Tanzu Kubernetes Clusters에서 개인 레지스트리를 사용하려면 Tanzu Kubernetes 그리드 서비스 TkgServiceConfiguration
에 additionalTrustedCAs
필드를 사용하여 하나 이상의 자체 서명 인증서를 추가로 구성합니다:
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 - name: second-cert-name data: base64-encoded string of a PEM encoded public cert
TLS 인증서는 다음에 클러스터가 생성될 때 새 클러스터에 적용되지만 기존 클러스터에는 적용되지 않으며 롤링 업데이트를 트리거하지 않습니다. 다음 번에 기존 TKC를 업데이트할 때 CA 인증서가 추가됩니다.
사용 사례 예제
다음 yaml과 명령을 사용하여 helm이 있는 다른 TKG 클러스터에 하버를 배치했습니다.
expose: type: loadBalancer tls: certSource: auto auto: commonName: "core.harbor.labs.satm.eng.vmware.com" externalURL: https://core.harbor.labs.satm.eng.vmware.com persistence: enabled: true resourcePolicy: "" persistentVolumeClaim: registry: storageClass: "vsan-default-storage-policy" chartmuseum: storageClass: "vsan-default-storage-policy" jobservice: storageClass: "vsan-default-storage-policy" database: storageClass: "vsan-default-storage-policy" redis: storageClass: "vsan-default-storage-policy" trivy: storageClass: "vsan-default-storage-policy" imageChartStorage: type: filesystem filesystem: rootdirectory: /storage harborAdminPassword: "P@ssw0rd"
이렇게 하면 자체 서명 인증서와 nginx 배포를 생성하여 레지스트리를 앞에 두고, 배포 후 TKG 클러스터에서 인증서를 추출하여 로컬 파일 시스템에 다음과 같은 방법으로 배포할 수 있습니다.
kubectl get secret harbor-harbor-nginx -o=jsonpath="{.data.ca\.crt}" > harbor-ca.crt
추출한 harbor-ca.crt(이미 우리를 위해 인코딩된 base64)를 TkgServiceConfiguration(이 파일을 tks.yaml이라고 함)에 항목으로 추가할 수 있습니다.
apiVersion: run.tanzu.vmware.com/v1alpha1 kind: TkgServiceConfiguration metadata: name: tkg-service-configuration spec: defaultCNI: antrea trust: additionalTrustedCAs: - name: harbor-ca data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQWZ1Z0F3SUJBZ0lRUHdpYUV4RjZsUzA2cGQzc2FsRWIyREFOQmdrcWhraUc5dzBCQVFzRkFEQVUKTVJJd0VBWURWUVFERXdsb1lYSmliM0l0WTJFd0hoY05NakV3TXpFd01UTTFOVFF6V2hjTk1qSXdNekV3TVRNMQpOVFF6V2pBVU1SSXdFQVlEVlFRREV3bG9ZWEppYjNJdFkyRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRG5Ta0ZCRTNvbk4yR0VOYU1TRWJRSUNzVmVUajJOQTBWRC9nNHdKZ3pwMVU5alc3VE8KNC9KK0JxNE9aS2Nia2NTWFcxYkNDeWNKKzNpQ2RIdFFqaVUvSnZZRHZhcGlBVnA0UmIvRE5lYnJyL0VaR2hZQQpUUjAybWpuS0hlVGdJVXBsTk5OM0haM0x2OE1xemxwem1OaVNKZWZCOFpqMWI0eElZS09LVWZPSzBJRjQrTERsCkFEUHJ0L1B4TmN3NDQ3RUI4QVpuay92YVpGN1F3ekNzY2E4cUlyUlFzZmk4Z0JCcEJDVlllMk4wM1dPWE9aK2kKMXZ1WnVvREh3NEgwWGNQVjhiNlZnVGsxWjMrak92MUF0UXBIUXllcExpMCtnVDdXb1VJTCt5anJ0dVJHeGpkaAp1R2FoRnVhajRCNmZ1RHo1eHRtM2ZyMy9WNFRUYVEwRk9pbjVBZ01CQUFHallUQmZNQTRHQTFVZER3RUIvd1FFCkF3SUNwREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QWRCZ05WSFE0RUZnUVUvWEJZUW5SSlJjeXZzWjQxdHozMlRrZ2ZUdnd3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFMTWlGa1RlL1BtZCtuazZzVHFGQmlNd2REWEVFeTAyL2tsMVhLZ0RTOURVenU2bmpseXljSzFaCitGY3JNUGFpNnYrTjBySzBYbmt0TmRuRkxpdS9ZL2JiZENHSURWQ3R2c2FuY29rZHUyZFZyZDdRZWFXdzMwV3MKY1RKK0lGb214YUNDTjZ1bGd6QXNsbGJVL3ZJYzg5cHEzOEZNN3I4TXpUcjhyVFpIVzdiY29vZThlcHJHTE9PegpiR3Uxb2lCbWpBSlNrV3owejBETFJ0TGFhRHFUY1hsN09YNTZIWjRJamVSWll5RDloMFNRR0VtMURkR1EvSmdECmRQdXhsa01wSnZuQWtLcVN4K2JTMVlIdTA1dHdyYkdDRk5EY2RCd0owYlRJV1lVeUI1Y3BXUEJvQkxxMUxQQ1kKUHVyKzRRSWpjb05JME1uSCtEaW1Lb0Rwc0RMN083TT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
이 기능을 슈퍼바이저 클러스터에 적용하면 이 시점 이후에 생성된 모든 TKG 클러스터가 자동으로 CA 인증서를 신뢰하므로 다음과 같은 레지스트리가 생성됩니다.
kubectl config use-context $Supervisor_Cluster_IP kubectl apply -f tks.yaml
맺음말
보시다시피 임의 CA 인증서를 추가하는 작업은 이제 vSphere with Tanzu에서 간단하며 적용 범위가 넓습니다. 하지만 이 새로운 기능은 새로운 Docker Hub 속도 제한 규칙이나 다른 이유로 인해 내부 레지스트리를 실행하는 사용자에게 매우 유용합니다.
이제 배포 후 클러스터를 수동으로 편집할 필요 없이 자체 서명된 CA 인증서 또는 내부 CA에서 서명한 인증서를 생성 시 TKG 클러스터에 할당할 수 있습니다.