3、网络拓扑核心资源类型:Service、Ingress、NetworkPolicy、EndpointSlice 在 values 中的典型定义方式

在 Helm Chart 中,网络拓扑相关的 Kubernetes 资源通常通过 values.yaml 进行参数化定义。本章聚焦四种核心资源——Service、Ingress、NetworkPolicy、EndpointSlice——在 values 中的典型结构、字段映射与设计模式。理解这些定义方式,是后续进行 Schema 校验与发布差异分析的基础。

3.1 资源定义概览与对比

下表对比了四种资源在 values 中的核心关注点与典型字段数量:

资源类型 核心关注点 典型 values 字段数 是否常被 Helm 管理
Service 端口映射、类型、选择器、负载均衡 5-10 是
Ingress 域名、路由规则、TLS、注解 8-15 是
NetworkPolicy 入站/出站规则、标签选择器、CIDR 6-12 是
EndpointSlice 端点地址、端口、拓扑信息 3-6 通常由控制器管理,Helm 仅定义模板
实践提示:EndpointSlice 通常由 Kubernetes 控制器自动生成,Helm 一般只负责定义 Service 的模板,而非直接管理 EndpointSlice 的 values。但在某些自定义场景(如静态端点)下,values 中仍可预留结构。

3.2 Service 的 values 典型定义

Service 是网络拓扑的入口点。以下是一个典型的 values 结构:

service:
  enabled: true
  name: my-app-svc
  type: ClusterIP        # 可选: ClusterIP, NodePort, LoadBalancer, ExternalName
  clusterIP: ""          # 留空则自动分配
  ports:
    - name: http
      port: 80
      targetPort: 8080
      protocol: TCP
    - name: https
      port: 443
      targetPort: 8443
      protocol: TCP
  selector:
    app: my-app
    tier: frontend
  annotations: {}
  loadBalancerIP: ""     # 仅 LoadBalancer 类型时使用
  externalTrafficPolicy: ""  # 可选: Local, Cluster

关键设计要点:

  • 端口列表使用数组结构,便于动态扩展多个端口。
  • selector 通常与 Deployment 的标签保持一致,可通过全局变量注入。
  • type 字段控制 Service 的暴露方式,直接影响网络拓扑形态。

3.3 Ingress 的 values 典型定义

Ingress 负责七层路由。values 中通常包含域名、路径、TLS 和注解:

ingress:
  enabled: true
  className: nginx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: app.example.com
      paths:
        - path: /
          pathType: Prefix
          serviceName: my-app-svc
          servicePort: 80
        - path: /api
          pathType: Prefix
          serviceName: api-svc
          servicePort: 8080
  tls:
    - hosts:
        - app.example.com
      secretName: app-tls-secret
  defaultBackend:
    serviceName: default-svc
    servicePort: 80

常见模式:

  • 多域名多路径通过 hosts 数组实现,每个 host 下可挂载多个 path。
  • TLS 配置独立于 hosts 定义,便于统一管理证书。
  • 注解用于集成 ingress-controller 特性(如重写、限流、认证)。
发布差异关注点:Ingress 的 annotations 和 tls 字段在升级时容易因缩进或拼写错误导致路由失效,Schema 校验应重点覆盖这些字段的必填性与格式。

3.4 NetworkPolicy 的 values 典型定义

NetworkPolicy 控制 Pod 级别的网络访问。values 中通常定义策略类型、入站/出站规则:

networkPolicy:
  enabled: true
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: allowed-app
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: monitoring
      ports:
        - port: 8080
          protocol: TCP
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/8
            except:
              - 10.96.0.0/12
      ports:
        - port: 53
          protocol: UDP
  podSelector:
    matchLabels:
      app: my-app

设计要点:

  • policyTypes 明确声明策略方向,缺省可能导致规则不生效。
  • from/to 支持 podSelector、namespaceSelector、ipBlock 三种匹配方式。
  • 端口限制可精确到协议和端口号,避免过度开放。

3.5 EndpointSlice 的 values 典型定义

EndpointSlice 通常由控制器自动管理,但在静态端点或测试场景下,Helm 可定义模板结构:

endpointSlice:
  enabled: false
  addressType: IPv4
  endpoints:
    - addresses:
        - "10.0.1.1"
        - "10.0.1.2"
      conditions:
        ready: true
        serving: true
        terminating: false
      topology:
        kubernetes.io/hostname: node-1
        topology.kubernetes.io/zone: us-east-1a
      targetRef:
        kind: Pod
        name: my-pod-1
        namespace: default
  ports:
    - name: http
      port: 80
      protocol: TCP
注意:直接管理 EndpointSlice 会与 Kubernetes 控制器产生冲突。建议仅在 enabled: false 默认关闭,且通过条件判断仅在测试或特殊场景下启用。

3.6 网络拓扑资源关系图

下图展示了四种资源在 Kubernetes 网络拓扑中的协作关系:

Kubernetes 网络拓扑核心资源关系 Service Ingress NetworkPolicy EndpointSlice Pod 路由 选择端点 引用 策略控制 Ingress 接收外部流量 → Service 负载均衡 → EndpointSlice 维护端点列表 → Pod 处理请求;NetworkPolicy 全程控制访问

3.7 四种资源在 values 中的设计模式对比

设计维度 Service Ingress NetworkPolicy EndpointSlice
启用开关 enabled: true/false enabled: true/false enabled: true/false enabled: false(默认关闭)
核心数组 ports[] hosts[].paths[] ingress[].from[], egress[].to[] endpoints[].addresses[]
标签选择器 selector 无(通过 serviceName 关联) podSelector, namespaceSelector targetRef
注解支持 annotations annotations(核心) 无 无
Schema 校验重点 端口号范围、类型枚举 域名格式、TLS 证书引用 CIDR 格式、标签表达式 IP 地址格式、条件布尔值

3.8 典型 values 嵌套层级示意图

下图展示了四种资源在 Helm values 中的嵌套层级与字段依赖关系:

Helm values 中网络资源嵌套层级 values.yaml service ingress networkPolicy endpointSlice service 子字段 ├─ type: ClusterIP ├─ ports[].port └─ selector ingress 子字段 ├─ hosts[].host ├─ tls[].secretName └─ annotations networkPolicy 子字段 ├─ policyTypes[] ├─ ingress[].from └─ egress[].to endpointSlice 子字段 ├─ endpoints[].addresses ├─ endpoints[].conditions └─ ports[].port 每个资源块在 values 中独立定义,通过模板引用;Schema 校验需覆盖每个子字段的类型、格式与必填性

3.9 实践建议与常见陷阱

  • 统一命名规范:所有资源的 name 字段建议通过 {{ .Release.Name }}-{{ .Values.service.name }} 模板生成,避免硬编码。
  • 端口冲突检测:Service 和 Ingress 的端口定义应保持一致性,避免模板渲染后端口不匹配。
  • NetworkPolicy 默认拒绝:建议在 values 中提供 defaultDeny: true 开关,配合显式放行规则,提升安全性。
  • EndpointSlice 的只读性:生产环境中不应通过 Helm 管理 EndpointSlice,模板中应使用 if .Values.endpointSlice.enabled 条件包裹。
  • Schema 校验前置:在 values.schema.json 中为每个资源的必填字段(如 service.ports、ingress.hosts)设置 minItems: 1,避免空数组导致资源创建失败。
核心结论:Service 和 Ingress 是网络拓扑的“入口层”,NetworkPolicy 是“安全层”,EndpointSlice 是“端点层”。在 Helm values 中,前三者应作为用户可配置的核心参数,后者则保持默认关闭,仅在特殊场景下启用。理解这四类资源的 values 定义方式,是后续进行 Schema 校验规则编写和发布差异分析的前提。