Kubernetes(K8s)是容器编排的事实标准,理解Pod和Deployment是入门的第一步。
K8s架构概述
K8s集群由两类节点组成:
Control Plane (Master):
- API Server:集群的入口,所有操作通过它
- etcd:分布式KV存储,保存集群状态
- Scheduler:决定Pod调度到哪个节点
- Controller Manager:运行各种控制器(Deployment、ReplicaSet等)
Worker Node:
- kubelet:管理节点上的Pod生命周期
- kube-proxy:维护网络规则,实现Service的负载均衡
- Container Runtime:运行容器(containerd、CRI-O等)
Pod
Pod是K8s中最小的调度单元,它包装了一个或多个容器。同一Pod内的容器共享网络命名空间和存储卷。
一个简单的Pod定义:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
直接创建Pod的场景很少——通常由Deployment来管理。
Deployment
Deployment管理一组相同的Pod副本,提供声明式更新、滚动升级和回滚能力。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 15
periodSeconds: 20
关键字段说明:
replicas: 3:维持3个Pod副本selector.matchLabels:通过标签选择管理的Podstrategy:更新策略。RollingUpdate表示滚动升级,maxSurge=1表示升级时最多多创建1个Pod,maxUnavailable=0表示不允许有不可用的Podtemplate:Pod模板,Deployment根据它创建PodreadinessProbe:就绪探针,通过后Pod才接收流量livenessProbe:存活探针,失败后kubelet重启容器
Deployment与ReplicaSet的关系
Deployment不直接管理Pod,而是通过ReplicaSet:
Deployment
└── ReplicaSet (当前版本)
├── Pod-1
├── Pod-2
└── Pod-3
每次更新Deployment的Pod模板时,会创建一个新的ReplicaSet,逐步扩容新RS、缩容旧RS,实现滚动更新。旧的ReplicaSet默认保留10个(revisionHistoryLimit),用于回滚。
kubectl常用命令
# 创建/更新资源
kubectl apply -f deployment.yaml
# 查看Deployment状态
kubectl get deployments
kubectl describe deployment nginx-deployment
# 查看Pod
kubectl get pods -l app=nginx
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl logs <pod-name> -f # 实时日志
# 进入Pod
kubectl exec -it <pod-name> -- /bin/bash
# 扩缩容
kubectl scale deployment nginx-deployment --replicas=5
# 更新镜像(触发滚动更新)
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
# 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment
# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment
# 回滚到指定版本
kubectl rollout history deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=2
# 删除资源
kubectl delete -f deployment.yaml
小结
Pod是最小调度单元但不要直接管理它,用Deployment来声明期望状态,K8s会帮你维持。下一步可以学习Service(暴露服务)和Ingress(HTTP路由)。