LabHub
学习 学习路径 课程

CNPA — 云原生平台工程助理

做出一整套黄金路径

在 LabHub 中继续学习

目标

把新服务诞生时必须始终附带的内容——标准标签、资源请求/限制、自动扩缩、干扰预算和网络策略——组合成一套,并实际部署到设有护栏的命名空间。随后将同一服务打包成 Helm chart,通过不同环境的 values 分支配置,再部署渲染结果。

为什么重要

黄金路径的价值,与其说在于“加入了什么”,不如说在于“开发者没有要求时是否也会自动加入”。如果脚手架默认附带资源限制和网络策略,开发者遵守规则所需的精力就是 0。反之,只在 wiki 上写“必须设置限制”,总会有一半人忘记。护栏的位置也是如此:ResourceQuota 和 LimitRange 在创建时立即判断,比事后审计报告能提供更好的开发者体验。尤其这两者的组合经常出现在考试中:配额限制 CPU 时,没有显式请求资源的 Pod 会被拒绝,而 LimitRange 的默认值会补上这个缺口。后半部分的 Helm 内容展示了黄金路径的另一面——“用值分化同一脚手架”,即用一个模板同时满足 dev 和 prod。

步骤

  1. /root/cnpa-path/manifests/deployment.yaml 中编写 Deployment paymentsspec.replicas: 2;选择器和 Pod 标签为 app.kubernetes.io/name: payments;元数据标签为 app.kubernetes.io/name: paymentsapp.kubernetes.io/part-of: cnpa-platform;容器名 app;镜像 ghcr.io/labhub/payments:1.0.0;containerPort 8080resources.requests 为 cpu 100m / memory 128Miresources.limits 为 cpu 300m / memory 256Mi。在 /root/cnpa-path/manifests/service.yaml 中编写 Service payments:type ClusterIP、port 80、targetPort 8080、选择器 app.kubernetes.io/name: payments
  2. /root/cnpa-path/manifests/hpa.yaml 中编写 HorizontalPodAutoscaler payments(apiVersion autoscaling/v2,scaleTargetRef 为 apps/v1 Deployment paymentsminReplicas: 2maxReplicas: 6,cpu Utilization 目标 70)。在 /root/cnpa-path/manifests/pdb.yaml 中编写 PodDisruptionBudget paymentsminAvailable: 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)。
  3. 创建命名空间 cnpa-app,并在其中创建 ResourceQuota cnpa-app-quotarequests.cpu: "1"requests.memory: 1Gilimits.cpu: "2"limits.memory: 2Gipods: "8")和 LimitRange cnpa-app-limits(type Containerdefault cpu 200m / memory 256MidefaultRequest cpu 100m / memory 128Mi)。
  4. /root/cnpa-path/manifests/ 中的五份清单全部应用到 cnpa-app 命名空间。
  5. helm create /root/cnpa-path/payments 创建 chart,并修改 values.yamlreplicaCount: 2image.repository: ghcr.io/labhub/paymentsimage.tag: "1.0.0"
  6. 创建 /root/cnpa-path/payments/values-dev.yamlreplicaCount: 1image.tag: "1.0.0")和 /root/cnpa-path/payments/values-prod.yamlreplicaCount: 3image.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
  7. /root/cnpa-path/render-prod.yaml 应用到 cnpa-app 命名空间。应用后,Deployment payments-v2 应以 replicas 3、镜像 ghcr.io/labhub/payments:1.2.0 运行,第 3 步的配额仍须保留。

参考

服务脚手架——Deployment 与 Service

/root/cnpa-path/manifests/deployment.yaml 中编写 Deployment paymentsspec.replicas: 2;选择器和 Pod 标签为 app.kubernetes.io/name: payments;元数据标签为 app.kubernetes.io/name: paymentsapp.kubernetes.io/part-of: cnpa-platform;容器名 app;镜像 ghcr.io/labhub/payments:1.0.0;containerPort 8080resources.requests 为 cpu 100m / memory 128Miresources.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 paymentsminReplicas: 2maxReplicas: 6,cpu Utilization 目标 70)。在 /root/cnpa-path/manifests/pdb.yaml 中编写 PodDisruptionBudget paymentsminAvailable: 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-quotarequests.cpu: "1"requests.memory: 1Gilimits.cpu: "2"limits.memory: 2Gipods: "8")和 LimitRange cnpa-app-limits(type Containerdefault cpu 200m / memory 256MidefaultRequest cpu 100m / memory 128Mi)。

配额限制资源时,该命名空间内的每个容器都必须声明请求/限制。另有一种对象可为未声明的容器补上默认值。

将脚手架应用到集群

/root/cnpa-path/manifests/ 中的五份清单全部应用到 cnpa-app 命名空间。

把五种资源全部部署到同一命名空间。可以使用一次性应用整个目录的选项。

使用 helm create 创建本地 chart

helm create /root/cnpa-path/payments 创建 chart,并修改 values.yamlreplicaCount: 2image.repository: ghcr.io/labhub/paymentsimage.tag: "1.0.0"

helm create 无需联网即可在本地创建 chart 骨架。请按本服务修改生成的 values.yaml。

按环境设置 values 并检查渲染

创建 /root/cnpa-path/payments/values-dev.yamlreplicaCount: 1image.tag: "1.0.0")和 /root/cnpa-path/payments/values-prod.yamlreplicaCount: 3image.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 中固定名称以免冲突,然后直接应用渲染后的文件。