Kubernetes Pod 管理
Kubernetes Pod 管理
0. 资源管理模型
Kubernetes 将所有基础设施抽象为资源对象。集群管理的本质是操作这些资源。
|
概念 |
说明 |
|---|---|
|
最小管理单元 |
Pod(不是容器) |
|
Pod 管理方式 |
一般通过 Pod 控制器(Deployment / StatefulSet 等)间接管理 |
|
服务访问 |
Service 资源 |
|
数据持久化 |
Volume / PV / PVC |
三种资源管理方式对比
|
方式 |
命令示例 |
特点 |
|---|---|---|
|
命令式对象管理 |
|
直接用命令操作,快捷但不易追溯 |
|
命令式对象配置 |
|
命令+配置文件,可重复执行 |
|
声明式对象配置 |
|
声明期望状态,支持自动 diff 和增量更新 |
kubectl 命令语法
kubectl [command] [type] [name] [flags]
|
字段 |
含义 |
示例 |
|---|---|---|
|
command |
对资源执行的操作 |
get、create、delete、describe |
|
type |
资源类型 |
pod、deployment、service |
|
name |
资源名称(大小写敏感) |
web1、testpod |
|
flags |
额外可选参数 |
-o yaml、-n default |
常用操作:
kubectl get pod # 查看所有 pod
kubectl get pod pod_name # 查看指定 pod
kubectl get pod pod_name -o yaml # 以 yaml 格式展示结果
kubectl api-resources # 列出集群支持的所有资源类型
1. Namespace 管理
kubectl get namespaces
kubectl create namespace lin
kubectl delete namespace lin
2. Pod 基础操作
创建与查看
kubectl run lin --image nginx:latest
kubectl get pods -o wide
kubectl describe pod lin1
kubectl delete pod lin1
kubectl delete pods --all
集群信息
kubectl version
kubectl cluster-info
3. Deployment 控制器
创建 Deployment
kubectl create deployment web1 --replicas 2 --image myapp:v1
查看与编辑
kubectl get deployments.apps
kubectl edit deployments.apps web1
更新副本数(patch)
kubectl patch deployments.apps web1 -p '{"spec":{"replicas":1}}'
暴露服务
kubectl expose deployment web1 --port 80 --target-port 80
kubectl expose deployment web1 --port 80 --target-port 80 --type NodePort
kubectl describe svc web1
curl 10.101.114.159
查看日志
kubectl logs pods/web1-59647bb49-9kcx2
获取帮助
kubectl explain deployment
kubectl explain deployment.spec
4. 容器交互
attach 进入运行中的 Pod
kubectl run -it testpod --image busybox:latest
# Ctrl+PQ 退出但不终止容器
kubectl attach pods/testpod -it
exec 在容器内执行命令
kubectl run testpod1 --image nginx:latest
kubectl exec -it pods/testpod1 -c testpod1 -- /bin/bash
cp 文件复制
kubectl cp testpod1:/usr/share/nginx/html/index.html /mnt/test
echo lin > /mnt/test
kubectl cp /mnt/test testpod1:/usr/share/nginx/html/index.html
curl 10.244.1.7
5. 滚动发布与回滚
创建并查看发布状态
kubectl create deployment web1 --image myapp:v1 --replicas 2 \
--dry-run=client -o yaml > web1.yml
kubectl apply -f web1.yml
kubectl rollout status deployment web1
重启
kubectl rollout restart deployment web1
扩缩容
kubectl scale deployment web1 --replicas 4
kubectl scale deployment web1 --replicas 1
标签操作
kubectl get pods --show-labels
kubectl label pods web1-98bb59bf5-9txw5 app-
kubectl label pods web1-98bb59bf5-9txw5 app=web1
6. 自主式 Pod vs 控制器管理 Pod
自主式 Pod
kubectl run lin --image nginx:latest
|
维度 |
说明 |
|---|---|
|
优点 |
配置灵活,适合学习调试和一次性任务 |
|
缺点 |
无自动恢复、无滚动更新、无 HPA、管理成本高 |
控制器管理 Pod(Deployment)
kubectl create deployment web1 --image myapp:v1 --replicas 2 \
--dry-run=client -o yaml > web1.yml
kubectl apply -f web1.yml
|
能力 |
说明 |
|---|---|
|
自动故障恢复 |
Pod 删除后自动重建 |
|
健康检查 |
存活探针、就绪探针 |
|
滚动更新 |
逐步替换旧版本 |
|
回滚 |
一键回退到指定 revision |
|
HPA |
基于 CPU/内存自动扩缩容 |
|
服务发现 |
Service 自动关联 Pod |
版本更新与回滚
kubectl set image deployments web1 myapp=myapp:v2
kubectl annotate deployments.apps web1 \
kubernetes.io/change-cause="myapp:v2" --overwrite
kubectl rollout history deployment web1
kubectl rollout undo deployment web1 --to-revision 1
7. YAML 部署 Pod(完整字段说明)
apiVersion: v1
kind: Pod
metadata:
name: testpod
namespace: default
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:1.24
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
|
字段 |
含义 |
|---|---|
|
apiVersion |
K8s API 版本,Pod 固定为 v1 |
|
kind |
资源类型 |
|
metadata.name |
Pod 名称,同 namespace 唯一 |
|
metadata.namespace |
所属命名空间 |
|
spec.restartPolicy |
重启策略:Always / OnFailure / Never |
|
spec.containers[].name |
容器名称 |
|
spec.containers[].image |
容器镜像 |
|
imagePullPolicy |
IfNotPresent / Always / Never |
|
containerPort |
容器监听端口 |
|
resources.requests |
调度时请求的最小资源 |
|
resources.limits |
容器可使用的最大资源 |
8. 多容器 Pod
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: myapp:v1
name: testpod
- image: busyboxplus:latest
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
同一 Pod 内的容器共享 Network、IPC、UTC namespace。
验证:
kubectl apply -f tastpod.yaml
kubectl exec -it pods/testpod -c busybox -- /bin/sh
curl 127.0.0.1
9. hostPort 端口映射
spec:
containers:
- image: myapp:v1
name: testpod
ports:
- name: http
containerPort: 80
hostPort: 80
protocol: TCP
访问方式:curl <节点IP>:80
10. 环境变量注入
apiVersion: v1
kind: Pod
metadata:
labels:
run: mysql
name: mysql
spec:
containers:
- image: mysql:8.0
name: mysql8
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- image: phpmyadmin:latest
name: mysqladmin
env:
- name: PMA_ARBITRARY
value: "1"
ports:
- name: phpadminport
containerPort: 80
hostPort: 80
protocol: TCP
11. 节点选择器(nodeSelector)
spec:
nodeSelector:
kubernetes.io/hostname: node2
Pod 只会被调度到标签匹配的节点上。
12. 共享宿主机网络(hostNetwork)
spec:
hostNetwork: true
容器内 ifconfig 看到的是宿主机的网络接口。
13. 资源限制与 QoS 优先级
|
requests 与 limits 关系 |
QoS 等级 |
节点压力时行为 |
|---|---|---|
|
均未设置 |
BestEffort |
最先被驱逐 |
|
requests < limits |
Burstable |
中间优先级 |
|
requests = limits |
Guaranteed |
最后被驱逐 |
验证:
kubectl describe pods testpod | grep "QoS Class:"
14. 重启策略
|
restartPolicy |
行为 |
|---|---|
|
Always |
容器退出即重启(默认) |
|
OnFailure |
非零退出码才重启 |
|
Never |
不重启 |
示例(Always + sleep 30):
spec:
restartPolicy: Always
containers:
- image: busybox:latest
name: busybox
command: ["/bin/sh", "-c", "sleep 30"]
Pod 状态变化:Running → Completed → Running(RESTARTS 递增)。
15. Pod 生命周期:Init 容器
Init 容器在应用容器启动前按顺序运行,必须全部成功完成,应用容器才会启动。
apiVersion: v1
kind: Pod
metadata:
labels:
run: web1
name: web1
spec:
initContainers:
- name: busybox
image: busybox:latest
command:
- /bin/sh
- -c
- "until test -e /testfile; do echo waiting; sleep 2; done"
containers:
- image: myapp:v1
name: web1
restartPolicy: Always
在另一个终端创建 /testfile 后,Init 容器完成,应用容器启动。
16. 探针
探针类型
|
探针 |
作用 |
失败后果 |
|---|---|---|
|
livenessProbe |
检测容器是否存活 |
kubelet 杀容器并按重启策略处理 |
|
readinessProbe |
检测容器是否就绪 |
从 Service 的 Endpoints 中摘除 IP |
|
startupProbe |
检测应用是否已启动 |
启动期间禁用另两种探针;失败则重启 |
存活探针(TCP Socket)
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 1
timeoutSeconds: 1
就绪探针(HTTP GET)
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 2
timeoutSeconds: 1
删除 /usr/share/nginx/html/index.html 后,Pod IP 从 Endpoints 中移除,Service 不再转发流量到该 Pod。恢复文件后自动加回。
附录:常用命令速查表
|
场景 |
命令 |
|---|---|
|
查看所有资源类型 |
|
|
查看 Pod 详情 |
|
|
查看 Deployment 历史 |
|
|
回滚到指定版本 |
|
|
实时查看 Pod 状态 |
|
|
进入容器执行命令 |
|
|
从 Pod 拷文件到本地 |
|
|
从本地拷文件到 Pod |
|
|
查看资源 YAML 定义帮助 |
|
更多推荐
所有评论(0)