Kubernetes

K8s 高阶配置全解

·15 分钟阅读·5914 字

梳理K8s 高阶配置的实施流程、关键配置与运维注意事项

📋 目录

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 反亲和)

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro