k8spod管理

Kubernetes Pod 管理与控制器管理

本文档系统梳理 Kubernetes 中 Pod 管理与控制器(Controller)的核心概念与操作实践,配合实验命令与 YAML 配置,帮助深入理解各组件的设计原理与使用方式。


第一部分:Pod 管理

1.1 命名空间(Namespace)

概念说明:

Kubernetes 集群通过命名空间实现逻辑隔离。不同命名空间中的资源相互隔离,但共享底层集群的计算、存储和网络资源。命名空间为多租户场景提供了资源分组与权限管控的基础能力。

Kubernetes 内置的默认命名空间如下:

命名空间 用途
default 未显式指定命名空间时,资源默认部署到此命名空间
kube-system 存放集群系统组件(如 CoreDNS、kube-scheduler 等)
kube-public 所有用户均可读取的公共命名空间
kube-node-lease 存储节点心跳租约信息,用于节点健康检测

实验命令:

bash 复制代码
# 查看所有命名空间
kubectl get namespaces

# 创建自定义命名空间
kubectl create namespace timinglee

# 删除命名空间
kubectl delete namespace timinglee

对应 YAML 写法:

yaml 复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: timinglee

1.2 Pod 基础操作 ------ 创建、查看、删除

概念说明:

Pod 是 Kubernetes 中最小的可部署计算单元。一个 Pod 封装了一个或多个紧密耦合的容器、存储资源、网络 IP 以及运行选项。创建 Pod 即向 API Server 提交一个 Pod 定义,由调度器将其分配到合适的节点上运行。

核心命令:

bash 复制代码
# 查看当前命名空间中的 Pod,并显示运行节点和 IP 信息
kubectl get pods -o wide

# 创建运行 nginx 的 Pod
kubectl run lee --image nginx:latest

# 验证 Pod 创建状态
kubectl get pods -o wide
# 输出示例:
# NAME   READY   STATUS    RESTARTS   AGE   IP            NODE
# lee    1/1     Running   0          25s   10.244.1.10   k8s-node1

# 删除指定 Pod
kubectl delete pods lee

# 删除当前命名空间中的所有 Pod
kubectl delete pods --all

对应 YAML 写法:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: lee
  labels:
    run: lee
spec:
  containers:
  - name: nginx
    image: nginx:latest

1.3 Pod 故障排查

概念说明:

Pod 创建后若状态非 Running,需通过 describelogs 命令进行故障定位。常见状态及含义如下:

状态 含义
Pending Pod 已被接受,但尚未调度到节点或镜像拉取中
ImagePullBackOff 镜像名称错误或镜像仓库不可达
CrashLoopBackOff 容器启动后反复崩溃重启
ErrImagePull 镜像拉取失败(通常为镜像路径或标签错误)
OOMKilled 容器因超出内存限制被系统 OOM Killer 终止

实验命令:

bash 复制代码
# 使用不存在的镜像模拟故障
kubectl run error --image lee:v1

# 查看 Pod 状态
kubectl get pods -o wide

# 使用 describe 查看 Pod 详细信息,重点检查 Events 区域
kubectl describe pods error

# 输出关键信息(Events 部分):
# Warning  Failed     Error response from daemon: failed to resolve reference "docker.io/library/lee:v1"
# Warning  Failed     Error: ImagePullBackOff

排查流程:

  1. kubectl get pods 查看 STATUS 列,初步判断故障类型
  2. kubectl describe pods <pod名> 查看 Pod 事件日志(Events 区域)
  3. kubectl logs <pod名> 查看容器应用日志
  4. 对于 CrashLoopBackOff,可尝试 kubectl logs <pod名> --previous 查看上一次崩溃的日志

1.4 kubectl 核心命令

kubectl 是 Kubernetes 的命令行管理工具,通过 RESTful API 与 API Server 交互,实现对集群资源的增删改查操作。

1.4.1 create ------ 创建资源
bash 复制代码
# 使用 create 命令创建 Deployment,指定副本数和容器镜像
kubectl create deployment webcluster --replicas 2 --image myapp:v1

# 查看已创建的 Deployment
kubectl get deployments.apps
# 输出:
# NAME         READY   UP-TO-DATE   AVAILABLE   AGE
# webcluster   2/2     2            2           15s

# 查看自动创建的 Pod
kubectl get pods
# 输出:
# NAME                          READY   STATUS    RESTARTS   AGE
# webcluster-77c87d9946-28thm   1/1     Running   0          24s
# webcluster-77c87d9946-vwrsq   1/1     Running   0          24s

# 删除 Deployment(级联删除所有关联的 Pod)
kubectl delete deployments.apps webcluster
1.4.2 edit ------ 在线编辑资源
bash 复制代码
# 创建 Deployment
kubectl create deployment webcluster --image myapp:v1

# 使用 edit 打开默认编辑器,直接修改副本数
kubectl edit deployments.apps webcluster
# 在编辑器中将 replicas: 1 修改为 replicas: 2,保存退出
# Kubernetes 将自动创建新的 Pod 以匹配期望状态

# 验证副本数已更新
kubectl get pods
# 输出:
# NAME                          READY   STATUS    RESTARTS   AGE
# webcluster-77c87d9946-2cgr7   1/1     Running   0          36s
# webcluster-77c87d9946-2wqn7   1/1     Running   0          103s
1.4.3 patch ------ 局部更新资源
bash 复制代码
# 使用 JSON 策略仅更新副本数,无需打开完整 YAML
kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'

# 验证多余 Pod 已被删除
kubectl get pods
1.4.4 expose ------ 暴露为 Service
bash 复制代码
# 将 Deployment 暴露为 ClusterIP 类型的 Service
kubectl expose deployment webcluster --port 80 --target-port 80

# 查看 Service 信息
kubectl get service
# 输出:
# NAME         TYPE        CLUSTER-IP     PORT(S)   AGE
# webcluster   ClusterIP   10.97.61.108   80/TCP    18s

# 查看 Service 的后端端点(Endpoints)
kubectl describe svc webcluster

# 通过 Service IP 访问,验证负载均衡效果
curl 10.97.61.108/hostname.html
# 输出会轮转:
# webcluster-77c87d9946-gh9v7
# webcluster-77c87d9946-m69wl
# webcluster-77c87d9946-4p4mz
1.4.5 logs ------ 查看容器日志
bash 复制代码
# 查看指定 Pod 的应用日志
kubectl logs pods/webcluster-77c87d9946-gh9v7
# 输出:
# 10.244.0.0 - - [20/Aug/2026:08:43:52 +0000] "GET /hostname.html HTTP/1.1" 200 28
1.4.6 attach ------ 进入容器
bash 复制代码
# 先准备 busybox 镜像
docker load -i busybox-latest.tar.gz
docker tag busybox:latest reg.timinglee.org/library/busybox:latest

# 创建交互式 Pod
kubectl run -it testpod --image busybox:latest

# 在另一个终端 attach 到运行中的 Pod
kubectl attach pods/testpod -it

# 退出交互式会话:按 Ctrl+P 然后 Ctrl+Q(注意:Ctrl+C 会终止容器)

1.5 标签与选择器

概念说明:

  • 标签(Label):Kubernetes 中用于标识资源属性的键值对(Key-Value),附加在 Pod 等资源的 metadata.labels 字段中。标签不要求唯一,一个 Pod 可拥有多个标签,常用于资源分组、筛选和路由。
  • 选择器(Selector):Service 和控制器通过标签选择器(Label Selector)匹配目标 Pod。选择器定义了"哪些 Pod 属于该 Service 或该控制器"的归属关系。

关键约束:Service 仅将流量转发至标签与选择器匹配的 Pod。

实验演示:

bash 复制代码
# 创建 ClusterIP Service,选择器要求 app=webserver
kubectl create service clusterip --tcp 80:80 testservice --dry-run=client -o yaml > testservice.yaml

# 创建 Pod,但标签为 run=webserver(注意:与 Service 选择器不匹配)
kubectl run webserver --image myapp:v1 --dry-run=client -o yaml > webserver.yml

# 此时 Service 的 Endpoints 为空,因为标签未匹配
# Service 描述中:Endpoints: <none>

# 为 Pod 添加与选择器匹配的标签
kubectl label pods webserver app=webserver

# Service 自动发现匹配的 Pod,Endpoints 更新
# Service 描述中:Endpoints: 10.244.2.7:80

# 验证流量可达
curl 10.100.62.227
# 输出:Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

YAML 中的标签与选择器:

yaml 复制代码
# Service 的 selector 定义流量匹配规则
apiVersion: v1
kind: Service
metadata:
  name: testservice
spec:
  selector:
    app: webserver    # 仅匹配带有 app=webserver 标签的 Pod
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP

---
# Pod 的 labels 定义其自身属性
apiVersion: v1
kind: Pod
metadata:
  name: webserver
  labels:
    app: webserver    # 必须与 Service 的 selector 匹配
spec:
  containers:
  - image: myapp:v1
    name: webserver

第二部分:知识点速查总结

Pod 管理命令速查表

操作 命令
查看 Pod kubectl get pods -o wide
创建 Pod kubectl run <name> --image <image>
删除 Pod kubectl delete pods <name>
查看详情 kubectl describe pods <name>
查看日志 kubectl logs <pod名>
进入容器 kubectl attach pods/<name> -it
批量创建 kubectl apply -f xxx.yml
在线编辑 kubectl edit deployments.apps <name>
局部更新 kubectl patch deployments.apps <name> -p '...'
暴露服务 kubectl expose deployment <name> --port 80
相关推荐
2601_9622184726 分钟前
万象生鲜系统区块链溯源技术帮助生鲜企业搭建食品安全数字化体系
大数据·运维·微服务·云原生·架构
Orange_sparkle3 小时前
从 Docker 到 Doris:建立后端基础设施全景图
运维·docker·ai·容器·claude code
gx23484 小时前
控制器管理
docker·容器·kubernetes
Henry-SAP5 小时前
SAP独立需求与相关需求的区别解析
人工智能·云原生·sap·erp
白清羽6 小时前
7.3系统安装docker
运维·docker·容器
GGG7667 小时前
Python 运维自动化:psutil+IPy 系统与网络信息采集深度实战
运维·python·云原生·pip
dazhong20127 小时前
Docker 入门篇(八)-- CentOS7 安装 MySQL 8
mysql·docker·容器
w200512248 小时前
Pod管理
linux·服务器·云原生·容器·k8s·podman
sryyd_0210 小时前
Kubernetes Pod 管理从入门到实战:命令、YAML 与生命周期全解析
云原生·容器·kubernetes