igozhang

——

    Kubernetes 常用资源/对象速查

    本文介绍 Kubernetes 最常用的资源(对象),演示增删改查(CRUD)。命令基于 kubectl,YAML 可直接复制改用。


    页内导航

    分类 资源
    工作负载 Pod · Deployment · StatefulSet · DaemonSet · Job · CronJob
    服务与网络 Service · Ingress · NetworkPolicy
    配置与密钥 ConfigMap · Secret
    存储 PersistentVolume · PersistentVolumeClaim · StorageClass
    组织与权限 Namespace · ServiceAccount · Role / ClusterRole · RoleBinding / ClusterRoleBinding
    常用运维 副本数扩缩容 · CPU/内存 requests 与 limits · 命名空间配额 · HPA 自动扩缩 · 滚动更新与回滚 · 健康检查探针 · 环境变量与配置挂载 · 标签注解与排查 · 优雅终止与强制删除
    其它 通用操作速查 · 推荐最小组合

    通用操作速查

    几乎所有资源都遵循同一套 CRUD 模式:

    操作 命令模式 示例
    (创建) kubectl apply -f <file>.yaml kubectl apply -f igo-deploy.yaml
    (列表) kubectl get <kind> [-n ns] kubectl get deploy -n igo-ns
    (详情) kubectl describe <kind> <name> [-n ns] kubectl describe pod igo-pod -n igo-ns
    (YAML) kubectl get <kind> <name> -o yaml kubectl get cm igo-config -n igo-ns -o yaml
    (编辑) kubectl edit <kind> <name> kubectl edit deploy igo-web -n igo-ns
    (补丁) kubectl patch ... / kubectl set ... kubectl set image deploy/igo-web ...
    kubectl delete <kind> <name> kubectl delete svc igo-web -n igo-ns
    (按文件) kubectl delete -f <file>.yaml kubectl delete -f igo-deploy.yaml

    先创建命名空间(后续示例都会用到):

    kubectl create namespace igo-ns
    # 或
    kubectl apply -f - <<'EOF'
    apiVersion: v1
    kind: Namespace
    metadata:
      name: igo-ns
    EOF
    

    Namespace

    是什么:资源隔离边界,常按环境/团队划分(如 igo-ns)。

    kubectl create namespace igo-ns
    

    kubectl get ns
    kubectl get ns igo-ns -o yaml
    kubectl describe ns igo-ns
    

    # 给命名空间加标签
    kubectl label ns igo-ns env=dev --overwrite
    

    # 会级联删除该命名空间下的多数资源,谨慎操作
    kubectl delete ns igo-ns
    

    Pod

    是什么:最小可调度单元,包含一个或多个容器。生产中通常由 Deployment 等控制器创建,较少直接长期托管裸 Pod。

    kubectl run igo-pod --image=nginx:1.25 -n igo-ns --restart=Never
    

    或 YAML:

    # igo-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: igo-pod
      namespace: igo-ns
      labels:
        app: igo
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80
    
    kubectl apply -f igo-pod.yaml
    

    kubectl get pods -n igo-ns
    kubectl get pod igo-pod -n igo-ns -o wide
    kubectl describe pod igo-pod -n igo-ns
    kubectl logs igo-pod -n igo-ns
    

    Pod 多数字段不可原地修改;常见做法是删了重建,或改上层控制器。

    # 进入容器排查(不算改资源定义,但很常用)
    kubectl exec -it igo-pod -n igo-ns -- /bin/sh
    

    kubectl delete pod igo-pod -n igo-ns
    

    Deployment

    是什么:管理无状态副本,支持滚动更新与回滚。日常部署首选。

    # igo-deploy.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: igo-web
      namespace: igo-ns
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: igo-web
      template:
        metadata:
          labels:
            app: igo-web
        spec:
          containers:
            - name: web
              image: nginx:1.25
              ports:
                - containerPort: 80
    
    kubectl apply -f igo-deploy.yaml
    

    kubectl get deploy -n igo-ns
    kubectl get deploy igo-web -n igo-ns -o yaml
    kubectl describe deploy igo-web -n igo-ns
    kubectl get rs,pods -l app=igo-web -n igo-ns
    kubectl rollout status deploy/igo-web -n igo-ns
    

    # 扩缩容
    kubectl scale deploy/igo-web --replicas=3 -n igo-ns
    
    # 换镜像(触发滚动更新)
    kubectl set image deploy/igo-web web=nginx:1.26 -n igo-ns
    
    # 交互编辑
    kubectl edit deploy igo-web -n igo-ns
    
    # 回滚
    kubectl rollout undo deploy/igo-web -n igo-ns
    kubectl rollout history deploy/igo-web -n igo-ns
    
    # 设资源限额(详见「常用运维操作」)
    kubectl set resources deploy/igo-web -n igo-ns \
      --containers=web \
      --requests=cpu=100m,memory=128Mi \
      --limits=cpu=500m,memory=256Mi
    

    更多:副本策略、HPA、探针、配额等见 常用运维操作

    kubectl delete deploy igo-web -n igo-ns
    # 或
    kubectl delete -f igo-deploy.yaml
    

    StatefulSet

    是什么:有状态应用(数据库、消息队列等),提供稳定 Pod 名、有序扩缩、稳定存储绑定。

    # igo-sts.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: igo-db
      namespace: igo-ns
    spec:
      serviceName: igo-db-headless
      replicas: 2
      selector:
        matchLabels:
          app: igo-db
      template:
        metadata:
          labels:
            app: igo-db
        spec:
          containers:
            - name: redis
              image: redis:7
              ports:
                - containerPort: 6379
      volumeClaimTemplates:
        - metadata:
            name: igo-data
          spec:
            accessModes: ["ReadWriteOnce"]
            resources:
              requests:
                storage: 1Gi
    

    配合 Headless Service:

    # igo-db-headless.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: igo-db-headless
      namespace: igo-ns
    spec:
      clusterIP: None
      selector:
        app: igo-db
      ports:
        - port: 6379
          name: redis
    
    kubectl apply -f igo-db-headless.yaml -f igo-sts.yaml
    

    kubectl get sts -n igo-ns
    kubectl get pods -l app=igo-db -n igo-ns
    kubectl describe sts igo-db -n igo-ns
    

    kubectl scale sts/igo-db --replicas=3 -n igo-ns
    kubectl edit sts igo-db -n igo-ns
    

    kubectl delete sts igo-db -n igo-ns
    # PVC 默认常会保留,需单独删除 igo-data-*
    kubectl get pvc -n igo-ns
    

    DaemonSet

    是什么:在每个(或选定)节点上跑一个 Pod,适合日志采集、监控 Agent、网络插件等。

    # igo-ds.yaml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: igo-agent
      namespace: igo-ns
    spec:
      selector:
        matchLabels:
          app: igo-agent
      template:
        metadata:
          labels:
            app: igo-agent
        spec:
          containers:
            - name: agent
              image: busybox:1.36
              command: ["sh", "-c", "while true; do echo igo-agent; sleep 60; done"]
    
    kubectl apply -f igo-ds.yaml
    

    kubectl get ds -n igo-ns
    kubectl get pods -l app=igo-agent -n igo-ns -o wide
    kubectl describe ds igo-agent -n igo-ns
    

    kubectl set image ds/igo-agent agent=busybox:1.37 -n igo-ns
    kubectl edit ds igo-agent -n igo-ns
    

    kubectl delete ds igo-agent -n igo-ns
    

    Job

    是什么:跑一次性任务,成功完成后 Pod 不再重启(按 restartPolicy 配置)。

    # igo-job.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: igo-batch
      namespace: igo-ns
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: worker
              image: busybox:1.36
              command: ["sh", "-c", "echo hello-from-igo; sleep 5"]
    
    kubectl apply -f igo-job.yaml
    

    kubectl get jobs -n igo-ns
    kubectl get pods -l job-name=igo-batch -n igo-ns
    kubectl logs job/igo-batch -n igo-ns
    kubectl describe job igo-batch -n igo-ns
    

    Job 一般不原地改规格;失败可删建,或调 backoffLimit 后重建。

    kubectl delete job igo-batch -n igo-ns
    kubectl apply -f igo-job.yaml
    

    kubectl delete job igo-batch -n igo-ns
    

    CronJob

    是什么:按 cron 表达式周期性创建 Job。

    # igo-cronjob.yaml
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: igo-cleanup
      namespace: igo-ns
    spec:
      schedule: "*/5 * * * *"   # 每 5 分钟
      jobTemplate:
        spec:
          template:
            spec:
              restartPolicy: OnFailure
              containers:
                - name: cleanup
                  image: busybox:1.36
                  command: ["sh", "-c", "echo igo-cleanup; date"]
    
    kubectl apply -f igo-cronjob.yaml
    

    kubectl get cronjob -n igo-ns
    kubectl get jobs -n igo-ns
    kubectl describe cronjob igo-cleanup -n igo-ns
    

    # 暂停调度
    kubectl patch cronjob igo-cleanup -n igo-ns -p '{"spec":{"suspend":true}}'
    
    # 改调度时间
    kubectl patch cronjob igo-cleanup -n igo-ns -p '{"spec":{"schedule":"0 * * * *"}}'
    

    kubectl delete cronjob igo-cleanup -n igo-ns
    

    Service

    是什么:给一组 Pod 提供稳定虚拟 IP / DNS 名;常见类型:ClusterIPNodePortLoadBalancer

    # igo-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: igo-web
      namespace: igo-ns
    spec:
      type: ClusterIP
      selector:
        app: igo-web
      ports:
        - name: http
          port: 80
          targetPort: 80
    
    kubectl apply -f igo-svc.yaml
    # 或快捷暴露
    kubectl expose deploy/igo-web --name=igo-web --port=80 -n igo-ns
    

    kubectl get svc -n igo-ns
    kubectl get endpoints igo-web -n igo-ns
    kubectl describe svc igo-web -n igo-ns
    

    集群内访问示例:http://igo-web.igo-ns.svc.cluster.local

    kubectl edit svc igo-web -n igo-ns
    # 例如改成 NodePort
    kubectl patch svc igo-web -n igo-ns -p '{"spec":{"type":"NodePort"}}'
    

    kubectl delete svc igo-web -n igo-ns
    

    Ingress

    是什么:集群入口的 HTTP/HTTPS 路由(按域名、路径转发到 Service)。需安装 Ingress Controller(如 nginx、traefik)。

    # igo-ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: igo-web
      namespace: igo-ns
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      ingressClassName: nginx
      rules:
        - host: igo.example.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: igo-web
                    port:
                      number: 80
    
    kubectl apply -f igo-ingress.yaml
    

    kubectl get ingress -n igo-ns
    kubectl describe ingress igo-web -n igo-ns
    

    kubectl edit ingress igo-web -n igo-ns
    

    kubectl delete ingress igo-web -n igo-ns
    

    NetworkPolicy

    是什么:声明式网络隔离策略,控制哪些流量可进出 Pod(依赖支持 NetworkPolicy 的 CNI)。

    # igo-netpol.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: igo-web-allow
      namespace: igo-ns
    spec:
      podSelector:
        matchLabels:
          app: igo-web
      policyTypes:
        - Ingress
      ingress:
        - from:
            - podSelector:
                matchLabels:
                  app: igo-frontend
          ports:
            - protocol: TCP
              port: 80
    
    kubectl apply -f igo-netpol.yaml
    

    kubectl get netpol -n igo-ns
    kubectl describe netpol igo-web-allow -n igo-ns
    

    kubectl edit netpol igo-web-allow -n igo-ns
    

    kubectl delete netpol igo-web-allow -n igo-ns
    

    ConfigMap

    是什么:存放非敏感配置(环境变量、配置文件片段)。

    kubectl create configmap igo-config \
      -n igo-ns \
      --from-literal=APP_NAME=igo \
      --from-literal=LOG_LEVEL=info
    

    或 YAML:

    # igo-cm.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: igo-config
      namespace: igo-ns
    data:
      APP_NAME: igo
      LOG_LEVEL: info
      app.properties: |
        name=igo
        mode=dev
    
    kubectl apply -f igo-cm.yaml
    

    kubectl get cm -n igo-ns
    kubectl get cm igo-config -n igo-ns -o yaml
    kubectl describe cm igo-config -n igo-ns
    

    kubectl edit cm igo-config -n igo-ns
    # 或重新 apply 覆盖
    kubectl apply -f igo-cm.yaml
    

    注意:已挂载的 ConfigMap 更新后,应用是否生效取决于挂载方式与应用是否热加载。

    kubectl delete cm igo-config -n igo-ns
    

    Secret

    是什么:存放敏感数据(密码、Token、证书)。默认多为 base64 编码,不等于加密,生产需配合 KMS/加密配置等。

    kubectl create secret generic igo-secret \
      -n igo-ns \
      --from-literal=username=igo \
      --from-literal=password='s3cret'
    

    或 YAML(值需 base64):

    echo -n 'igo' | base64      # aWdv
    echo -n 's3cret' | base64   # czNjcmV0
    
    # igo-secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: igo-secret
      namespace: igo-ns
    type: Opaque
    data:
      username: aWdv
      password: czNjcmV0
    
    kubectl apply -f igo-secret.yaml
    

    kubectl get secret -n igo-ns
    kubectl describe secret igo-secret -n igo-ns
    # 解码查看(注意权限与审计)
    kubectl get secret igo-secret -n igo-ns -o jsonpath='{.data.username}' | base64 -d; echo
    

    kubectl edit secret igo-secret -n igo-ns
    # 或
    kubectl create secret generic igo-secret \
      -n igo-ns \
      --from-literal=username=igo \
      --from-literal=password='newpass' \
      --dry-run=client -o yaml | kubectl apply -f -
    

    kubectl delete secret igo-secret -n igo-ns
    

    PersistentVolume (PV)

    是什么:集群级存储资源,由管理员或 StorageClass 动态供给创建。应用一般不直接绑 PV,而是用 PVC。

    增(静态示例)

    # igo-pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: igo-pv
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: igo-manual
      hostPath:
        path: /mnt/igo-data
    
    kubectl apply -f igo-pv.yaml
    

    kubectl get pv
    kubectl get pv igo-pv -o yaml
    kubectl describe pv igo-pv
    

    kubectl edit pv igo-pv
    

    多数容量/后端字段受限制,改不动时通常重建。

    # 需先解除与 PVC 的绑定(且注意 reclaimPolicy)
    kubectl delete pv igo-pv
    

    PersistentVolumeClaim (PVC)

    是什么:应用对存储的「申请单」;绑定到 PV 后可挂到 Pod。

    # igo-pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: igo-pvc
      namespace: igo-ns
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: igo-manual   # 或集群默认 StorageClass
      resources:
        requests:
          storage: 1Gi
    
    kubectl apply -f igo-pvc.yaml
    

    在 Deployment/Pod 中挂载示例:

    volumes:
      - name: igo-storage
        persistentVolumeClaim:
          claimName: igo-pvc
    containers:
      - name: web
        volumeMounts:
          - name: igo-storage
            mountPath: /data
    

    kubectl get pvc -n igo-ns
    kubectl describe pvc igo-pvc -n igo-ns
    

    # 部分存储类支持扩容
    kubectl edit pvc igo-pvc -n igo-ns
    # 将 storage 请求改大后保存
    

    kubectl delete pvc igo-pvc -n igo-ns
    # 若 PV reclaimPolicy=Retain,数据卷可能仍保留
    

    StorageClass

    是什么:定义「如何动态创建 PV」(云盘类型、回收策略等)。通常由平台管理员维护。

    # igo-sc.yaml
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: igo-fast
    provisioner: kubernetes.io/aws-ebs   # 按实际 CSI 修改
    parameters:
      type: gp3
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    
    kubectl apply -f igo-sc.yaml
    

    kubectl get sc
    kubectl describe sc igo-fast
    

    kubectl edit sc igo-fast
    

    kubectl delete sc igo-fast
    

    ServiceAccount

    是什么:Pod 在集群内的身份,用于调用 API Server(配合 RBAC)。

    kubectl create sa igo-sa -n igo-ns
    
    # igo-sa.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: igo-sa
      namespace: igo-ns
    

    kubectl get sa -n igo-ns
    kubectl describe sa igo-sa -n igo-ns
    

    kubectl annotate sa igo-sa igo.io/owner=igo -n igo-ns --overwrite
    

    在 Pod/Deployment 中引用:

    spec:
      serviceAccountName: igo-sa
    

    kubectl delete sa igo-sa -n igo-ns
    

    Role / ClusterRole

    是什么

    • Role:命名空间内权限规则
    • ClusterRole:集群级(或可复用到多个命名空间)权限规则

    # igo-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: igo-reader
      namespace: igo-ns
    rules:
      - apiGroups: [""]
        resources: ["pods", "services", "configmaps"]
        verbs: ["get", "list", "watch"]
    
    # igo-clusterrole.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: igo-node-reader
    rules:
      - apiGroups: [""]
        resources: ["nodes"]
        verbs: ["get", "list"]
    
    kubectl apply -f igo-role.yaml
    kubectl apply -f igo-clusterrole.yaml
    

    kubectl get role -n igo-ns
    kubectl get clusterrole igo-node-reader
    kubectl describe role igo-reader -n igo-ns
    

    kubectl edit role igo-reader -n igo-ns
    kubectl edit clusterrole igo-node-reader
    

    kubectl delete role igo-reader -n igo-ns
    kubectl delete clusterrole igo-node-reader
    

    RoleBinding / ClusterRoleBinding

    是什么:把 Role/ClusterRole「绑」到用户、组或 ServiceAccount。

    # igo-rolebinding.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: igo-reader-binding
      namespace: igo-ns
    subjects:
      - kind: ServiceAccount
        name: igo-sa
        namespace: igo-ns
    roleRef:
      kind: Role
      name: igo-reader
      apiGroup: rbac.authorization.k8s.io
    
    # igo-crb.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: igo-node-reader-binding
    subjects:
      - kind: ServiceAccount
        name: igo-sa
        namespace: igo-ns
    roleRef:
      kind: ClusterRole
      name: igo-node-reader
      apiGroup: rbac.authorization.k8s.io
    
    kubectl apply -f igo-rolebinding.yaml
    kubectl apply -f igo-crb.yaml
    

    kubectl get rolebinding -n igo-ns
    kubectl get clusterrolebinding igo-node-reader-binding
    kubectl describe rolebinding igo-reader-binding -n igo-ns
    
    # 权限自检
    kubectl auth can-i get pods --as=system:serviceaccount:igo-ns:igo-sa -n igo-ns
    

    kubectl edit rolebinding igo-reader-binding -n igo-ns
    

    kubectl delete rolebinding igo-reader-binding -n igo-ns
    kubectl delete clusterrolebinding igo-node-reader-binding
    

    常用运维操作

    下面以 igo-web(Deployment)为主,覆盖日常改副本、设资源上限、发布回滚等高频操作。
    ↑ 回到导航

    副本数扩缩容

    命令行(最快)

    # 扩到 5 副本
    kubectl scale deploy/igo-web --replicas=5 -n igo-ns
    
    # 缩到 1(或 0,相当于停服但保留 Deployment)
    kubectl scale deploy/igo-web --replicas=1 -n igo-ns
    kubectl scale deploy/igo-web --replicas=0 -n igo-ns
    
    # StatefulSet 同理
    kubectl scale sts/igo-db --replicas=3 -n igo-ns
    

    YAML 声明

    spec:
      replicas: 3
    
    # 改 YAML 后 apply,或直接 patch
    kubectl patch deploy igo-web -n igo-ns -p '{"spec":{"replicas":3}}'
    

    查当前副本与就绪情况

    kubectl get deploy igo-web -n igo-ns
    # READY 列形如 3/3 表示期望/就绪
    kubectl get pods -l app=igo-web -n igo-ns -o wide
    

    若已配置 HPA,不要再用手工 scale 长期固定副本,否则会被 HPA 覆盖。


    CPU/内存 requests 与 limits

    概念简要

    • requests:调度保证量(调度器按此选节点)
    • limits:硬上限;CPU 超限会被节流,内存超限常 OOMKill

    YAML(写在容器里)

    # igo-deploy-resources.yaml 片段
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: igo-web
      namespace: igo-ns
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: igo-web
      template:
        metadata:
          labels:
            app: igo-web
        spec:
          containers:
            - name: web
              image: nginx:1.25
              ports:
                - containerPort: 80
              resources:
                requests:
                  cpu: "100m"      # 0.1 核
                  memory: "128Mi"
                limits:
                  cpu: "500m"      # 0.5 核
                  memory: "256Mi"
    
    kubectl apply -f igo-deploy-resources.yaml
    

    命令行 patch(已有 Deployment)

    kubectl set resources deploy/igo-web -n igo-ns \
      --containers=web \
      --requests=cpu=100m,memory=128Mi \
      --limits=cpu=500m,memory=256Mi
    

    查实际用量与配置

    # 看 Pod 实际用量(需 metrics-server)
    kubectl top pods -n igo-ns
    kubectl top pod -l app=igo-web -n igo-ns --containers
    
    # 看已配置的 requests/limits
    kubectl get pod -l app=igo-web -n igo-ns \
      -o custom-columns=NAME:.metadata.name,CPU_REQ:.spec.containers[*].resources.requests.cpu,MEM_REQ:.spec.containers[*].resources.requests.memory,CPU_LIM:.spec.containers[*].resources.limits.cpu,MEM_LIM:.spec.containers[*].resources.limits.memory
    
    # 或 describe 里看 Limits / Requests
    kubectl describe pod -l app=igo-web -n igo-ns | grep -A6 'Limits\|Requests'
    

    常见取值参考(仅作起点)

    场景 requests limits
    轻量 Web(igo-web) cpu 100m / mem 128Mi cpu 500m / mem 256Mi
    中等 API cpu 250m / mem 256Mi cpu 1 / mem 512Mi
    批处理 Job 按峰值设 requests,limits ≈ 1~2× requests

    命名空间配额(ResourceQuota / LimitRange)

    给整个 igo-ns 设「总预算」和「单容器默认/上限」,避免某个应用把节点打爆。

    ResourceQuota:命名空间总量

    # igo-quota.yaml
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: igo-quota
      namespace: igo-ns
    spec:
      hard:
        requests.cpu: "4"
        requests.memory: 8Gi
        limits.cpu: "8"
        limits.memory: 16Gi
        pods: "20"
        persistentvolumeclaims: "10"
    
    kubectl apply -f igo-quota.yaml
    kubectl get resourcequota -n igo-ns
    kubectl describe resourcequota igo-quota -n igo-ns
    

    LimitRange:单 Pod/容器默认与上下限

    # igo-limitrange.yaml
    apiVersion: v1
    kind: LimitRange
    metadata:
      name: igo-limitrange
      namespace: igo-ns
    spec:
      limits:
        - type: Container
          defaultRequest:          # 未写 requests 时自动填
            cpu: "100m"
            memory: "128Mi"
          default:                 # 未写 limits 时自动填
            cpu: "500m"
            memory: "256Mi"
          max:
            cpu: "2"
            memory: 2Gi
          min:
            cpu: "50m"
            memory: "64Mi"
    
    kubectl apply -f igo-limitrange.yaml
    kubectl get limitrange -n igo-ns
    kubectl describe limitrange igo-limitrange -n igo-ns
    
    # 删除配额
    kubectl delete resourcequota igo-quota -n igo-ns
    kubectl delete limitrange igo-limitrange -n igo-ns
    

    HPA 自动扩缩

    按 CPU/内存(或自定义指标)自动调 Deployment 副本数。

    # igo-hpa.yaml
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: igo-web
      namespace: igo-ns
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: igo-web
      minReplicas: 2
      maxReplicas: 10
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 70
    
    # 快捷创建(需已设好 resources.requests.cpu)
    kubectl autoscale deploy/igo-web -n igo-ns \
      --cpu-percent=70 --min=2 --max=10
    
    # 或 apply YAML
    kubectl apply -f igo-hpa.yaml
    
    # 查
    kubectl get hpa -n igo-ns
    kubectl describe hpa igo-web -n igo-ns
    
    # 改(如调大上限)
    kubectl patch hpa igo-web -n igo-ns -p '{"spec":{"maxReplicas":15}}'
    
    # 删
    kubectl delete hpa igo-web -n igo-ns
    

    滚动更新与回滚

    # 换镜像触发滚动更新
    kubectl set image deploy/igo-web web=nginx:1.26 -n igo-ns
    
    # 看进度
    kubectl rollout status deploy/igo-web -n igo-ns
    kubectl rollout history deploy/igo-web -n igo-ns
    
    # 回滚到上一版
    kubectl rollout undo deploy/igo-web -n igo-ns
    
    # 回滚到指定 revision
    kubectl rollout undo deploy/igo-web --to-revision=2 -n igo-ns
    
    # 暂停 / 恢复(批量改多项再一起发布)
    kubectl rollout pause deploy/igo-web -n igo-ns
    kubectl set resources deploy/igo-web -n igo-ns --limits=cpu=1,memory=512Mi
    kubectl set image deploy/igo-web web=nginx:1.26 -n igo-ns
    kubectl rollout resume deploy/igo-web -n igo-ns
    
    # 重启所有 Pod(不改镜像,常用于吃到新 ConfigMap)
    kubectl rollout restart deploy/igo-web -n igo-ns
    

    YAML 中可调发布策略:

    spec:
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxUnavailable: 0      # 更新时不允许不可用
          maxSurge: 1            # 最多多起 1 个新 Pod
    

    健康检查探针

    避免流量打到未就绪实例、卡死进程无人重启。

    containers:
      - name: web
        image: nginx:1.25
        ports:
          - containerPort: 80
        readinessProbe:            # 就绪才进 Service 负载
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:             # 不健康则重启容器
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 20
        startupProbe:              # 慢启动应用可先用这个
          httpGet:
            path: /
            port: 80
          failureThreshold: 30
          periodSeconds: 5
    
    # 看探针失败原因
    kubectl describe pod -l app=igo-web -n igo-ns | grep -A20 'Liveness\|Readiness\|Startup\|Events'
    kubectl get pods -n igo-ns   # READY 0/1 常与 readiness 有关
    

    环境变量与配置挂载

    # 直接设环境变量(会触发滚动更新)
    kubectl set env deploy/igo-web APP_ENV=prod LOG_LEVEL=info -n igo-ns
    
    # 从 ConfigMap / Secret 注入
    kubectl set env deploy/igo-web --from=configmap/igo-config -n igo-ns
    kubectl set env deploy/igo-web --from=secret/igo-secret -n igo-ns
    
    # 删某个环境变量
    kubectl set env deploy/igo-web LOG_LEVEL- -n igo-ns
    

    YAML 写法:

    containers:
      - name: web
        env:
          - name: APP_NAME
            value: igo
          - name: DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: igo-secret
                key: password
        envFrom:
          - configMapRef:
              name: igo-config
        volumeMounts:
          - name: igo-cfg
            mountPath: /etc/igo
            readOnly: true
    volumes:
      - name: igo-cfg
        configMap:
          name: igo-config
    

    标签注解与排查

    # 打标签 / 注解
    kubectl label deploy igo-web owner=igo tier=frontend -n igo-ns --overwrite
    kubectl annotate deploy igo-web igo.io/change-id=CR-1001 -n igo-ns --overwrite
    
    # 按标签筛选
    kubectl get pods -l app=igo-web -n igo-ns
    kubectl get all -l owner=igo -n igo-ns
    
    # 常用排查
    kubectl get events -n igo-ns --sort-by='.lastTimestamp'
    kubectl logs -l app=igo-web -n igo-ns --tail=100 -f
    kubectl logs deploy/igo-web -n igo-ns --previous          # 上次崩溃容器日志
    kubectl exec -it deploy/igo-web -n igo-ns -- /bin/sh
    kubectl port-forward svc/igo-web 8080:80 -n igo-ns
    
    # 节点资源
    kubectl top nodes
    kubectl describe node <node-name> | grep -A20 Allocated
    

    优雅终止与强制删除

    # 默认会等 terminationGracePeriodSeconds(常为 30s)
    kubectl delete pod igo-pod -n igo-ns
    
    # 缩短等待
    kubectl delete pod igo-pod -n igo-ns --grace-period=10
    
    # 卡住删不掉时(慎用,可能留脏状态)
    kubectl delete pod igo-pod -n igo-ns --force --grace-period=0
    
    # Deployment 滚动时想更快腾出节点,可在 YAML 中设置
    
    spec:
      template:
        spec:
          terminationGracePeriodSeconds: 30
          containers:
            - name: web
              lifecycle:
                preStop:
                  exec:
                    command: ["sh", "-c", "sleep 5"]   # 给负载均衡摘流一点时间
    

    运维操作一览(igo-web)

    目标 命令
    改副本 kubectl scale deploy/igo-web --replicas=3 -n igo-ns
    设 CPU/内存 kubectl set resources deploy/igo-web ...
    换镜像发布 kubectl set image deploy/igo-web web=nginx:1.26 -n igo-ns
    回滚 kubectl rollout undo deploy/igo-web -n igo-ns
    重启 Pod kubectl rollout restart deploy/igo-web -n igo-ns
    看用量 kubectl top pods -n igo-ns
    自动扩缩 kubectl autoscale deploy/igo-web --cpu-percent=70 --min=2 --max=10 -n igo-ns
    注入环境变量 kubectl set env deploy/igo-web APP_ENV=prod -n igo-ns

    ↑ 回到导航


    推荐最小组合

    日常无状态 Web 应用,最小闭环通常是:

    Namespace(igo-ns)
      └─ Deployment(igo-web)
           ├─ ConfigMap(igo-config) / Secret(igo-secret)   # 可选
           └─ Service(igo-web)
                └─ Ingress(igo-web)                        # 对外 HTTP 时
    

    一键骨架示例:

    kubectl create ns igo-ns
    kubectl create deploy igo-web --image=nginx:1.25 -n igo-ns
    kubectl expose deploy/igo-web --port=80 -n igo-ns
    kubectl get all -n igo-ns
    

    清理实验资源:

    kubectl delete ns igo-ns
    # 集群级资源需单独删:PV / StorageClass / ClusterRole / ClusterRoleBinding
    kubectl delete pv igo-pv --ignore-not-found
    kubectl delete sc igo-fast --ignore-not-found
    kubectl delete clusterrole igo-node-reader --ignore-not-found
    kubectl delete clusterrolebinding igo-node-reader-binding --ignore-not-found
    

    附录:kind 缩写速查

    全称 缩写 igo 示例名
    Namespace ns igo-ns
    Pod po igo-pod
    Deployment deploy igo-web
    StatefulSet sts igo-db
    DaemonSet ds igo-agent
    Job job igo-batch
    CronJob cj igo-cleanup
    Service svc igo-web
    Ingress ing igo-web
    NetworkPolicy netpol igo-web-allow
    ConfigMap cm igo-config
    Secret secret igo-secret
    PersistentVolume pv igo-pv
    PersistentVolumeClaim pvc igo-pvc
    StorageClass sc igo-fast
    ServiceAccount sa igo-sa
    Role role igo-reader
    ClusterRole clusterrole igo-node-reader
    RoleBinding rolebinding igo-reader-binding
    ClusterRoleBinding clusterrolebinding igo-node-reader-binding

    ↑ 回到导航

    MP3