Harbor 是一个开源容器注册表。可以将用于 Harbor 注册表的 TKG 扩展部署为要部署到 Tanzu Kubernetes 集群的容器映像的专用注册表存储。
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 集群。
- 下载 TKG 扩展 v1.3.1 包到运行 kubectl 命令的客户端主机。
- 在目标集群上安装 TKG 扩展必备条件。
Harbor 扩展的其他要求
- Harbor 扩展需要使用默认的 PVC 存储类。请参见查看 TKG 扩展的持久存储要求。
- Harbor 扩展需要 HTTP/S 输入。具体来说,Harbor 服务通过 Contour 扩展中的 Envoy 服务公开。作为必备条件,请部署 Contour 扩展。请参见部署和管理用于 Contour Ingress 的 TKG 扩展。
- 如果对 主管集群 使用的是 NSX-T 网络连接,请创建 LoadBalancer 类型的 Envoy 服务。
- 如果对 主管集群 使用的是 vSphere vDS 网络连接,请创建 LoadBalancer 类型或 NodePort 类型的 Envoy 服务,具体取决于您的环境和要求。
- Harbor 扩展需要使用 DNS。安装 Harbor 扩展后,需要配置 DNS。
- 出于测试和验证目的,请将 Harbor 和 Notary FQDN 添加到本地 /etc/hosts 文件中。以下说明介绍了如何执行此操作。
- 在生产环境中,Harbor 要求本地 DNS 服务器上具有 DNS 区域(如 BIND)或公有云上具有 DNS 区域(如 AWS Route53、Azure DNS 或 Google CloudDNS)。设置 DNS 后,要在 DNS 服务器中自动注册 Harbor FQDN,请安装外部 DNS 扩展。请参见部署和管理用于外部 DNS 服务发现的 TKG 扩展。
部署 Harbor 扩展
容器 | 资源类型 | 副本 | 描述 |
---|---|---|---|
harbor-core |
部署 | 1 | 用于 Envoy 的管理和配置服务器 |
harbor-database |
Pod | 1 | Postgres 数据库 |
harbor-jobservice |
部署 | 1 | Harbor 作业服务 |
harbor-notary-server |
部署 | 1 | Harbor Notary 服务 |
harbor-notary-signer |
部署 | 1 | Harbor Notary |
harbor-portal |
部署 | 1 | Harbor Web 界面 |
harbor-redis |
Pod | 1 | Harbor Redis 实例 |
harbor-registry |
部署 | 2 | Harbor 容器注册表实例 |
harbor-trivy |
Pod | 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 类型的 Envoy 输入服务,请将此设置保留为默认值
443
。如果对 主管集群 使用的是 vDS 网络连接,进而使用 NodePort 类型的 Envoy 输入服务,请将此值设置为与 Envoy 节点端口相匹配。
clair.enabled
为了支持 Trivy,Clair 映像扫描仪已弃用。这两者均在配置文件中启用。
要禁用 Clair,请将其值设置为
false
。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 pod 的状态:
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 类型的 Envoy 服务为 Harbor 配置 DNS(NSX-T 网络连接)
- 获取 LoadBalancer 类型的 Envoy 服务的
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 Web 界面。
- 在 DNS 服务器上创建两个 CNAME 记录,以将 Envoy 服务负载均衡器
External-IP
地址映射到 Harbor FQDN 和 Notary FQDN。 - 安装外部 DNS 扩展。请参见部署和管理用于外部 DNS 服务发现的 TKG 扩展。
使用 NodePort 类型的 Envoy 服务为 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 Web 界面。
- 在 DNS 服务器上创建两个 CNAME 记录,以将工作节点 IP 地址映射到 Harbor FQDN 和 Notary FQDN。
- 安装外部 DNS 扩展。请参见部署和管理用于外部 DNS 服务发现的 TKG 扩展。
登录到 Harbor Web 界面
- 访问 Harbor 注册表 Web 界面 (https://core.harbor.domain) 或您使用的主机名。
- 使用用户名 admin 和生成的密码(放在
harbor-data-values.yaml
文件中)登录到 Harbor。 - 验证您是否可以访问 Harbor 用户界面。
- 获取 Harbor CA 证书。
在 Harbor 界面中,选择新项目。
,或者创建单击注册表证书并下载 Harbor CA 证书 (ca.crt)。
- 将 Harbor CA 证书添加到 Docker 客户端的信任库中,以便可以将容器映像推送到 Harbor 注册表以及从 Harbor 注册表中提取容器映像。请参见使用嵌入式 Harbor 注册表 证书配置 Docker 客户端。
- 有关使用 Harbor 的详细信息,请参阅 Harbor 文档。
对 Harbor 注册表部署进行故障排除
如果部署或协调失败,请运行 kubectl get pods -n tanzu-system-registry
以查看 pod 状态。harbor
Pod 应为 Running
。如果 pod 状态为 ImagePullBackOff
或 ImageCrashLoopBackOff
,则无法提取容器映像。检查数据值和扩展 YAML 文件中的注册表 URL,并确保它们准确无误。
name-XXXX
是运行
kubectl get pods -A
时的唯一 pod 名称:
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 扩展。