Harbor 는 오픈 소스 컨테이너 레지스트리입니다. Tanzu Kubernetes 클러스터에 배포하려는 컨테이너 이미지의 개인 레지스트리 저장소로 Harbor 레지스트리용 TKG 확장을 배포할 수 있습니다.
Harbor 확장 버전 종속성
구성 요소 | 최소 버전 |
---|---|
vCenter Server | 7.0.2.00400 |
vSphere 네임스페이스 | 0.0.10-18245956 |
감독자 클러스터 | v1.20.2+vmware.1-vsc0.0.10-18245956 |
Tanzu Kubernetes 릴리스 | v1.20.7+vmware.1-tkg.1.7fb9067 |
Harbor 확장 사전 요구 사항
- 클러스터를 프로비저닝합니다. TKGS v1alpha2 API를 사용하여 Tanzu Kubernetes 클러스터를 프로비저닝하는 워크플로의 내용을 참조하십시오.
- 클러스터에 연결합니다. vCenter Single Sign-On 사용자로 Tanzu Kubernetes 클러스터에 연결의 내용을 참조하십시오.
- kubectl 명령을 실행하는 클라이언트 호스트에 TKG 확장 v1.3.1 번들 다운로드합니다.
- 대상 클러스터에 TKG 확장 사전 요구 사항 설치합니다.
Harbor 확장 추가 요구 사항
- Harbor 확장에는 기본 PVC 스토리지 클래스가 필요합니다. TKG 확장에 대한 영구 스토리지 요구 사항 검토의 내용을 참조하십시오.
- Harbor 확장에는 HTTP/S 수신이 필요합니다. 특히 Harbor 서비스는 Contour 확장의 엔보이 서비스를 통해 노출됩니다. 사전 요구 사항으로 Contour 확장을 배포합니다. Contour 수신용 TKG 확장 배포 및 관리의 내용을 참조하십시오.
- 감독자 클러스터에 NSX-T 네트워킹을 사용하는 경우 LoadBalancer 유형의 엔보이 서비스를 생성합니다.
- 감독자 클러스터에 vSphere vDS 네트워킹을 사용하는 경우에는 환경에 따라 LoadBalancer 유형 또는 NodePort 유형의 엔보이 서비스를 생성합니다.
- Harbor 확장에는 DNS가 필요합니다. Harbor 확장을 설치한 후에는 DNS를 구성해야 합니다.
- 테스트 및 확인을 위해 Harbor 및 Notary FQDN을 로컬 /etc/hosts 파일에 추가합니다. 이 작업을 수행하는 방법은 아래 지침에 설명되어 있습니다.
- 운영 환경에서 Harbor는 로컬 DNS 서버(예: BIND) 또는 공용 클라우드(예: AWS Route53, Azure DNS 또는 Google CloudDNS)에 DNS 영역이 필요합니다. DNS를 설정한 후 Harbor FQDN을 DNS 서버에 자동으로 등록하려면 외부 DNS 확장을 설치합니다. 외부 DNS 서비스 검색을 위한 TKG 확장 배포 및 관리의 내용을 참조하십시오.
Harbor 확장 배포
컨테이너 | 리소스 유형 | 복제 | 설명 |
---|---|---|---|
harbor-core |
배포 | 1 | 엔보이용 관리 및 구성 서버 |
harbor-database |
포드 | 1 | Postgres 데이터베이스 |
harbor-jobservice |
배포 | 1 | Harbor 작업 서비스 |
harbor-notary-server |
배포 | 1 | Harbor Notary 서비스 |
harbor-notary-signer |
배포 | 1 | Harbor Notary |
harbor-portal |
배포 | 1 | Harbor 웹 인터페이스 |
harbor-redis |
포드 | 1 | Harbor Redis 인스턴스 |
harbor-registry |
배포 | 2 | Harbor 컨테이너 레지스트리 인스턴스 |
harbor-trivy |
포드 | 1 | Harbor 이미지 취약성 스캐너 |
- 각각의 확장 사전 요구 사항을 완료했는지 확인합니다. Harbor 확장 사전 요구 사항 및 Harbor 확장 추가 요구 사항의 내용을 참조하십시오.
- 디렉토리를 Harbor 확장으로 변경합니다.
cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
tanzu-system-registry
네임스페이스와 Harbor 서비스 계정 및 역할을 생성합니다.kubectl apply -f namespace-role.yaml
- Harbor 데이터 값 파일을 생성합니다.
cp harbor-data-values.yaml.example harbor-data-values.yaml
harbor-data-values.yaml
에 필수 암호를 지정합니다.Harbor 레지스트리에 필요한 몇 가지 암호가 아래 표에 나열되고 설명되어 있습니다.암호 설명 harborAdminPassword
Harbor 관리자의 초기 암호입니다. secretKey
암호화에 사용되는 비밀 키입니다. 16자의 문자열이어야 합니다. database.password
Postgres 데이터베이스의 초기 암호입니다. core.secret
암호는 코어 서버가 다른 구성 요소와 통신할 때 사용됩니다. core.xsrfKey
XSRF 키입니다. 32자의 문자열이어야 합니다. jobservice.secret
암호는 작업 서비스가 다른 구성 요소와 통신할 때 사용됩니다. registry.secret
암호는 클라이언트 및 레지스트리 스토리지 백엔드에서 업로드 상태를 보호하는 데 사용됩니다. harbor-data-values.yaml
파일을 채우려면 다음 명령을 실행합니다.bash generate-passwords.sh harbor-data-values.yaml
성공하면 다음 메시지가 표시됩니다.Successfully generated random passwords and secrets in harbor-data-values.yaml
harbor-data-values.yaml
파일을 열고 필수 암호를 확인합니다.- 필요한 경우
harbor-data-values.yaml
에 다른 Harbor 구성 값을 지정합니다. 일반적으로 업데이트되는 값에는 다음이 포함될 수 있습니다.구성 필드 설명 hostname
기본 Harbor 호스트 이름은
core.harbor.domain
입니다.필요한 경우 요구 사항에 맞게 이 값을 변경합니다.
port.https
기본값은
443
입니다.감독자 클러스터에 NSX-T 네트워킹을 사용하며 그 결과 LoadBalancer 유형의 엔보이 수신 서비스를 사용하는 경우 이 설정을 기본값
443
으로 둡니다.감독자 클러스터에 vDS 네트워킹을 사용하며 그 결과 NodePort 유형의 엔보이 수신 서비스를 사용하는 경우에는 이 값을 엔보이 노드 포트와 일치하도록 설정합니다.
clair.enabled
Clair 이미지 스캐너는 Trivy를 위해 더 이상 사용되지 않습니다. 둘 다 구성 파일에서 사용하도록 설정됩니다.
값을
false
로 설정하여 Clair를 사용하지 않도록 설정합니다.persistence.persistentVolumeClaim. <component>.accessMode
이 설정에는 몇 가지 인스턴스가 있습니다.
기본값은
ReadWriteOnce
입니다.ReadWriteMany
는 향후 릴리스에서 지원될 예정입니다.imageChartStorage.type
기본값은
filesystem
입니다.필요한 경우 변경하고 사용 중인 스토리지를 구성합니다.
proxy
원하는 경우 Harbor에 대한 프록시를 구성합니다. 프록시가 구성된 경우 기본 noProxy
값이 필요합니다. - 데이터 값으로 암호를 생성합니다.
kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
tanzu-system-registry
네임스페이스에secret/harbor-data-values
가 생성됩니다. 다음 명령을 실행하여 이를 확인합니다.kubectl get secrets -n tanzu-system-registry
- Harbor 확장을 배포합니다.
kubectl apply -f harbor-extension.yaml
성공하면
app.kappctrl.k14s.io/harbor created
가 표시됩니다. - Harbor 애플리케이션의 상태를 확인합니다.
kubectl get app harbor -n tanzu-system-registry
성공하면 상태가Reconciling
에서Reconcile succeeded
로 변경됩니다.NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconciling 96s 98s
NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconcile succeeded 39s 2m29s
상태가Reconcile failed
인 경우 Harbor 레지스트리 배포 문제 해결 항목을 참조하십시오. - Harbor 확장에 대한 자세한 정보를 봅니다.
kubectl get app harbor -n tanzu-system-registry -o yaml
- Harbor 배포 개체의 상태를 봅니다.
kubectl get deployments -n tanzu-system-registry
성공하면 다음 배포가 표시됩니다.
NAME READY UP-TO-DATE AVAILABLE AGE harbor-core 1/1 1 1 5m16s harbor-jobservice 1/1 1 1 5m16s harbor-notary-server 1/1 1 1 5m16s harbor-notary-signer 1/1 1 1 5m16s harbor-portal 1/1 1 1 5m16s harbor-registry 1/1 1 1 5m16s
- Harbor 포드의 상태를 봅니다.
kubectl get pods -n tanzu-system-registry
NAME READY STATUS RESTARTS AGE harbor-core-9cbf4b79d-gxvgx 1/1 Running 0 7m11s harbor-database-0 1/1 Running 0 7m11s harbor-jobservice-6b656ccb95-lm47d 1/1 Running 0 7m11s harbor-notary-server-8494c684db-gm7jf 1/1 Running 0 7m11s harbor-notary-signer-6f96b549d4-dzcnm 1/1 Running 0 7m11s harbor-portal-5b8f4ddbd-qdnp2 1/1 Running 0 7m11s harbor-redis-0 1/1 Running 0 7m11s harbor-registry-688894c58d-72txm 2/2 Running 0 7m11s harbor-trivy-0 1/1 Running 0 7m11s
- 필요한 경우 Harbor 설치 문제를 해결합니다. Harbor 레지스트리 배포 문제 해결의 내용을 참조하십시오.
LoadBalancer 유형의 엔보이 서비스를 사용하여 Harbor용 DNS 구성(NSX-T 네트워킹)
- LoadBalancer 유형의 엔보이 서비스에 대한
External-IP
주소를 가져옵니다.kubectl get service envoy -n tanzu-system-ingress
반환된External-IP
주소가 다음과 같이 표시됩니다.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE envoy LoadBalancer 10.99.25.220 10.195.141.17 80:30437/TCP,443:30589/TCP 3h27m
또는 다음 명령을 사용하여External-IP
주소를 가져올 수 있습니다.kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
- Harbor 확장 설치를 확인하려면 로드 밸런서의
External-IP
주소에 매핑된 Harbor 및 Notary FQDN으로 로컬/etc/hosts
파일을 업데이트합니다. 예를 들면 다음과 같습니다.127.0.0.1 localhost 127.0.1.1 ubuntu # TKGS Harbor with Envoy Load Balancer IP 10.195.141.17 core.harbor.domain 10.195.141.17 core.notary.harbor.domain
- Harbor 확장 설치를 확인하려면 Harbor에 로그인합니다. Harbor 웹 인터페이스에 로그인의 내용을 참조하십시오.
- 엔보이 서비스 로드 밸런서
External-IP
주소를 Harbor FQDN 및 Notary FQDN에 매핑하는 2개의 CNAME 레코드를 DNS 서버에 생성합니다. - 외부 DNS 확장을 설치합니다. 외부 DNS 서비스 검색을 위한 TKG 확장 배포 및 관리의 내용을 참조하십시오.
NodePort 유형의 엔보이 서비스를 사용하여 Harbor용 DNS 구성(vDS 네트워킹)
harbor-data-values.yaml
파일에 올바른
port.https
값을 지정해야 합니다.
- 클러스터가 프로비저닝된 vSphere 네임스페이스로 컨텍스트를 전환합니다.
kubectl config use-context VSPHERE-NAMESPACE
- 클러스터의 노드를 나열합니다.
kubectl get virtualmachines
클러스터 노드가 표시됩니다. 예를 들면 다음과 같습니다.NAME POWERSTATE AGE tkgs-cluster-X-control-plane-6dgln poweredOn 6h7m tkgs-cluster-X-control-plane-j6hq6 poweredOn 6h10m tkgs-cluster-X-control-plane-xc25f poweredOn 6h14m tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm poweredOn 6h12m tkgs-cluster-X-workers-9twdr-59bc54dc97-pjptr poweredOn 6h12m tkgs-cluster-X-workers-9twdr-59bc54dc97-t45mn poweredOn 6h12m
- 작업자 노드 중 하나를 선택하고 다음 명령을 사용하여 설명합니다.
kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
- 가상 시스템의 IP 주소(예:
Vm Ip: 10.115.22.43
)를 찾습니다. - Harbor 확장 설치를 확인하려면 작업자 노드 IP 주소에 매핑된 Harbor 및 Notary FQDN으로 로컬
/etc/hosts
파일을 업데이트합니다. 예를 들면 다음과 같습니다.127.0.0.1 localhost 127.0.1.1 ubuntu # TKGS Harbor with Envoy NodePort 10.115.22.43 core.harbor.domain 10.115.22.43 core.notary.harbor.domain
- Harbor 확장 설치를 확인하려면 Harbor에 로그인합니다. Harbor 웹 인터페이스에 로그인의 내용을 참조하십시오.
- 작업자 노드 IP 주소를 Harbor FQDN 및 Notary FQDN에 매핑하는 2개의 CNAME 레코드를 DNS 서버에 생성합니다.
- 외부 DNS 확장을 설치합니다. 외부 DNS 서비스 검색을 위한 TKG 확장 배포 및 관리의 내용을 참조하십시오.
Harbor 웹 인터페이스에 로그인
- Harbor 레지스트리 웹 인터페이스(https://core.harbor.domain) 또는 사용한 호스트 이름에 액세스합니다.
harbor-data-values.yaml
파일에 입력한 사용자 이름 admin과 생성된 암호를 사용하여 Harbor에 로그인합니다.- Harbor 사용자 인터페이스에 액세스할 수 있는지 확인합니다.
- Harbor CA 인증서를 가져옵니다.
Harbor 인터페이스에서 새 프로젝트를 생성합니다.
를 선택하거나레지스트리 인증서를 클릭하고 Harbor CA 인증서(ca.crt)를 다운로드합니다.
- Harbor 레지스트리에서 컨테이너 이미지를 푸시하고 끌어올 수 있도록 Harbor CA 인증서를 Docker 클라이언트의 신뢰 저장소에 추가합니다. 내장된 Harbor 레지스트리 인증서를 사용하여 Docker 클라이언트 구성의 내용을 참조하십시오.
- Harbor 사용에 대한 자세한 내용은 Harbor 설명서를 참조하십시오.
Harbor 레지스트리 배포 문제 해결
배포 또는 조정이 실패하면 kubectl get pods -n tanzu-system-registry
를 실행하여 포드 상태를 확인합니다. harbor
포드는 Running
이어야 합니다. 포드 상태가 ImagePullBackOff
또는 ImageCrashLoopBackOff
이면 컨테이너 이미지를 끌어올 수 없습니다. 데이터 값 및 확장 YAML 파일에서 레지스트리 URL을 확인하고 정확한지 확인합니다.
name-XXXX
는
kubectl get pods -A
를 실행할 때 고유한 포드 이름입니다.
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry
Harbor 확장 업데이트
Tanzu Kubernetes 클러스터에 배포된 Contour 확장을 업데이트합니다.
- 암호에서 Harbor 데이터 값을 얻습니다.
kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
harbor-data-values.yaml
에서 Harbor 데이터 값을 업데이트합니다.- Harbor 데이터 값 암호를 업데이트합니다.
kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry -o yaml --dry-run | kubectl replace -f-
Harbor 확장이 새 데이터 값으로 조정됩니다.참고: 기본적으로 kapp-controller는 5분마다 애플리케이션을 동기화합니다. 업데이트는 5분 이내에 적용됩니다. 업데이트를 즉시 적용하려면harbor-extension.yaml
의syncPeriod
를 더 작은 값으로 변경하고kubectl apply -f harbor-extension.yaml
을 사용하여 Contour 확장을 적용합니다. - 확장의 상태를 확인합니다.
kubectl get app harbor -n tanzu-system-registry
Contour가 업데이트되면 Contour 애플리케이션 상태가
Reconcile Succeeded
로 변경됩니다. - 자세한 상태를 살펴보고 문제를 해결합니다.
kubectl get app harbor -n tanzu-system-registry -o yaml
Harbor 확장 삭제
Tanzu Kubernetes 클러스터에서 Harbor 확장을 삭제합니다.
- 디렉토리를 Harbor 확장 파일을 다운로드한 위치로 변경합니다.
cd /extensions/registry/harbor/
- Harbor 애플리케이션을 삭제합니다.
kubectl delete app harbor -n tanzu-system-registry
예상 결과:app.kappctrl.k14s.io "harbor" deleted
- Harbor 애플리케이션이 삭제되었는지 확인합니다.
kubectl get app Harbor -n tanzu-system-registry
예상 결과: 애플리케이션이Not Found
상태입니다.apps.kappctrl.k14s.io "harbor" not found
- 레지스트리 네임스페이스를 삭제합니다.
Harbor 확장 및 애플리케이션이 완전히 삭제된 것을 확인한 후에만 네임스페이스 및 역할 개체를 삭제해도 안전합니다.
kubectl delete -f namespace-role.yaml
예상 결과: Harbor가 배포된 네임스페이스 및 연결된 역할 기반 액세스 제어 개체가 삭제됩니다.namespace "tanzu-system-registry" deleted serviceaccount "harbor-extension-sa" deleted role.rbac.authorization.k8s.io "harbor-extension-role" deleted rolebinding.rbac.authorization.k8s.io "harbor-extension-rolebinding" deleted clusterrole.rbac.authorization.k8s.io "harbor-extension-cluster-role" deleted clusterrolebinding.rbac.authorization.k8s.io "harbor-extension-cluster-rolebinding" deleted
Harbor 확장 업그레이드
- Harbor configmap을 얻습니다.
kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
- 기존 Harbor 배포를 삭제합니다. Harbor 확장 삭제의 내용을 참조하십시오.
- Harbor 확장을 배포합니다. Harbor 확장 배포의 내용을 참조하십시오.