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. 特性与考点
- 开启后,Pod 内所有容器
ps能看到彼此进程 - Pod 内 PID=1 是 pause 容器,不再是业务容器
- 会打破容器进程隔离,生产非调试场景谨慎使用
2. 终止宽限期 terminationGracePeriodSeconds
前面 Hook 提过,属于生产优雅停机标配高阶配置:
- 默认:
30s - 有状态应用(MySQL、Redis、MQ)建议设
60~120s - 整个终止链路:摘除Endpoint → preStop → SIGTERM → 倒计时 → 超时 SIGKILL
spec:
terminationGracePeriodSeconds: 60
3. 启动命令高阶组合:command + args
K8s 会覆盖容器镜像原有 Entrypoint / Cmd,是镜像改造常用配置。规则:
- 镜像原有:
ENTRYPOINT ["xxx"]+CMD ["yyy"] - Pod 配置
command→ 覆盖原ENTRYPOINT - 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 种来源)
- 普通键值对
- 引用 Pod 自身字段
fieldRef(元数据注入) - 引用资源配额
resourceFieldRef - 引用 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 | 根文件系统只读,防篡改、防木马 |
| capabilities | Linux 内核能力(精细权限控制) |
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. 关键考点与踩坑
- readOnlyRootFilesystem: true:根目录只读,应用无法写文件;需要临时目录则挂载
emptyDir - fsGroup:宿主机挂载卷权限与容器运行用户不一致的问题
- privileged: true:拿到宿主机所有权限,生产禁止使用
- capabilities:最小权限原则:默认
drop: ["ALL"],按需add所需能力
6. 探针高阶配置
三大探针:startupProbe / livenessProbe / readinessProbe,生产必须组合使用。
6.1. 探针核心参数
initialDelaySeconds:首次探测延迟periodSeconds:探测间隔timeoutSeconds:探测超时successThreshold:连续成功次数failureThreshold:连续失败次数
6.2. 组合最佳实践(慢启动应用)
- startupProbe:启动阶段独占探测,启动完成后自动失效
- livenessProbe:运行期存活检测,失败重启容器
- readinessProbe:就绪检测,失败摘除流量
6.3. 面试考点
- 三大探针执行顺序:
startupProbe优先执行,成功后才启用另外两个 - liveness 失败 → 重启容器;readiness 失败 → 摘除 Service 流量
- 慢启动应用(Java)必须配 startupProbe,防止误杀
7. 调度高阶
7.1. 节点亲和 nodeAffinity
强制/优先把 Pod 调度到指定标签的节点。分两类:
requiredDuringSchedulingIgnoredDuringExecution:硬约束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:复用宿主机 DNSClusterFirstWithHostNet: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. 高频高阶面试题
- 节点亲和、Pod 亲和/反亲和使用场景与区别?
- 污点三种类别(NoSchedule / PreferNoSchedule / NoExecute)区别?
- shareProcessNamespace 开启后有什么变化、风险?
- securityContext 常用配置项,如何做容器安全加固?
- startupProbe 解决什么问题?三大探针协同逻辑?
- hostNetwork / hostPID / hostIPC 风险与使用场景?
- subPath、emptyDir 内存模式作用?
- 如何让 Deployment 副本强制打散在不同节点?(Pod 反亲和)
关联文档
- Pod 生命周期钩子(Hook)完整详解 — Pod 生命周期
- K8s 安全上下文(SecurityContext)全解 — 容器安全
- K8s 环境变量 全维度详解 — 配置注入
- K8s 高阶调度全解 — 调度与亲和