Kubernetes

K8s 高阶配置全解

·15 分钟阅读·5914 字
📋 目录

K8s 高阶配置全解

结合前面学习的 Pod 生命周期、命名空间、资源限制、QoS、Hook、Init/Sidecar,下面系统梳理 K8s 高阶配置,分为 Pod 高阶配置、安全权限、调度增强、网络高级、存储高级、运行时特性、污点与容忍、亲和性 八大模块,附带配置示例、原理、使用场景、踩坑点与面试考点,偏向生产落地+面试。

1. 共享进程命名空间 shareProcessNamespace

1.1. 作用

同一个 Pod 内所有容器共享 PID 命名空间,容器之间可以互相看到进程、互相发送信号、共享进程树。默认 Pod 内容器 PID 隔离,开启后打通。

1.2. 适用场景

  • 主容器与 Sidecar 互相查看、管理进程
  • 调试容器内进程、抓包、故障排查
  • 一个容器帮另一个容器优雅终止进程

1.3. 配置示例

apiVersion: v1
kind: Pod
metadata:
  name: share-pid-demo
spec:
  shareProcessNamespace: true
  containers:
  - name: main
    image: nginx
  - name: sidecar
    image: busybox
    command: ["sleep", "3600"]

1.4. 特性与考点

  1. 开启后,Pod 内所有容器 ps 能看到彼此进程
  2. Pod 内 PID=1 是 pause 容器,不再是业务容器
  3. 会打破容器进程隔离,生产非调试场景谨慎使用

2. 终止宽限期 terminationGracePeriodSeconds

前面 Hook 提过,属于生产优雅停机标配高阶配置

  • 默认:30s
  • 有状态应用(MySQL、Redis、MQ)建议设 60~120s
  • 整个终止链路:摘除Endpoint → preStop → SIGTERM → 倒计时 → 超时 SIGKILL
spec:
  terminationGracePeriodSeconds: 60

3. 启动命令高阶组合:command + args

K8s 会覆盖容器镜像原有 Entrypoint / Cmd,是镜像改造常用配置。规则:

  1. 镜像原有:ENTRYPOINT ["xxx"] + CMD ["yyy"]
  2. Pod 配置 command → 覆盖原 ENTRYPOINT
  3. Pod 配置 args → 覆盖原 CMD

3.1. 示例

containers:
- name: app
  image: busybox
  command: ["/bin/sh", "-c"]
  args:
  - "echo start; sleep 3600"

4. 容器工作目录与高阶环境变量

4.1. 指定容器工作目录

containers:
- name: app
  image: nginx
  workingDir: /data/app

4.2. 环境变量高阶(4 种来源)

  1. 普通键值对
  2. 引用 Pod 自身字段 fieldRef(元数据注入)
  3. 引用资源配额 resourceFieldRef
  4. 引用 ConfigMap / Secret
containers:
- name: app
  image: busybox
  env:
  - name: APP_ENV
    value: "prod"
  - name: POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  - name: POD_IP
    valueFrom:
      fieldRef:
        fieldPath: status.podIP
  - name: CPU_LIMIT
    valueFrom:
      resourceFieldRef:
        containerName: app
        resource: limits.cpu

5. 安全上下文 securityContext

securityContext 分为 Pod 级别Container 级别,容器级别优先级更高。核心作用:权限管控、用户映射、系统能力、防提权、只读根文件系统,是容器安全加固核心。

5.1. 常用核心配置项

配置项作用
runAsUser容器运行 UID(非 root 运行,安全最佳实践)
runAsGroup容器运行 GID
fsGroup挂载卷目录属组(解决挂载权限问题)
allowPrivilegeEscalation禁止提权,默认 true,生产必须设 false
privileged特权容器,彻底打破隔离,生产严禁开启
readOnlyRootFilesystem根文件系统只读,防篡改、防木马
capabilitiesLinux 内核能力(精细权限控制)

5.2. 完整安全加固示例

apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 1000
    fsGroup: 1000
  containers:
  - name: app
    image: nginx
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
        - ALL

5.3. 关键考点与踩坑

  1. readOnlyRootFilesystem: true:根目录只读,应用无法写文件;需要临时目录则挂载 emptyDir
  2. fsGroup:宿主机挂载卷权限与容器运行用户不一致的问题
  3. privileged: true:拿到宿主机所有权限,生产禁止使用
  4. capabilities:最小权限原则:默认 drop: ["ALL"],按需 add 所需能力

6. 探针高阶配置

三大探针:startupProbe / livenessProbe / readinessProbe,生产必须组合使用。

6.1. 探针核心参数

  • initialDelaySeconds:首次探测延迟
  • periodSeconds:探测间隔
  • timeoutSeconds:探测超时
  • successThreshold:连续成功次数
  • failureThreshold:连续失败次数

6.2. 组合最佳实践(慢启动应用)

  1. startupProbe:启动阶段独占探测,启动完成后自动失效
  2. livenessProbe:运行期存活检测,失败重启容器
  3. readinessProbe:就绪检测,失败摘除流量

6.3. 面试考点

  • 三大探针执行顺序:startupProbe 优先执行,成功后才启用另外两个
  • liveness 失败 → 重启容器;readiness 失败 → 摘除 Service 流量
  • 慢启动应用(Java)必须配 startupProbe,防止误杀

7. 调度高阶

7.1. 节点亲和 nodeAffinity

强制/优先把 Pod 调度到指定标签的节点。分两类:

  1. requiredDuringSchedulingIgnoredDuringExecution:硬约束
  2. preferredDuringSchedulingIgnoredDuringExecution:软约束
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-role
            operator: In
            values: ["app"]

7.2. Pod 亲和与反亲和

Pod 亲和:让 Pod 和已有指定 Pod 部署在同一节点,就近访问。

Pod 反亲和(生产高频):不让同类 Pod 部署在同一节点,实现高可用。

spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: web
        topologyKey: kubernetes.io/hostname

7.3. 污点与容忍

  • 污点(Taint):打在节点上,拒绝普通 Pod 调度
  • 容忍(Toleration):打在 Pod 上,允许调度到污点节点

三大策略:NoSchedule / PreferNoSchedule / NoExecute

spec:
  tolerations:
  - key: "node-type"
    operator: "Equal"
    value: "special"
    effect: "NoSchedule"

8. 网络高阶配置

8.1. hostNetwork 主机网络

Pod 直接复用宿主机网络命名空间,Pod IP = 节点 IP,端口与宿主机共享。

spec:
  hostNetwork: true

8.2. hostPort 主机端口映射

将容器端口绑定到宿主机端口(不推荐替代 Service)

8.3. DNS 策略

  • ClusterFirst(默认):先走集群 CoreDNS,再外网
  • Default:复用宿主机 DNS
  • ClusterFirstWithHostNet:hostNetwork 场景专用

9. 存储 Volume 高阶配置

9.1. emptyDir 内存存储

emptyDir 默认磁盘,可挂载到 tmpfs 内存,高性能临时缓存:

volumes:
- name: tmp-volume
  emptyDir:
    medium: Memory
    sizeLimit: 1Gi

9.2. 子路径 subPath

单个 PVC 挂载多个目录,避免覆盖整个目录:

volumeMounts:
- name: pvc-data
  mountPath: /app/logs
  subPath: logs

9.3. 挂载传播 mountPropagation

volumeMounts:
- name: host-path
  mountPath: /host
  mountPropagation: Bidirectional

10. 运行时高级开关与内核参数

10.1. hostPID / hostIPC

打通宿主机命名空间,安全风险极高,仅节点运维组件使用。

10.2. 容器内核参数 sysctls

spec:
  securityContext:
    sysctls:
    - name: net.core.somaxconn
      value: "4096"

11. 综合高阶 Pod 生产模板

整合:安全上下文、资源、探针、Hook、亲和、容忍、存储

apiVersion: v1
kind: Pod
metadata:
  name: production-pod
  labels:
    app: web
spec:
  terminationGracePeriodSeconds: 60
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: web
        topologyKey: kubernetes.io/hostname
  tolerations:
  - key: node-role
    operator: Equal
    value: app
    effect: NoSchedule
  securityContext:
    runAsUser: 1000
    runAsGroup: 1000
    fsGroup: 1000
  containers:
  - name: web
    image: nginx:alpine
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 500m
        memory: 256Mi
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop: [ALL]
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo init ok"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "sleep 5; echo stop"]
    startupProbe:
      httpGet:
        path: /
        port: 80
      failureThreshold: 20
      periodSeconds: 3
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 20
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    volumeMounts:
    - name: log-volume
      mountPath: /var/log/nginx
  volumes:
  - name: log-volume
    emptyDir:
      medium: Memory

12. 高频高阶面试题

  1. 节点亲和、Pod 亲和/反亲和使用场景与区别?
  2. 污点三种类别(NoSchedule / PreferNoSchedule / NoExecute)区别?
  3. shareProcessNamespace 开启后有什么变化、风险?
  4. securityContext 常用配置项,如何做容器安全加固?
  5. startupProbe 解决什么问题?三大探针协同逻辑?
  6. hostNetwork / hostPID / hostIPC 风险与使用场景?
  7. subPath、emptyDir 内存模式作用?
  8. 如何让 Deployment 副本强制打散在不同节点?(Pod 反亲和)

关联文档