3-2-3、k8s学习-pod基本使用
1、K8s Pod 基本使用指南
一、Pod 基础概念
Pod 是 Kubernetes 中最小的调度单元,一个 Pod 包含一个或多个紧密关联的容器,这些容器共享网络命名空间、存储卷和进程空间。
- 核心特性:
- 容器组:多个容器协同工作(如前端 + 后端)。
- 共享资源:共享 IP、端口空间和存储卷。
- 短暂性:Pod 可能因节点故障、扩缩容等原因被重新创建。
二、创建 Pod 的方式
1. 使用 kubectl run 命令(快速创建)
bash
# 创建一个运行 Nginx 的 Pod
kubectl run nginx-pod --image=nginx:latest --port=80
# 查看 Pod 状态
kubectl get pods
# 查看 Pod 详细信息
kubectl describe pod nginx-pod
2. 使用 YAML 配置文件(推荐生产环境)
yaml
apiVersion: v1 # API 版本
kind: Pod # 资源类型为 Pod
metadata:
name: nginx-pod # Pod 名称
namespace: default # 命名空间(默认 default)
labels:
app: nginx # 标签,用于筛选资源
spec:
containers:
- name: nginx # 容器名称
image: nginx:latest # 容器镜像
ports:
- containerPort: 80 # 容器暴露端口
resources:
requests:
cpu: 100m # 申请 100 毫核 CPU
memory: 128Mi # 申请 128MB 内存
limits:
cpu: 200m # 限制 200 毫核 CPU
memory: 256Mi # 限制 256MB 内存
volumeMounts:
- name: data-volume # 挂载卷名称
mountPath: /usr/share/nginx/html # 容器内挂载路径
volumes:
- name: data-volume # 卷名称
emptyDir: {} # 临时空目录卷(数据随 Pod 销毁)
创建命令:
bash
kubectl apply -f nginx-pod.yaml
三、Pod 核心配置字段解析
| 字段 | 说明 |
|---|---|
metadata.name |
Pod 的唯一名称,同一命名空间内不可重复。 |
spec.containers |
容器列表,至少包含一个容器,定义镜像、资源限制、端口等。 |
spec.restartPolicy |
重启策略,可选 Always(默认,失败时重启)、OnFailure、Never。 |
spec.volumes |
存储卷定义,支持 emptyDir、hostPath、PVC 等多种类型。 |
spec.nodeSelector |
节点选择器,指定 Pod 调度到包含特定标签的节点。 |
spec.tolerations |
污点容忍,允许 Pod 调度到标记了污点的节点。 |
四、Pod 生命周期与状态
1. 生命周期阶段
- Pending:Pod 已创建,但容器镜像未完全拉取或节点未调度。
- Running:Pod 已绑定到节点,所有容器正在运行。
- Succeeded:容器成功执行并退出(适用于批处理任务)。
- Failed:容器执行失败(退出码非 0)。
- Unknown:无法获取 Pod 状态(通常因节点通信问题)。
2. 查看状态命令
bash
# 查看所有 Pod 状态
kubectl get pods -o wide # -o wide 显示节点信息
# 查看 Pod 详细事件(用于排查问题)
kubectl describe pod <pod-name>
五、Pod 健康检查(Probe)
K8s 支持两种探针确保容器健康:
1. 存活探针(Liveness Probe)
- 作用:检测容器是否存活,失败时重启容器。
- 示例配置:
yaml
livenessProbe: httpGet: path: /healthz # 检查路径 port: 80 # 端口 scheme: HTTP # 协议 initialDelaySeconds: 10 # 启动后 10 秒开始检查 periodSeconds: 5 # 每 5 秒检查一次 failureThreshold: 3 # 连续 3 次失败则重启容器
2. 就绪探针(Readiness Probe)
- 作用:检测容器是否准备好接收流量,失败时将 Pod 从服务端点移除。
- 示例配置(TCP 检查):
yaml
readinessProbe: tcpSocket: port: 8080 # 检查 TCP 端口 initialDelaySeconds: 5 # 启动后 5 秒开始检查
六、Pod 常用操作命令
| 操作 | 命令 |
|---|---|
| 查看 Pod 列表 | kubectl get pods |
| 查看 Pod 日志 | kubectl logs <pod-name> |
| 进入容器 shell | kubectl exec -it <pod-name> -- /bin/bash |
| 删除 Pod | kubectl delete pod <pod-name> |
| 查看 Pod 资源使用 | kubectl top pod <pod-name> |
| 端口转发(调试用) | kubectl port-forward <pod-name> 本地端口:容器端口 |
七、Pod 调度策略
1. 节点选择器(NodeSelector)
- 通过标签匹配指定节点:
yaml
spec: nodeSelector: disk-type: ssd # 调度到具有 "disk-type=ssd" 标签的节点
2. 亲和性与反亲和性(Affinity / 反 Affinity)
- 节点亲和性(Node Affinity):
yaml
spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: environment operator: In values: ["production"] - Pod 亲和性(Pod Affinity):与其他 Pod 部署在同一节点。
- Pod 反亲和性(Pod Anti-Affinity):与其他 Pod 部署在不同节点。
八、多容器 Pod(Sidecar 模式)
典型场景:主容器 + 日志收集器 / 监控代理。
yaml
spec:
containers:
- name: app-container # 主应用容器
image: my-app:latest
- name: log-collector # 日志收集 Sidecar
image: log-collector:v1
volumeMounts:
- name: log-volume
mountPath: /app-logs
volumes:
- name: log-volume
hostPath:
path: /var/log/app # 挂载宿主机日志目录
九、最佳实践
- 避免直接创建 Pod:生产环境通过控制器(如 Deployment、StatefulSet)管理 Pod,实现自动扩缩容和故障恢复。
- 资源限制:为容器设置
requests和limits,避免资源竞争。 - 标签规范:使用
app、tier、env等标签分类管理 Pod。 - 存储卷持久化:对有状态应用使用
PersistentVolumeClaim而非临时卷。 - 健康检查:始终配置 liveness 和 readiness 探针,保障服务可用性。
十、进阶扩展
- Pod 安全策略(PodSecurityPolicy):限制 Pod 对宿主机资源的访问。
- Pod 优先级(PriorityClass):定义 Pod 调度优先级,保障关键应用优先部署。
- 污点(Taint)与容忍(Toleration):控制节点与 Pod 的绑定关系(如专用节点)。
通过以上内容,可全面掌握 K8s Pod 的基础使用。实际应用中,建议结合控制器(如 Deployment)管理 Pod,以实现更健壮的容器编排。
2、Kubernetes Pod 操作命令大全
在 Kubernetes 中,Pod 是最小的可部署计算单元。以下是常用的 Pod 操作命令集合,涵盖基础操作、状态查看、故障排查等场景。
一、基础操作命令
-
查看 Pod 列表
bash
kubectl get pods # 查看当前命名空间下所有Pod kubectl get pods -A # 查看所有命名空间下的Pod kubectl get pods -n kube-system # 查看特定命名空间下的Pod kubectl get pods -o wide # 显示详细信息(包含IP、节点等) kubectl get pods -o yaml # 输出YAML格式 kubectl get pods -o json # 输出JSON格式 -
创建 Pod
bash
kubectl apply -f pod.yaml # 通过YAML文件创建 kubectl run nginx --image=nginx # 快速创建nginx Pod -
删除 Pod
bash
kubectl delete pod my-pod # 删除指定Pod kubectl delete pods --all # 删除当前命名空间下所有Pod kubectl delete -f pod.yaml # 删除YAML文件定义的Pod -
强制删除 Pod
bash
kubectl delete pod my-pod --grace-period=0 --force
二、Pod 状态与详情
-
查看 Pod 详细信息
bash
kubectl describe pod my-pod # 查看Pod详细描述 -
查看 Pod 日志
bash
kubectl logs my-pod # 查看Pod当前日志 kubectl logs -f my-pod # 实时流式查看日志(类似tail -f) kubectl logs my-pod -c container-name # 查看多容器Pod中特定容器的日志 kubectl logs my-pod --previous # 查看前一个容器实例的日志(容器重启后) -
查看 Pod 事件
bash
kubectl get events --field-selector involvedObject.name=my-pod
三、Pod 内部操作
-
进入 Pod 容器
bash
kubectl exec -it my-pod -- bash # 进入Pod的默认容器 kubectl exec -it my-pod -c container-name -- sh # 进入多容器Pod的特定容器 -
在 Pod 内执行命令
bash
kubectl exec my-pod -- ls / # 执行ls命令 kubectl exec my-pod -- cat /etc/hosts # 查看hosts文件
四、Pod 故障排查
-
检查 Pod 健康状态
bash
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,RESTARTS:.status.containerStatuses[0].restartCount -
检查 Pod 调度失败原因
bash
kubectl describe pod my-pod | grep -A 10 "FailedScheduling" -
检查容器崩溃循环
bash
kubectl get pods my-pod -o jsonpath='{.status.containerStatuses[0].state.waiting.message}'
五、Pod 资源与标签
-
查看 Pod 资源使用情况
bash
kubectl top pods # 查看CPU和内存使用情况 kubectl top pods --containers # 按容器显示资源使用 -
添加 / 修改 Pod 标签
bash
kubectl label pods my-pod app=frontend # 添加标签 kubectl label pods my-pod env=prod --overwrite # 修改已有标签 -
基于标签筛选 Pod
bash
kubectl get pods -l app=nginx # 筛选特定标签的Pod kubectl get pods -l 'app in (nginx,mysql)' # 多值筛选
六、Pod YAML 操作
-
生成 Pod YAML 模板
bash
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml -
查看运行中 Pod 的 YAML 定义
bash
kubectl get pod my-pod -o yaml -
修补(Patch)Pod 配置
bash
kubectl patch pod my-pod -p '{"spec":{"containers":[{"name":"nginx","image":"nginx:1.21"}]}}'
七、高级操作
-
端口转发
bash
kubectl port-forward my-pod 8080:80 # 将Pod的80端口映射到本地8080端口 -
复制文件到 / 从 Pod
bash
kubectl cp my-pod:/tmp/file.txt ./local-file.txt # 从Pod复制文件 kubectl cp ./local-file.txt my-pod:/tmp/ # 复制文件到Pod -
强制驱逐不可用节点上的 Pod
bash
kubectl drain node-name --ignore-daemonsets --force -
滚动重启 Pod
bash
kubectl rollout restart deployment my-deployment # 重启Deployment下属的所有Pod
八、常用参数速查表
| 参数 | 作用 |
|---|---|
-n NAMESPACE |
指定命名空间 |
-o FORMAT |
指定输出格式(yaml/json/wide) |
--all-namespaces |
跨所有命名空间操作 |
--watch |
实时监控资源变化 |
--dry-run=client |
模拟执行,不实际创建资源 |
--grace-period=0 |
立即删除,跳过优雅终止 |
九、实践建议
-
使用别名简化命令:
bash
alias k=kubectl complete -F __start_kubectl k # 启用命令补全 -
使用 Krew 插件扩展功能:
bash
kubectl krew install tree # 树形查看资源关系 kubectl krew install neat # 美化YAML输出 -
使用自定义输出模板:
bash
kubectl get pods -o custom-columns='NAME:.metadata.name,NODE:.spec.nodeName,IP:.status.podIP' -
结合
watch实时监控:bash
watch -n 1 kubectl get pods # 每秒刷新一次Pod状态
通过这些命令,你可以全面管理 Kubernetes 中的 Pod 资源。建议结合kubectl explain命令查看资源字段详情,或使用kubectl docs访问官方文档。
更多推荐


所有评论(0)