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 网络拓扑中的协作关系:
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 中的嵌套层级与字段依赖关系:
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 校验规则编写和发布差异分析的前提。