Use Cases (更新: 2026/6/2)

Claude Code Kubernetes 部署指南:从 Deployment 到回滚

用 Claude Code 安全生成 Kubernetes Deployment、Service、Ingress、探针、资源限制和回滚流程。

Claude Code Kubernetes 部署指南:从 Deployment 到回滚

先让 Kubernetes 部署可审查

Kubernetes 可以把容器化应用稳定地运行在集群中,但初学者真正难的不是写几行 YAML,而是同时理解 Deployment、Service、Ingress、ConfigMap、Secret、探针、资源请求、滚动发布和回滚。如果只对 Claude Code 说“帮我生成 Kubernetes 配置”,它可能会给出看似合理、实际却缺少 readinessProbe、使用 latest、把 Secret 示例写进 Git,或者直接创建不适合本地练习的 LoadBalancer。

本文把 Claude Code 当成“生成安全脚手架并辅助 review 的工具”,而不是自动上线按钮。示例使用 nginx:1.27-alpine 和一个 ConfigMap 页面,不需要私有镜像仓库。你可以在 kind、minikube、Docker Desktop Kubernetes 或测试集群中直接执行。理解流程后,再替换成自己的镜像和健康检查路径。

改写示例时请对照官方文档:DeploymentsServicesIngressProbesResource managementConfigMapSecretkubectl rollout。相关内容可以继续读 Docker 集成CI/CD 设置代码审查权限指南

真实使用场景

最适合入门的不是大型生产平台,而是一个可以创建、验证、破坏、回滚的小应用。这样你能看清 Kubernetes 在每一步做了什么,也能训练团队在事故前熟悉命令。

场景目标让 Claude Code 起草什么
内部工具首次部署把一个 Web 应用放到稳定 Service 后面Deployment、ClusterIP Service、探针、requests 和 limits
培训或演示集群所有人执行同一套练习命令带 namespace 的 manifest、验证步骤、失败练习
生产前 YAML 审查在发布前发现危险配置selector、Secret、probe、Ingress 检查
Pull Request 门禁在合并前阻止基础设施错误dry-run CI、review prompt、回滚清单

这类文章也适合商业化,因为读者通常不是随便查概念,而是害怕把线上部署搞坏。ClaudeCodeLab 会把这种指南连接到免费资料、模板和 Claude Code 培训与咨询,帮助团队把流程放进真实仓库。

给 Claude Code 明确边界

提示词里要写清目标,也要写清不要做什么。Kubernetes 场景中,模糊提示很容易产生危险默认值:直接暴露 LoadBalancer、把 Secret 明文写入 YAML、创建集群级 RBAC,或假设你使用某个特定 Ingress Controller。

请创建一个初学者可以在本地验证的 Kubernetes 部署示例。

要求:
- namespace 为 claude-k8s-demo
- 使用 nginx:1.27-alpine,不使用私有镜像
- 使用 ConfigMap 提供一个 HTML 页面
- Deployment 包含 replicas 2、RollingUpdate、readinessProbe、livenessProbe 和 resources
- Service 使用 ClusterIP
- Ingress 作为可选项,host 为 claude-k8s.local
- 说明 Secret 策略,但不要提交真实 Secret
- 给出 apply、rollout status、port-forward、失败和 rollback 命令

限制:
- 不使用 NodePort 或 LoadBalancer
- 不把真实 Secret 值写进 YAML
- 不创建 ClusterRole、ClusterRoleBinding 或破坏性清理命令

好的提示词会把审查范围固定下来。reviewer 可以检查 selector 是否一致、probe 是否指向真实端口、resources 是否存在、Secret 是否不会泄漏。如果经常重复这些规则,就把它们写入 CLAUDE.md;可参考 CLAUDE.md 最佳实践

可直接复制的 manifest

把下面内容保存为 k8s/claude-k8s-demo.yaml。即使暂时没有 Ingress Controller,也可以先通过 Service 的 port-forward 验证。

apiVersion: v1
kind: Namespace
metadata:
  name: claude-k8s-demo
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-page
  namespace: claude-k8s-demo
data:
  APP_ENV: "demo"
  index.html: |
    <!doctype html>
    <html lang="zh">
      <head><meta charset="utf-8" /><title>Claude Code Kubernetes Demo</title></head>
      <body><h1>Claude Code Kubernetes Demo</h1><p>Deployment, Service, ConfigMap, probes are running.</p></body>
    </html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-web
  namespace: claude-k8s-demo
  labels:
    app: demo-web
spec:
  replicas: 2
  revisionHistoryLimit: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: demo-web
  template:
    metadata:
      labels:
        app: demo-web
    spec:
      containers:
        - name: nginx
          image: nginx:1.27-alpine
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
          resources:
            requests:
              cpu: "50m"
              memory: "64Mi"
            limits:
              cpu: "250m"
              memory: "128Mi"
          readinessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 3
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 10
            periodSeconds: 10
          volumeMounts:
            - name: demo-page
              mountPath: /usr/share/nginx/html/index.html
              subPath: index.html
              readOnly: true
      volumes:
        - name: demo-page
          configMap:
            name: demo-page
---
apiVersion: v1
kind: Service
metadata:
  name: demo-web
  namespace: claude-k8s-demo
spec:
  type: ClusterIP
  selector:
    app: demo-web
  ports:
    - name: http
      port: 80
      targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-web
  namespace: claude-k8s-demo
spec:
  ingressClassName: nginx
  rules:
    - host: claude-k8s.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: demo-web
                port:
                  name: http

初学者最容易漏掉的是 label 对齐。spec.selector.matchLabels、Pod template 的 labels、Service 的 selector 必须指向同一组 Pod。让 Claude Code review 时,要明确要求它检查这三处。

本地验证流程

先确认 kubectl cluster-info 指向正确集群,再执行:

kubectl apply -f k8s/claude-k8s-demo.yaml
kubectl -n claude-k8s-demo rollout status deployment/demo-web
kubectl -n claude-k8s-demo get pods -l app=demo-web
kubectl -n claude-k8s-demo get service demo-web
kubectl -n claude-k8s-demo port-forward service/demo-web 8080:80

另开终端确认页面:

curl http://localhost:8080/

如果使用 Ingress,先证明 Pod 和 Service 正常,再查 Ingress。不要一开始就怀疑域名或 Controller。

kubectl -n claude-k8s-demo get ingress demo-web
kubectl -n claude-k8s-demo describe ingress demo-web

ConfigMap、Secret 和回滚

ConfigMap 只放非敏感配置。示例里的 APP_ENV 和 HTML 可以进入 Git,但数据库密码、API token、签名密钥不能放进去。Secret 是敏感值资源,但常见 YAML 只是 base64 表示;base64 不是加密。生产环境应使用云 Secret Manager、External Secrets、Sealed Secrets、SOPS 或团队认可的 vault 流程。

本地练习可以这样生成临时 Secret,并把 secret.local.yaml 加入 .gitignore

kubectl -n claude-k8s-demo create secret generic demo-api-secret \
  --from-literal=API_TOKEN='replace-me-locally' \
  --dry-run=client \
  -o yaml > secret.local.yaml

kubectl apply -f secret.local.yaml

然后练习正常发布和失败回滚:

kubectl -n claude-k8s-demo set image deployment/demo-web nginx=nginx:1.27-alpine
kubectl -n claude-k8s-demo rollout status deployment/demo-web
kubectl -n claude-k8s-demo rollout history deployment/demo-web
kubectl -n claude-k8s-demo set image deployment/demo-web nginx=nginx:not-a-real-tag
kubectl -n claude-k8s-demo rollout status deployment/demo-web --timeout=30s
kubectl -n claude-k8s-demo rollout undo deployment/demo-web

回滚不一定会还原 ConfigMap、Secret、数据库迁移或 DNS。请让 Claude Code 在 runbook 中写清“会回滚什么”和“不会回滚什么”。

CI 审查与常见失败

至少在 Pull Request 中做一次 dry-run:

name: Kubernetes manifest review
on:
  pull_request:
    paths:
      - "k8s/**"
jobs:
  dry-run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: azure/setup-kubectl@v4
        with:
          version: "v1.30.0"
      - run: kubectl apply --dry-run=client -f k8s/

常见失败包括:生产使用 latest;readiness 和 liveness 意义混淆;未设置 resources;把 base64 当安全;Service 没通就开始查 Ingress;把 Claude Code 输出不经人工 review 直接发布。解决办法是让 CI、官方文档、review prompt 和实际验证记录共同工作。

咨询路径与验证结果

这个示例是学习用最小构成。真实项目还要处理镜像构建、TLS、Secret 注入、监控、RBAC、CI/CD、事故沟通和团队权限。个人可以从 免费 cheatsheet 开始;团队如果要把 Claude Code 用在基础设施变更中,建议通过 Claude Code 培训与咨询CLAUDE.md、review 规则、回滚演练和 CI 门禁一起建立。

我按 apply、rollout status、列出 Pod、port-forward、curl、改成错误镜像、观察失败、rollout undo 的顺序设计了本文。实际最容易出错的不是高级网络,而是 selector 不一致、probe path 错误、resources 缺失和 Secret 示例处理不当。把这些限制写进第一条 Claude Code prompt,比事后修 YAML 更快。

#Claude Code #Kubernetes #DevOps #container orchestration #infrastructure
免费

免费 PDF: Claude Code 速查表

输入邮箱即可获取一页 PDF,整理常用命令、审查习惯和安全工作流。

我们会妥善保护你的信息,不发送垃圾邮件。

把 Claude Code 变成真正能带来结果的工作流

先领取中文说明的免费 PDF,再进入英文商品页选择合适的教材。如果你需要团队落地、流程设计或内容变现支持,也可以直接咨询。

Masa

关于作者

Masa

专注 Claude Code 实务流程、团队导入和内容转化的工程师。