Harbor高可用集群网络配置:GitHub_Trending/ha/harbor-helm DNS与Ingress控制器
在Kubernetes环境中部署Harbor高可用集群时,网络配置是确保服务稳定性的核心环节。本文将聚焦于GitHub_Trending/ha/harbor-helm项目中的DNS解析与Ingress控制器配置,通过实战案例帮助运维人员快速掌握高可用网络架构的关键要点。
高可用网络架构概览
Harbor高可用集群的网络层需要实现三个核心目标:服务暴露、流量分发和故障隔离。根据官方高可用文档,Kubernetes环境下的网络架构采用"Ingress控制器+Service网格"的双层模型,配合DNS服务发现实现跨节点流量调度。
核心网络组件
- Ingress控制器:作为集群入口,负责HTTP/HTTPS流量路由(支持Nginx、GCE等多种实现)
- Service资源:Kubernetes内部服务发现机制,提供固定访问点
- DNS服务:通过CoreDNS实现服务名到ClusterIP的解析
- 内部TLS:可选配置,加密组件间通信(默认禁用)
DNS配置实战
Harbor集群的DNS配置通过Helm模板中的服务命名规则实现标准化。在templates/_helpers.tpl中定义了统一的服务命名函数,确保所有组件遵循release-name-component的命名规范。
服务命名规则
# 服务命名模板示例(来自templates/_helpers.tpl)
{{- define "harbor.core" -}}
{{- printf "%s-core" (include "harbor.fullname" .) -}}
{{- end -}}
{{- define "harbor.portal" -}}
{{- printf "%s-portal" (include "harbor.fullname" .) -}}
{{- end -}}
内部DNS解析配置
- 服务发现:所有组件通过Service名称相互访问,如Core服务通过
{{ template "harbor.core" . }}获取访问地址 - 外部URL配置:在values.yaml中设置
externalURL参数,作为集群对外暴露的统一入口:externalURL: https://core.harbor.domain # 需与Ingress主机名保持一致 - 无代理配置:通过
noProxy参数排除内部服务域名,避免流量被代理拦截:noProxy: 127.0.0.1,localhost,.local,.internal,{{ template "harbor.core" . }},{{ template "harbor.portal" . }}
Ingress控制器配置
Ingress控制器是Harbor集群的流量入口,templates/ingress/ingress.yaml提供了可适配多种控制器的配置模板,支持Kubernetes 1.14+版本的API规范。
多版本API兼容
模板通过条件判断自动适配不同Kubernetes版本的Ingress API:
# API版本自动选择(来自templates/ingress/ingress.yaml)
{{- if semverCompare "<1.14-0" (include "harbor.ingress.kubeVersion" .) }}
apiVersion: extensions/v1beta1
{{- else if semverCompare "<1.19-0" (include "harbor.ingress.kubeVersion" .) }}
apiVersion: networking.k8s.io/v1beta1
{{- else }}
apiVersion: networking.k8s.io/v1
{{- end }}
路径路由规则
根据控制器类型自动生成不同的路径匹配策略,默认配置如下:
| 路径 | 后端服务 | 说明 |
|---|---|---|
/ | portal | Web控制台 |
/api/ | core | API接口 |
/service/ | core | 内部服务通信 |
/v2/ | core | Docker Registry v2 API |
/c/ | core | Chart仓库 |
控制器类型适配
支持多种Ingress控制器,通过expose.ingress.controller参数指定:
# values.yaml中的控制器配置
expose:
ingress:
controller: default # 可选:default/gce/ncp/alb/f5-bigip
annotations:
ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-body-size: "0" # 允许大文件上传
Gateway API配置(可选)
对于Kubernetes 1.19+环境,项目提供了Gateway API( networking.k8s.io/v1)的支持,通过templates/gateway-apis/route.yaml实现更细粒度的流量控制。
HTTPRoute配置示例
# Gateway API路由规则(来自templates/gateway-apis/route.yaml)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
spec:
parentRefs:
- name: envoy-internal # 引用现有Gateway资源
namespace: networking
hostnames:
- "harbor.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /api/
backendRefs:
- name: {{ template "harbor.core" . }}
port: {{ template "harbor.core.servicePort" . }}
高可用配置最佳实践
多可用区部署
通过拓扑分布约束实现Ingress控制器跨节点部署:
# values.yaml中的拓扑分布配置
nginx:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
会话亲和性配置
对于需要保持会话的场景,可通过Ingress注解启用会话亲和:
# Ingress会话亲和配置
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "harbor-session"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
性能优化参数
-
连接超时设置:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "30" nginx.ingress.kubernetes.io/proxy-read-timeout: "1800" -
SSL优化:
nginx.ingress.kubernetes.io/ssl-protocols: "TLSv1.2 TLSv1.3" nginx.ingress.kubernetes.io/ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"
验证与测试
网络连通性测试
部署完成后,通过以下命令验证Ingress规则是否生效:
# 查看Ingress资源
kubectl get ingress -n harbor
# 测试API连通性
curl -k https://core.harbor.domain/api/v2.0/ping
故障转移测试
-
节点故障模拟:
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data -
流量切换验证:
watch kubectl get pods -n harbor -o wide # 观察Pod重新调度
总结与展望
Harbor高可用集群的网络配置是一个系统性工程,需要Ingress控制器、DNS服务和Service资源的协同工作。通过合理配置templates/ingress/ingress.yaml和values.yaml中的参数,可实现跨节点、跨可用区的流量调度。未来版本将进一步优化Gateway API支持,提供更灵活的流量管理能力。
建议收藏本文以便后续配置参考,下期将推出《Harbor高可用存储方案:PVC与对象存储实战》,深入探讨数据持久化策略。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




