开始第一个Pod与Deployment
假设你是一名指挥官,Pod 就像你的单兵战士,而 Deployment 则是管理整支军队的智能系统。
单个士兵(Pod)可以完成任务,但无法应对大规模战争——比如士兵受伤如何替补?如何快速扩充兵力?
通过本文,我们将学会如何用 Kubernetes 的 Pod 和 Deployment 管理容器化应用,实现自动化部署与自愈。
一、Pod:最小的作战单元
1.1 什么是Pod?
- Pod 是 Kubernetes 的最小调度单位,pod 翻译是"豆荚",功能也像一个豆荚一样,封装 1个或多个容器。
- 同一个 Pod 中的容器共享网络和存储,适合紧密协作的场景。
1.2 创建第一个Pod
步骤1:编写YAML文件
创建一个名为 nginx-pod.yaml
的文件:
apiVersion: v1
kind: Pod # 资源类型为Pod
metadata:
name: my-nginx-pod # Pod名称
labels:
app: nginx # 标签(用于后续选择)
spec:
containers:
- name: nginx-container # 容器名称
image: nginx:latest # 使用的镜像
ports:
- containerPort: 80 # 容器暴露的端口
步骤2:启动Pod
kubectl apply -f nginx-pod.yaml
步骤3:验证状态
kubectl get pods
输出示例:
NAME READY STATUS RESTARTS AGE
my-nginx-pod 1/1 Running 0 10s
1.3 与Pod互动
查看Pod日志
kubectl logs my-nginx-pod
进入Pod内部(调试用)
kubectl exec -it my-nginx-pod -- /bin/bash
# 在容器内执行命令(如:curl localhost)
删除Pod
kubectl delete pod my-nginx-pod
二、Deployment:管理Pod的智能军团
2.1 为什么需要Deployment?
直接管理Pod的问题:
- 手动扩缩容:需要逐个创建/删除Pod。
- 无法自愈:Pod崩溃后不会自动重启。
- 更新麻烦:需手动替换旧版本Pod,易出错。
Deployment 的价值:
- 自动维护Pod副本数(如保持3个运行实例)。
- 支持滚动更新与回滚。
- 提供声明式配置(描述“期望状态”)。
2.2 创建第一个Deployment
步骤1:编写YAML文件
创建 nginx-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment # 资源类型为Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 维持3个Pod副本
selector:
matchLabels:
app: nginx
template: # Pod模板(类似1.2中的Pod配置)
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:1.25 # 指定镜像版本
ports:
- containerPort: 80
步骤2:启动Deployment
kubectl apply -f nginx-deployment.yaml
步骤3:查看Deployment与Pod状态
kubectl get deployments
kubectl get pods
输出示例:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 15s
NAME READY STATUS RESTARTS AGE
nginx-deployment-5d559c4788-2j6wk 1/1 Running 0 20s
nginx-deployment-5d559c4788-kx9qm 1/1 Running 0 20s
nginx-deployment-5d559c4788-wl7pv 1/1 Running 0 20s
2.3 实现滚动更新
更新镜像版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
或修改YAML文件的 image
字段后重新应用:
kubectl apply -f nginx-deployment.yaml
观察更新过程
kubectl rollout status deployment/nginx-deployment
输出示例:
Waiting for rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
2.4 回滚到旧版本
如果新版本有问题,快速回滚:
kubectl rollout undo deployment/nginx-deployment
查看历史版本
kubectl rollout history deployment/nginx-deployment
三、常见问题与解决
-
Pod一直处于Pending状态
- 原因:资源不足(如CPU/内存不够)或节点调度失败。
- 检查命令:
kubectl describe pod <pod-name>
-
Pod崩溃重启(CrashLoopBackOff)
- 原因:容器启动失败(如应用崩溃、配置错误)。
- 查看日志:
kubectl logs <pod-name>
-
Deployment无法更新
- 检查镜像名称是否正确,或是否存在网络拉取问题。
四、动手实验
-
扩展副本数
kubectl scale deployment nginx-deployment --replicas=5 kubectl get pods
-
模拟Pod故障
手动删除一个Pod,观察Deployment是否自动重建:kubectl delete pod <pod-name> kubectl get pods -w # 实时观察状态变化
五、总结与下一步
通过本文,我们学会了:
- 用Pod运行单个容器化应用。
- 用Deployment管理多副本应用,实现滚动更新与自愈。
资源推荐
- Kubernetes Pod官方文档
- Deployment滚动更新策略
人只要有一种向上的精神,朝着自己的目标一步步努力,成功的机会就会越来越大。