服务与网络
服务与网络
本指南介绍 Polaris Helm Chart 所创建的 Kubernetes 服务,以及如何使用 Gateway API 或 Ingress 配置外部访问。
💡 提示
Kubernetes Gateway API 是对外暴露 Polaris 的推荐方式。与 Ingress 相比,它提供了更具表达力、更易扩展且面向角色的 API,也是 Kubernetes 流量管理的未来发展方向。
服务
Polaris Helm Chart 默认会创建以下服务:
主服务
主服务用于暴露 Polaris REST API。默认情况下,它是一个 ClusterIP 类型的服务,监听 8181 端口。
| 配置项 | 默认值 | 说明 |
|---|---|---|
service.type | ClusterIP | 服务类型(ClusterIP、NodePort、LoadBalancer) |
service.ports[0].port | 8181 | 服务监听的端口 |
service.ports[0].name | polaris-http | 端口名称 |
service.sessionAffinity | None | 会话亲和性(None 或 ClientIP) |
service.clusterIP | "" | 设置为 None 可创建无头服务 |
示例配置:
service:
type: ClusterIP
ports:
- name: polaris-http
port: 8181
protocol: TCP管理服务
管理服务暴露健康检查和指标端点。默认情况下,它是一个无头服务(clusterIP: None),监听端口 8182,非常适合 Prometheus 抓取和服务监控。
| 配置项 | 默认值 | 说明 |
|---|---|---|
managementService.type | ClusterIP | 服务类型 |
managementService.ports[0].port | 8182 | 管理服务监听的端口 |
managementService.ports[0].name | polaris-mgmt | 端口名称 |
managementService.clusterIP | None | 默认为无头服务 |
配置示例:
managementService:
type: ClusterIP
clusterIP: None # Headless service for metrics scraping
ports:
- name: polaris-mgmt
port: 8182
protocol: TCP额外服务
你可以使用 extraServices 定义额外的服务。当你需要以不同的服务配置暴露同一组 Pod 时,这非常有用,例如在默认的 ClusterIP 服务之外,还通过 LoadBalancer 暴露 API。
extraServices:
- nameSuffix: "lb"
type: LoadBalancer
ports:
- name: polaris-http
port: 8181
targetPort: 8181
protocol: TCP
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"这将创建一个名为 <release-name>-polaris-lb 的 LoadBalancer 类型的附加服务。
Gateway API
Kubernetes Gateway API 是比 Ingress 更具表达力和可扩展性的替代方案。Polaris Helm chart 支持创建 Gateway 和 HTTPRoute 资源。
📝 注意
Ingress 和 HTTPRoute 是互斥的,同一时间只能启用其中一个。
💡 提示
在大多数生产环境中,Gateway 资源是集群范围的,并由集群管理员管理。在这种情况下,你只需配置 HTTPRoute 以附着到现有的 Gateway 上即可。通过此 Helm chart 创建 Gateway 的选项是为小型部署或开发环境提供的便利功能。
前置条件
必须在你的集群中安装 Gateway API CRD。在大多数生产环境中,这由集群管理员负责。若要手动安装:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/latest/download/standard-install.yaml你还需要安装一个 Gateway 控制器(例如 Envoy Gateway、Istio、Contour),并定义一个 GatewayClass。
Gateway 配置
该 chart 可以创建一个 Gateway 资源,用于定义流量如何进入集群:
gateway:
enabled: true
className: "cluster-gateway"
listeners:
- name: http
protocol: HTTP
port: 80
- name: https
protocol: HTTPS
port: 443
hostname: "polaris.example.com"
tls:
mode: Terminate
certificateRefs:
- name: polaris-tls
kind: Secret具有静态 IP 地址的网关
为网关申请指定的 IP 地址:
gateway:
enabled: true
className: "eg"
listeners:
- name: http
protocol: HTTP
port: 80
addresses:
- type: IPAddress
value: 192.168.1.100HTTPRoute 配置
HTTPRoute 定义了请求如何从 Gateway 路由到 Polaris 服务:
httproute:
enabled: true
gatewayName: "polaris-gateway" # Name of the Gateway to attach to
gatewayNamespace: "polaris" # Namespace where the Gateway is deployed
hosts:
- polaris.example.com使用外部网关
如果你有一个独立管理的共享网关(例如由集群管理员管理),则只需创建 HTTPRoute:
gateway:
enabled: false
httproute:
enabled: true
gatewayName: "shared-gateway"
gatewayNamespace: "gateway-system"
sectionName: "https" # Optional: attach to a specific listener
hosts:
- polaris.example.comIngress
Ingress 提供从集群外部到集群内部服务的 HTTP(S) 路由。启用 Ingress 可将 Polaris 对外暴露。
📝 注意
Ingress 和 HTTPRoute 互斥,同一时间只能启用其中一个。
⚠️ 警告
Kubernetes 社区的 Ingress NGINX 控制器(请勿与 F5 NGINX Ingress Controller 混淆)将于 2026 年 3 月停止维护。如果你目前使用的是 className: "nginx" 以及 nginx.ingress.kubernetes.io/* 注解,建议迁移到 Gateway API,或迁移到仍在积极维护的 ingress 控制器,例如 Traefik、HAProxy、Contour 或 F5 NGINX Ingress Controller。
基本 Ingress 配置
ingress:
enabled: true
className: "traefik" # Your ingress controller class (e.g., "traefik", "haproxy", "contour")
hosts:
- host: polaris.example.com
paths:
- path: /
pathType: Prefix带 TLS 的 Ingress
要启用 TLS 终止,请创建一个包含 TLS 证书的 Kubernetes Secret,并在 Ingress 配置中引用它:
kubectl create secret tls polaris-tls \
--namespace polaris \
--cert=path/to/tls.crt \
--key=path/to/tls.keyingress:
enabled: true
className: "traefik" # Your ingress controller class
hosts:
- host: polaris.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: polaris-tls
hosts:
- polaris.example.com流量策略
主服务和管理服务均支持流量分发策略:
内部流量策略
控制集群内部流量的路由方式:
service:
internalTrafficPolicy: Local # Route only to node-local endpoints外部流量策略
控制来自集群外部的流量如何路由(仅适用于 NodePort 和 LoadBalancer 类型的服务):
service:
type: LoadBalancer
externalTrafficPolicy: Local # Preserve client source IP流量分发(Kubernetes 1.31+)
对于 Kubernetes 1.31 及更高版本,你可以使用流量分发提示(traffic distribution hints):
service:
trafficDistribution: PreferClose # Prefer topologically closer endpoints会话亲和性
为了获得更好的性能,可以考虑启用会话亲和性,将同一客户端的请求路由到同一个 Pod:
service:
sessionAffinity: ClientIP📝 注意
会话关联仅对内部客户端生效。对于经由 Ingress 的外部流量,请在 Ingress 控制器中配置会话保持。
评论
登录后参与评论
KnowForge