k8s pod 管理
1、命名空间管理
命名空间(Namespace)是 Kubernetes 中实现集群资源逻辑隔离的核心机制,可将一个物理集群划分为多个虚拟集群。不同命名空间中的资源名称可以重复,资源配额、权限策略均可按命名空间独立配置,非常适合多团队共享集群、多环境(开发 / 测试 / 生产)隔离、资源精细化管控等场景。
Kubernetes 集群默认内置 4 个系统命名空间,各司其职:
default:用户未指定命名空间时,资源默认创建在此空间中,适合日常测试与小规模应用。kube-system:存放 Kubernetes 集群核心组件,如 kube-apiserver、kube-controller-manager、CoreDNS、网络插件等,属于集群关键管控资源,普通业务不建议部署在此空间。kube-public:该命名空间下的资源对所有用户(包括未认证用户)可读,通常用于存放集群公共信息、全局配置等。kube-node-lease:用于存储节点心跳租约对象(Lease),提升节点心跳检测的性能与效率,是集群节点状态管理的核心组件。
# 查看命名空间(名称、状态、存在时长)
[root@k8s-master ~]# kubectl get namespaces
# 创建命名空间(支持小写字母、数字和连字符)
[root@k8s-master ~]# kubectl create namespace timinglee
# 删除命名空间(会删除ns内所有资源)
[root@k8s-master ~]# kubectl delete namespaces timinglee
2、pod管理
Pod 是 Kubernetes 中最小的调度与运行单元,它不是单个容器,而是一组(一个或多个)共享网络、存储栈的容器的集合。同一个 Pod 内的容器可以通过 localhost 互相访问,共享挂载卷,拥有独立的 Pod IP。日常业务中绝大多数 Pod 由 Deployment、StatefulSet 等控制器管理,裸 Pod(无控制器管理)不具备自愈与扩缩容能力。
# 查看pod,-o wide 显示节点、PodIP
kubectl get pods -o wide
# 命令式创建pod
kubectl run lee --image nginx:latest
# 查看pod详细事件(排错核心,ImagePullBackOff镜像拉取失败看这里)
kubectl describe pods error
# 删除单个pod
kubectl delete pods error
# 删除当前命名空间所有pod
kubectl delete pods --all
3、kubectl 常用实操命令
kubectl 是 Kubernetes 的命令行管理工具,支持命令式对象管理、命令式对象配置、声明式对象配置三种操作模式。以下为日常运维中最高频的资源管理命令,覆盖部署、更新、排障、运维全流程。
#create:命令式创建deployment
kubectl create deployment webcluster --replicas 2 --image myapp:v1
#edit:直接编辑在线资源yaml
kubectl edit deployments.apps webcluster
#patch:json片段修改资源
kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'
#expose:创建service暴露应用
kubectl expose deployment webcluster --port 80 --target-port 80
#logs:查看pod容器日志
kubectl logs pods/webcluster-77c87d9946-gh9v7
#attach:连接容器标准输入输出
kubectl attach pods/testpod -it
#exec:进入容器执行命令(最常用)
kubectl exec -it pods/testpod -c testpod -- /bin/bash
#cp:宿主机和pod之间拷贝文件
kubectl cp testpod:/usr/share/nginx/html/index.html /mnt/test
kubectl cp /mnt/index.html testpod:/usr/share/nginx/html/index.html
#rollout:版本更新、重启、历史
kubectl rollout status deployment webcluster
kubectl rollout restart deployment webcluster
kubectl rollout history deployment webcluster
#scale:扩缩副本数
kubectl scale deployment webcluster --replicas 4
#label:增删标签,`key-`代表删除标签
kubectl label pods webcluster-9787d97f6-zl6q2 app-
kubectl label pods webcluster-9787d97f6-zl6q2 app=webcluster
4、YAML 声明式编写 Pod
声明式配置是 Kubernetes 推荐的生产级使用方式,通过 YAML 文件定义资源的期望状态,使用 kubectl apply -f 文件名.yaml 提交,具备幂等性(多次提交结果一致),便于版本控制、审计与复用。以下为 Pod 常见配置场景的 YAML 示例与说明
Pod 多容器
多容器是 Pod 的核心设计之一,遵循「一个 Pod 一个业务主容器 + 辅助容器」的边车(Sidecar)模式。同一个 Pod 内的所有容器共享网络命名空间(可通过 localhost 互访)、共享存储卷、共享主机名。辅助容器常见用途包括:日志收集、流量代理、配置同步、健康检查辅助等。
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: myapp:v1
name: myapp1
- image: busyboxplus:latest
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
hostPort 端口映射
hostPort 会将容器端口直接映射到 Pod 所在宿主机的端口上,外部可通过「节点 IP:hostPort」直接访问该容器。 注意事项:
- 同一宿主机上同一 hostPort 只能绑定一个 Pod,存在端口冲突风险,无法在单节点上多副本部署;
- Pod 漂移到其他节点后,访问地址会随节点 IP 变化,不适合作为稳定服务入口;
- 仅适合临时调试、单体组件场景,生产环境推荐用 Service 暴露服务。
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: myapp:v1
name: myapp1
ports:
- name: http
containerPort: 80 #容器内部端口
hostPort: 80 #宿主机节点端口
protocol: TCP
env 环境变量注入
环境变量是向容器内传递配置的最简单方式,示例中为字面量直接赋值。除了静态值,环境变量还支持从 ConfigMap、Secret、字段引用(如 Pod 名称、节点 IP)等动态获取,是应用配置管理的基础方式之一。
apiVersion: v1
kind: Pod
metadata:
labels:
run: mysql
name: mysql
spec:
containers:
- image: mysql:8.0
name: mysql8
env:
- name: MYSQL_ROOT_PASSWORD
value: lee
nodeSelector 指定调度节点
nodeSelector 是最简单的节点定向调度方式,通过节点标签匹配,强制将 Pod 调度到带有对应标签的节点上。示例中使用 Kubernetes 内置的主机名标签 kubernetes.io/hostname,也可自定义节点标签实现业务分组、专属节点池调度。更灵活的调度策略可通过节点亲和性、Pod 亲和性实现。
apiVersion: v1
kind: Pod
metadata:
labels:
run: mysql
name: mysql
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node2
containers:
- image: mysql:8.0
name: mysql
hostNetwork 共享宿主机网络栈
开启 hostNetwork: true 后,Pod 将直接使用宿主机的网络命名空间,容器的网络与宿主机完全一致,端口直接监听在宿主机上,网络性能损耗最低。 注意事项:
- 网络隔离性完全丧失,容器可访问宿主机全部网络栈,存在安全风险;
- 容器端口与宿主机端口直接冲突,同端口无法多副本部署;
- 仅适用于需要操作主机网络的组件,如网络插件、节点监控、流量采集工具等,普通业务不建议开启。
piVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
hostNetwork: true
containers:
- image: busybox:latest
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
5、Pod QoS 资源服务质量等级
QoS(Quality of Service,服务质量)是 Kubernetes 为 Pod 划分的资源优先级等级,由 Pod 内容器的 requests(资源申请)和 limits(资源上限)配置共同决定。当节点出现资源不足(尤其是内存不足)时,kubelet 会按照 QoS 等级从低到高依次驱逐 Pod,优先保证高优先级业务的运行。
BestEffort:不配置 requests/limits,优先级最低
BestEffort 等级的 Pod 没有任何资源申请与限制,节点资源充足时可尽可能使用空闲资源,资源紧张时会被最先驱逐。适合非核心、可中断的低优先级任务,如临时测试、批量计算任务等。
resources: {} #不写resources字段
Burstable:requests < limits,优先级中等
resources:
limits:
cpu: 700m
memory: 200M
requests:
cpu: 500m
memory: 100M
Guaranteed:requests 与 limits 完全相等,优先级最高
Guaranteed 等级的 Pod 资源申请与上限完全一致,Kubernetes 会为其完整预留对应资源,不与其他 Pod 共享。该等级 Pod 优先级最高,节点资源不足时几乎不会被驱逐,仅在系统 OOM 且无更低等级 Pod 可驱逐时才会被影响。适合数据库、核心业务服务等对稳定性要求极高的应用。
补充说明:QoS 是 Pod 级别的属性,由 Pod 中所有容器的资源配置共同决定;只要有一个容器不符合规则,就会影响整个 Pod 的 QoS 等级。
resources:
limits:
cpu: 500m
memory: 100M
requests:
cpu: 500m
memory: 100M
6、restartPolicy 容器重启策略(Pod 级别)
重启策略定义了当 Pod 内容器退出时,kubelet 的处理行为,属于 Pod 级别的全局配置,对 Pod 内所有容器生效。重启是指在当前节点本地重启容器,不会重建 Pod,Pod IP 与所在节点保持不变。
Always:无论容器怎么退出,总是重启(deployment 默认)
无论容器是正常退出(退出码 0)还是异常退出(退出码非 0),kubelet 都会自动重启容器。适用于需要长期持续运行的服务类应用,如 Web 服务、缓存、数据库等,是 Deployment 控制器的默认重启策略。
OnFailure:容器异常退出(返回码≠0)才重启;正常退出不重启
仅当容器以非 0 状态码异常退出时,才触发重启;若容器正常执行完成退出(退出码 0),则不再重启。适用于一次性批处理任务,执行成功即结束,失败则自动重试,是 Job 控制器的常用策略。
Never:无论退出状态,永远不重启(Job 常用)
无论容器退出状态如何,都不会重启容器。Pod 中所有容器退出后,Pod 进入终态(Succeeded 或 Failed)。适合单次执行、无需重试的任务,或需要自行管理重启逻辑的场景。
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
restartPolicy: OnFailure
containers:
- image: busybox:latest
name: busybox
command: ["/bin/sh","-c","sleep 30"]
7、Pod 生命周期
Pod 拥有完整的生命周期,从创建到终止会经历 Pending(等待调度)、Running(运行中)、Succeeded(成功终止)、Failed(异常终止)、Unknown(状态未知)几个阶段。除了主业务容器,Kubernetes 还提供了初始化容器、生命周期探针等机制,精细化管控 Pod 的启动、运行与健康状态。
init 容器
初始化容器(Init Container)是在业务容器启动前运行的容器,用于完成启动前的准备工作。 核心特点:
- 串行执行:多个 Init 容器按定义顺序依次执行,前一个执行成功后才会启动下一个;
- 必须全部成功:所有 Init 容器都执行成功后,才会启动主业务容器;
- 不支持就绪探针:Init 容器只需执行完成,无需持续运行;
- 资源计入 Pod 总申请:Init 容器的资源请求会纳入 Pod 调度时的资源计算。
initContainers:初始化容器,必须全部成功执行完毕后,才启动业务容器,常用于等待依赖、初始化配置。
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
initContainers:
- name: busybox
image: busybox:latest
command:
- /bin/sh
- -c
- "until test -e /testfile;do echo wating for myservice; sleep 2;done"
containers:
- image: myapp:v1
name: webserver
restartPolicy: Always
livenessProbe 存活探针
存活探针用于检测容器是否处于正常运行状态。如果探测失败,kubelet 会判定容器异常,并自动重启该容器,以此实现故障自愈。
支持三种探测方式:
exec:在容器内执行指定命令,命令退出码为 0 则判定成功,适合自定义健康检查逻辑;tcpSocket:尝试连接容器指定端口,能建立 TCP 连接则判定成功,适合端口类服务;httpGet:向容器指定端口与路径发送 HTTP GET 请求,返回状态码在 200~399 之间则判定成功,适合 Web 服务。
关键参数说明:
initialDelaySeconds:容器启动后延迟多久开始第一次探测,需适配应用启动耗时,避免应用未就绪就被误杀;periodSeconds:两次探测的间隔时间;timeoutSeconds:单次探测的超时时间;- 另有
failureThreshold(连续失败多少次后触发重启)、successThreshold(连续成功多少次后判定恢复正常)。
注意:存活探针配置不当会导致容器频繁误重启,需结合应用实际启动速度合理设置参数。
containers:
- image: myapp:v1
name: testpod
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3 #启动后多久第一次探测
periodSeconds: 1 #探测间隔
timeoutSeconds: 1 #探测超时
readinessProbe 就绪探针
就绪探针用于检测容器内的业务是否具备对外服务的能力。探测失败时,不会重启容器,而是将该 Pod 从对应 Service 的端点列表中摘除,停止接收新流量;探测恢复成功后,再重新加入 Service 端点,恢复流量。
核心作用:
- 保证滚动更新时,新 Pod 完全就绪后才接入流量,旧 Pod 才开始下线,避免服务中断;
- 业务内部故障时自动摘流,避免将请求转发给异常实例。
探测方式与参数配置与存活探针完全一致,二者常配合使用:存活探针保证容器活着,就绪探针保证服务可用。
补充:此外还有
startupProbe(启动探针),专门用于启动缓慢的应用。启动探针成功前,存活探针与就绪探针都不会生效;启动探针探测成功后,自动交由存活探针接管,避免慢启动应用在启动阶段被存活探针误重启。
containers:
- image: myapp:v1
name: webserver
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 2
timeoutSeconds: 1
8、Deployment 版本升级与回退
Deployment 是 Kubernetes 中最常用的无状态应用控制器,它通过管理 ReplicaSet(副本集)来实现 Pod 的滚动更新、版本回溯、弹性扩缩容。每次更新 Deployment 配置(如镜像版本、环境变量),都会生成一个新的 ReplicaSet 版本,历史版本会被保留,支持随时回退,保证发布过程的可控与可回滚。
滚动更新核心原理:更新过程中,Deployment 会逐步增加新版本 ReplicaSet 的副本数,同时减少旧版本 ReplicaSet 的副本数,全程保证可用副本数维持在预期范围内,实现服务不中断升级。更新速度由 maxSurge(最大超出副本数)和 maxUnavailable(最大不可用副本数)两个参数控制。
#升级镜像
kubectl set image deployments webcluster myapp=myapp:v2
#记录更新说明,写入revision
kubectl annotate deployment webcluster kubernetes.io/change-cause="myappv2" --overwrite
#查看版本历史
kubectl rollout history deployment webcluster
#回退到指定版本
kubectl rollout undo deployment webcluster --to-revision=1
#暂停更新
kubectl rollout pause deployment webcluster
#恢复更新
kubectl rollout resume deployment webcluster
总结
本文系统梳理了 Kubernetes 基础运维的核心知识点,从命名空间的资源隔离机制、Pod 的基础操作与声明式配置,到资源服务质量等级、容器生命周期管控,再到 Deployment 的滚动发布与版本回退,覆盖了日常集群运维中最高频的操作与底层核心原理。
这些内容是 Kubernetes 运维的入门基本功,既是日常应用部署、故障排查、版本迭代的实操依据,也是理解集群调度逻辑、服务高可用机制的基础。熟练掌握上述命令与配置规则,可高效完成绝大多数无状态应用的部署与运维工作,为后续深入学习集群调度、有状态服务管理、可观测性与自动化运维打下坚实基础。
更多推荐



所有评论(0)