K8s-pod控制器
一、常见的 Pod 控制器类型
控制器 主要功能 典型使用场景 ReplicationController (RC) 早期的副本控制器,保证固定数量 Pod 运行,现在基本被 ReplicaSet 替代 老版本 K8s 兼容 ReplicaSet (RS) 保证固定数量的 Pod 副本运行,支持标签选择器 Deployment 的底层实现 Deployment 管理 ReplicaSet,支持滚动更新、回滚 绝大多数无状态服务 StatefulSet 管理有状态应用,Pod 有固定名称和稳定存储 MySQL、Zookeeper、Kafka DaemonSet 确保每个(或特定)节点都运行一个 Pod 日志收集、监控代理 Job 一次性任务,执行完成后退出 数据导入、批处理 CronJob 定时任务 定时备份、定期数据清理
1、ReplicaSet控制器
ReplicaSet 会不断执行 控制循环:
检查当前标签选择器匹配的 Pod 数量
和 YAML 中
replicas
的期望值比对少了就创建新的 Pod(用
template
模板)多了就删除多余的 Pod
#查看定义 Replicaset 资源 [root@k8s1 ~]# kubectl explain rs
1.1、使用案例
apiVersion: apps/v1 kind: ReplicaSet metadata:name: nginx-rs spec:replicas: 3selector:matchLabels:app: nginx ##这里的标签要和下面的一样template:metadata:labels:app: nginx ##和上面一样,否则创建不起来spec:containers:- name: nginximage: nginx:1.25ports:- containerPort: 80
kubectl apply -f nginx-rs.yaml kubectl get rs kubectl get pods -l app=nginx
replicas:期望副本数
selector:标签选择器,决定 RS 管哪些 Pod
template:Pod 模板,创建 Pod 时用它的定义
缺点:
没有版本控制(更新 Pod 镜像时会直接删老 Pod、建新 Pod,没有滚动更新)
无法回滚
无法直接声明更新策略(RollingUpdate、Recreate 等)
不会单独用 ReplicaSet 管 Pod
一般是 Deployment → ReplicaSet → Pod
Deployment 会自动生成和管理 ReplicaSet,帮你滚动更新、回滚
2、Deployment控制器
Deployment 负责管理 ReplicaSet,而 ReplicaSet 再管理 Pod。
它的作用不仅是维持副本数,还能:
滚动更新(Rolling Update)
回滚版本(Rollback)
暂停/继续更新
自动扩缩容(结合 HPA)
2.1、使用案例
apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploy spec:replicas: 3revisionHistoryLimit: 5 # 保留多少个历史版本,默认是 10selector:matchLabels:app: nginxstrategy:type: RollingUpdate # 滚动更新rollingUpdate:maxUnavailable: 1 # 更新时最多不可用的 Pod 数maxSurge: 1 # 更新时最多多出来的 Pod 数template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.25ports:- containerPort: 80
kubectl apply -f nginx-deploy.yaml kubectl get deploy kubectl get rs kubectl get pods -l app=nginx
2.2、常用命令
查看 Deployment 状态
kubectl describe deploy nginx-deploy
更新镜像(会触发滚动更新)kubectl set image deploy/nginx-deploy nginx=nginx:1.26
回滚到上一个版本kubectl rollout undo deploy/nginx-deploy
回滚到指定版本kubectl rollout undo deploy/nginx-deploy --to-revision=2
查看更新历史kubectl rollout history deploy/nginx-deploy
暂停/继续更新kubectl rollout pause deploy/nginx-deploy
kubectl rollout resume deploy/nginx-deploy
3.3企业级 Nginx Deployment 示例
apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploynamespace: production # 生产环境命名空间labels:app: nginx spec:replicas: 4 # 生产常用 >= 3 保证高可用revisionHistoryLimit: 5 # 保留5个历史版本,便于回滚selector:matchLabels:app: nginxstrategy:type: RollingUpdate # 滚动更新策略rollingUpdate:maxUnavailable: 1 # 更新时最多 1 个不可用maxSurge: 1 # 更新时最多多出来 1 个 Podtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.25.4 # 企业会固定小版本,避免镜像漂移imagePullPolicy: IfNotPresentports:- containerPort: 80resources: # 资源限制requests:cpu: "200m"memory: "256Mi"limits:cpu: "500m"memory: "512Mi"env: # 环境变量(可从 ConfigMap/Secret 注入)- name: NGINX_ENVvalueFrom:configMapKeyRef:name: nginx-configkey: envvolumeMounts: # 日志/配置挂载- name: nginx-config-volmountPath: /etc/nginx/conf.d- name: nginx-logsmountPath: /var/log/nginxlivenessProbe: # 存活探针(Pod 崩溃自动重启)httpGet:path: /port: 80initialDelaySeconds: 10periodSeconds: 15failureThreshold: 3readinessProbe: # 就绪探针(就绪才接流量)httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 10failureThreshold: 3volumes: # 关联 ConfigMap、日志- name: nginx-config-volconfigMap:name: nginx-config- name: nginx-logsemptyDir: {} # 企业一般会挂到持久卷restartPolicy: AlwaysimagePullSecrets: # 如果镜像仓库需要认证- name: regcred
ConfigMap(nginx-config)
apiVersion: v1 kind: ConfigMap metadata:name: nginx-confignamespace: production data:env: "production"default.conf: |server {listen 80;server_name _;location / {root /usr/share/nginx/html;index index.html;}access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;}
# 创建命名空间 kubectl create namespace production# 应用 ConfigMap kubectl apply -f nginx-config.yaml# 部署 Deployment kubectl apply -f nginx-deploy.yaml# 查看部署状态 kubectl get deploy -n production kubectl rollout status deploy/nginx-deploy -n production
####待补充