托管 Harbor 应该选择什么访问类型¶
在创建托管 Harbor
时,需要选择访问类型。目前支持两种类型:Ingress 和 NodePort。 下表说明了这两种访问类型的优缺点;
Ingress | NodePort | |
---|---|---|
优点 |
|
|
缺点 |
|
|
Tip
- 在 生产环境 中,建议使用 Ingress 方式,因为 Ingress 可以使用 HTTPS 协议, 可以使用自签证书或者购买证书,这样可以避免在拉取镜像时需要配置非安全仓库的问题。
- 在 测试环境 中,建议使用 NodePort 方式,因为NodePort方式不依赖任何组件, 可快速启动服务进行 Demo 和试用。
Ingress¶
前提条件:
- 集群必须安装 Ingress 组件,Ingress 组件可以是 Nginx、Traefik、HAProxy 等,具体安装方法请参考 Ingress。
- 集群必须安装 DNS 服务,DNS 服务可以是 CoreDNS、KubeDNS、Bind 等,具体安装方法请参考 DNS。
- 集群必须安装 LoadBalancer 组件,LoadBalancer 组件可以是 MetalLB、F5 等,具体安装方法请参考 LoadBalancer。
Ingress 流程
Ingress 可以从集群外部暴露 HTTP 和 HTTPS 路由到集群内部的服务,流量路由由 Ingress 资源上定义的规则控制。 在托管 Harbor 中 Ingress 使用流程如下图所示。
flowchart LR
subgraph cluster[Cluster]
direction LR
ingress[Ingress] -->|路由规则| harbor[Harbor Service]
harbor --> pod1[Pod]
harbor --> pod2[Pod]
end
client([Client]) -.->|以 LB 或 NodePort 暴露服务| ingress
classDef plain fill:#ddd,stroke:#fff,stroke-width:1px,color:#000;
classDef k8s fill:#326ce5,stroke:#fff,stroke-width:1px,color:#fff;
classDef cluster fill:#fff,stroke:#bbb,stroke-width:1px,color:#326ce5;
class client plain;
class ingress,harbor,pod1,pod2 k8s
对于 私有云 ,使用 Ingress 部署完托管 Harbor 之后,需要在 DNS 服务中添加域名解析, 将域名解析到 LoadBalancer 的 IP 地址上,这样用户就可以通过域名访问 Harbor 了; 添加 DNS 域名解析需要在 Kubernetes 集群内和 Kubernetes 集群外分别进行操作,具体操作步骤如下:
在 Kubernetes 集群内添加 DNS 域名解析¶
在 Kubernetes 集群内,需要在 CoreDNS 组件中添加 DNS 域名解析,具体操作步骤如下:
-
进入 CoreDNS 组件的 ConfigMap 中,执行如下命令:
-
进入 CoreDNS 组件的 Configmap 中后,执行如下命令,将
harbor.example.com
解析到 LoadBalancer 的 IP 地址上:Note
harbor.example.com
为用户自定义的域名,LoadBalancer 的 IP 地址为 Ingress 的 IP 地址。 -
保存退出,会重新创建 CoreDNS Pod:
在 Kubernetes 集群外添加 DNS 域名解析¶
在集群外也是通过单独部署一个 CoreDNS 组件来实现 DNS 域名解析,然后配置域名。参照上述第 2 步。
如果用户的域名是公网域名,那就不需要做上述步骤,公网域名能被解析。
NodePort¶
NodePort 是一种访问 Kubernetes 集群中 Service 的方法,它会在每个 Node 上打开一个端口, 该端口会将流量转发到 Service 的端口上。NodePort 使用流程如下图所示。
flowchart LR
subgraph cluster[Cluster]
direction LR
harbor[Harbor Service]
harbor --> pod1[Pod]
harbor --> pod2[Pod]
end
client([Client]) -.->|以 NodePort 暴露服务| harbor
classDef plain fill:#ddd,stroke:#fff,stroke-width:1px,color:#000;
classDef k8s fill:#326ce5,stroke:#fff,stroke-width:1px,color:#fff;
classDef cluster fill:#fff,stroke:#bbb,stroke-width:1px,color:#326ce5;
class client plain;
class ingress,harbor,pod1,pod2 k8s