Harbor 是一个开源容器注册表。可以将用于 Harbor 注册表的 Tanzu 软件包安装为要部署到 TKG 2 集群的容器映像的专用注册表存储。
软件包要求
安装用于 Harbor 注册表的 Tanzu 软件包时,请遵循以下要求。
- 使用默认存储类置备 TKG 2 集群。请参见在主管上置备 TKG 2 集群。
注: Harbor 需要默认持久存储类。如果您的 TKG 2 集群没有默认存储类,则可以对其进行修补。请参见 Tanzu 软件包的持久存储要求。
- 连接到 TKG 2 集群。请参见管理 主管 上的 TKG 2 集群的身份和访问权限。
- 安装 Tanzu 软件包必备条件。请参见使用 Kubectl 安装 Tanzu 软件包必备条件
此外,Harbor 注册表在安装前和安装后还有其他要求。
- Harbor 扩展需要 HTTP/S 输入。具体来说,Harbor 服务通过 Contour 扩展中的 Envoy 服务公开。作为必备条件,请部署 Contour 软件包。请参见使用 Kubectl 安装用于 Contour Ingress 的 Tanzu 软件包。
- 如果对 主管 使用的是 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 扩展。
Harbor 组件
用于 Harbor 注册表的 Tanzu 软件包将在集群中安装多个容器。有关详细信息,请参见
https://goharbor.io/。
容器 | 资源类型 | 副本 | 描述 |
---|---|---|---|
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 软件包
要使用 Tanzu 软件包安装 Harbor 注册表,请完成以下步骤。
- 创建
harbor.yaml
规范请参阅以下示例。将harbor-data-values
部分中的值替换为环境的相应值,包括主机名、存储类、TLS 密钥和密码。apiVersion: v1 kind: ServiceAccount metadata: name: harbor-sa namespace: tkg-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: habor-role-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: harbor-sa namespace: tkg-system --- apiVersion: packaging.carvel.dev/v1alpha1 kind: PackageInstall metadata: name: harbor namespace: tkg-system spec: serviceAccountName: harbor-sa packageRef: refName: harbor.tanzu.vmware.com versionSelection: constraints: 2.5.3+vmware.1-tkg.1 values: - secretRef: name: harbor-data-values --- apiVersion: v1 kind: Secret metadata: name: harbor-data-values namespace: tkg-system stringData: values.yml: | namespace: tanzu-system-registry hostname: harbor.example.com port: https: 443 logLevel: info tlsCertificate: tls.crt: "" tls.key: "" ca.crt: tlsCertificateSecretName: enableContourHttpProxy: true harborAdminPassword: <ENTER-STRONG-PASSWORD-HERE> secretKey: <ENTER-SECRET-KEY> database: password: <ENTER-STRONG-PASSWORD-HERE> shmSizeLimit: maxIdleConns: maxOpenConns: exporter: cacheDuration: core: replicas: 1 secret: <ENTER-SECRET> xsrfKey: <ENTER-XSRF-KEY-WHICH-IS-AN-ALPHANUMERIC-STRING-WITH-32-CHARS> jobservice: replicas: 1 secret: <ENTER-SECRET> registry: replicas: 1 secret: <ENTER-SECRET> notary: enabled: true trivy: enabled: true replicas: 1 gitHubToken: "" skipUpdate: false persistence: persistentVolumeClaim: registry: existingClaim: "" storageClass: "tkg2-storage-profile" subPath: "" accessMode: ReadWriteOnce size: 50Gi jobservice: existingClaim: "" storageClass: "tkg2-storage-profile" subPath: "" accessMode: ReadWriteOnce size: 10Gi database: existingClaim: "" storageClass: "tkg2-storage-profile" subPath: "" accessMode: ReadWriteOnce size: 10Gi redis: existingClaim: "" storageClass: "tkg2-storage-profile" subPath: "" accessMode: ReadWriteOnce size: 10Gi trivy: existingClaim: "" storageClass: "tkg2-storage-profile" subPath: "" accessMode: ReadWriteOnce size: 10Gi proxy: httpProxy: httpsProxy: noProxy: 127.0.0.1,localhost,.local,.internal pspNames: vmware-system-restricted network: ipFamilies: ["IPv4", "IPv6"]
- 安装 Harbor。
kubectl apply -f harbor.yaml
使用 LoadBalancer 类型的 Envoy 服务为 Harbor 配置 DNS(NSX-T 网络连接)
如果通过 LoadBalancer 公开必备的 Envoy 服务,请获取负载均衡器的外部 IP 地址,并创建 Harbor FQDN 的 DNS 记录。
- 获取 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 #TKG2 Harbor with Envoy Load Balancer IP 10.195.141.17 core.harbor.domain 10.195.141.17 core.notary.harbor.domain
- 要验证 Harbor 扩展的安装,请登录到 Harbor。
- 在 DNS 服务器上创建两个 CNAME 记录,以将 Envoy 服务负载均衡器
External-IP
地址映射到 Harbor FQDN 和 Notary FQDN。 - 安装外部 DNS 扩展。
使用 NodePort 类型的 Envoy 服务为 Harbor 配置 DNS(vDS 网络连接)
如果通过 NodePort 公开必备的 Envoy 服务,请获取工作节点的虚拟机 IP 地址,并创建 Harbor FQDN 的 DNS 记录。
注: 要使用 NodePort,必须在
harbor-data-values.yaml
文件中指定正确的
port.https
值。
- 将上下文切换到置备了集群的 vSphere 命名空间。
kubectl config use-context VSPHERE-NAMESPACE
- 列出集群中的节点。
kubectl get virtualmachines
- 选择其中一个工作节点,然后使用以下命令对其进行描述。
kubectl describe virtualmachines tkg2-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 #TKG2 Harbor with Envoy NodePort 10.115.22.43 core.harbor.domain 10.115.22.43 core.notary.harbor.domain
- 要验证 Harbor 扩展的安装,请登录到 Harbor。
- 在 DNS 服务器上创建两个 CNAME 记录,以将工作节点 IP 地址映射到 Harbor FQDN 和 Notary FQDN。
- 安装外部 DNS 扩展。
登录到 Harbor Web 界面
安装并配置 Harbor 后,请登录并开始使用。
- 访问 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 注册表中提取容器映像。请参见将容器注册表与 主管 上的 TKG 2 集群配合使用。
- 有关使用 Harbor 的详细信息,请参阅 Harbor 文档。