Helm Chart

服务与网络

师成师成· 更新于 2026-09-29· 阅读 12 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

服务与网络

本指南介绍 Polaris Helm Chart 所创建的 Kubernetes 服务,以及如何使用 Gateway API 或 Ingress 配置外部访问。

💡 提示

Kubernetes Gateway API 是对外暴露 Polaris 的推荐方式。与 Ingress 相比,它提供了更具表达力、更易扩展且面向角色的 API,也是 Kubernetes 流量管理的未来发展方向。

服务

Polaris Helm Chart 默认会创建以下服务:

主服务

主服务用于暴露 Polaris REST API。默认情况下,它是一个 ClusterIP 类型的服务,监听 8181 端口。

配置项默认值说明
service.typeClusterIP服务类型(ClusterIP、NodePort、LoadBalancer)
service.ports[0].port8181服务监听的端口
service.ports[0].namepolaris-http端口名称
service.sessionAffinityNone会话亲和性(None 或 ClientIP)
service.clusterIP""设置为 None 可创建无头服务

示例配置:

service:
  type: ClusterIP
  ports:
    - name: polaris-http
      port: 8181
      protocol: TCP

管理服务

管理服务暴露健康检查和指标端点。默认情况下,它是一个无头服务(clusterIP: None),监听端口 8182,非常适合 Prometheus 抓取和服务监控。

配置项默认值说明
managementService.typeClusterIP服务类型
managementService.ports[0].port8182管理服务监听的端口
managementService.ports[0].namepolaris-mgmt端口名称
managementService.clusterIPNone默认为无头服务

配置示例:

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.100

HTTPRoute 配置

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.com

Ingress

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.key
ingress:
  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 控制器中配置会话保持。

评论

登录后参与评论

正在加载评论…