做出一整套黄金路径
目标
把新服务诞生时必须始终附带的内容——标准标签、资源请求/限制、自动扩缩、干扰预算和网络策略——组合成一套,并实际部署到设有护栏的命名空间。随后将同一服务打包成 Helm chart,通过不同环境的 values 分支配置,再部署渲染结果。
为什么重要
黄金路径的价值,与其说在于“加入了什么”,不如说在于“开发者没有要求时是否也会自动加入”。如果脚手架默认附带资源限制和网络策略,开发者遵守规则所需的精力就是 0。反之,只在 wiki 上写“必须设置限制”,总会有一半人忘记。护栏的位置也是如此:ResourceQuota 和 LimitRange 在创建时立即判断,比事后审计报告能提供更好的开发者体验。尤其这两者的组合经常出现在考试中:配额限制 CPU 时,没有显式请求资源的 Pod 会被拒绝,而 LimitRange 的默认值会补上这个缺口。后半部分的 Helm 内容展示了黄金路径的另一面——“用值分化同一脚手架”,即用一个模板同时满足 dev 和 prod。
步骤
- 在
/root/cnpa-path/manifests/deployment.yaml中编写 Deploymentpayments:spec.replicas: 2;选择器和 Pod 标签为app.kubernetes.io/name: payments;元数据标签为app.kubernetes.io/name: payments和app.kubernetes.io/part-of: cnpa-platform;容器名app;镜像ghcr.io/labhub/payments:1.0.0;containerPort8080;resources.requests为 cpu100m/ memory128Mi;resources.limits为 cpu300m/ memory256Mi。在/root/cnpa-path/manifests/service.yaml中编写 Servicepayments:typeClusterIP、port80、targetPort8080、选择器app.kubernetes.io/name: payments。 - 在
/root/cnpa-path/manifests/hpa.yaml中编写 HorizontalPodAutoscalerpayments(apiVersionautoscaling/v2,scaleTargetRef 为 apps/v1 Deploymentpayments,minReplicas: 2,maxReplicas: 6,cpu Utilization 目标70)。在/root/cnpa-path/manifests/pdb.yaml中编写 PodDisruptionBudgetpayments(minAvailable: 1,选择器app.kubernetes.io/name: payments);在/root/cnpa-path/manifests/netpol.yaml中编写 NetworkPolicypayments(podSelector 为app.kubernetes.io/name: payments,policyTypes 第一项为Ingress,ingress 只允许来自带有app.kubernetes.io/part-of: cnpa-platform标签的 Pod 的 TCP8080)。 - 创建命名空间
cnpa-app,并在其中创建 ResourceQuotacnpa-app-quota(requests.cpu: "1"、requests.memory: 1Gi、limits.cpu: "2"、limits.memory: 2Gi、pods: "8")和 LimitRangecnpa-app-limits(typeContainer,defaultcpu200m/ memory256Mi,defaultRequestcpu100m/ memory128Mi)。 - 将
/root/cnpa-path/manifests/中的五份清单全部应用到cnpa-app命名空间。 - 用
helm create /root/cnpa-path/payments创建 chart,并修改values.yaml:replicaCount: 2、image.repository: ghcr.io/labhub/payments、image.tag: "1.0.0"。 - 创建
/root/cnpa-path/payments/values-dev.yaml(replicaCount: 1、image.tag: "1.0.0")和/root/cnpa-path/payments/values-prod.yaml(replicaCount: 3、image.tag: "1.2.0"、fullnameOverride: payments-v2)。然后把helm template payments-v2 /root/cnpa-path/payments -f /root/cnpa-path/payments/values-prod.yaml -n cnpa-app的结果保存到/root/cnpa-path/render-prod.yaml。 - 将
/root/cnpa-path/render-prod.yaml应用到cnpa-app命名空间。应用后,Deploymentpayments-v2应以 replicas3、镜像ghcr.io/labhub/payments:1.2.0运行,第 3 步的配额仍须保留。
参考
- 可用
kubectl apply -n cnpa-app -f /root/cnpa-path/manifests/应用整个目录。 helm template不会在集群中创建任何对象,只把渲染结果写到标准输出。- 设置
fullnameOverride后,helm 创建的资源名称会固定为该值,可避免与第 4 步部署的payments重名。 - 常见错误 1:遗漏 HPA 的
scaleTargetRef.apiVersion。Deployment 使用apps/v1。 - 常见错误 2:遗漏 NetworkPolicy 的
policyTypes。若省略,只会应用存在规则的方向,可能偏离原意。
服务脚手架——Deployment 与 Service
在 /root/cnpa-path/manifests/deployment.yaml 中编写 Deployment payments:spec.replicas: 2;选择器和 Pod 标签为 app.kubernetes.io/name: payments;元数据标签为 app.kubernetes.io/name: payments 和 app.kubernetes.io/part-of: cnpa-platform;容器名 app;镜像 ghcr.io/labhub/payments:1.0.0;containerPort 8080;resources.requests 为 cpu 100m / memory 128Mi;resources.limits 为 cpu 300m / memory 256Mi。在 /root/cnpa-path/manifests/service.yaml 中编写 Service payments:type ClusterIP、port 80、targetPort 8080、选择器 app.kubernetes.io/name: payments。
黄金路径的默认值,是“即使无人提出要求也始终存在”的内容。标准标签和资源请求/限制就是例子。
HPA · PDB · NetworkPolicy
在 /root/cnpa-path/manifests/hpa.yaml 中编写 HorizontalPodAutoscaler payments(apiVersion autoscaling/v2,scaleTargetRef 为 apps/v1 Deployment payments,minReplicas: 2,maxReplicas: 6,cpu Utilization 目标 70)。在 /root/cnpa-path/manifests/pdb.yaml 中编写 PodDisruptionBudget payments(minAvailable: 1,选择器 app.kubernetes.io/name: payments);在 /root/cnpa-path/manifests/netpol.yaml 中编写 NetworkPolicy payments(podSelector 为 app.kubernetes.io/name: payments,policyTypes 第一项为 Ingress,ingress 只允许来自带有 app.kubernetes.io/part-of: cnpa-platform 标签的 Pod 的 TCP 8080)。
这三种资源都要找到目标工作负载。HPA 不使用选择器,而使用目标引用。
带护栏的命名空间
创建命名空间 cnpa-app,并在其中创建 ResourceQuota cnpa-app-quota(requests.cpu: "1"、requests.memory: 1Gi、limits.cpu: "2"、limits.memory: 2Gi、pods: "8")和 LimitRange cnpa-app-limits(type Container,default cpu 200m / memory 256Mi,defaultRequest cpu 100m / memory 128Mi)。
配额限制资源时,该命名空间内的每个容器都必须声明请求/限制。另有一种对象可为未声明的容器补上默认值。
将脚手架应用到集群
将 /root/cnpa-path/manifests/ 中的五份清单全部应用到 cnpa-app 命名空间。
把五种资源全部部署到同一命名空间。可以使用一次性应用整个目录的选项。
使用 helm create 创建本地 chart
用 helm create /root/cnpa-path/payments 创建 chart,并修改 values.yaml:replicaCount: 2、image.repository: ghcr.io/labhub/payments、image.tag: "1.0.0"。
helm create 无需联网即可在本地创建 chart 骨架。请按本服务修改生成的 values.yaml。
按环境设置 values 并检查渲染
创建 /root/cnpa-path/payments/values-dev.yaml(replicaCount: 1、image.tag: "1.0.0")和 /root/cnpa-path/payments/values-prod.yaml(replicaCount: 3、image.tag: "1.2.0"、fullnameOverride: payments-v2)。然后把 helm template payments-v2 /root/cnpa-path/payments -f /root/cnpa-path/payments/values-prod.yaml -n cnpa-app 的结果保存到 /root/cnpa-path/render-prod.yaml。
values 文件会叠加,后提供的文件优先。请使用不会改动集群的命令进行渲染。
在护栏内部署渲染结果
将 /root/cnpa-path/render-prod.yaml 应用到 cnpa-app 命名空间。应用后,Deployment payments-v2 应以 replicas 3、镜像 ghcr.io/labhub/payments:1.2.0 运行,第 3 步的配额仍须保留。
确认已在 values 中固定名称以免冲突,然后直接应用渲染后的文件。