K8s-pod控制器

发布于:2025-08-10 ⋅ 阅读:(32) ⋅ 点赞:(0)

一、常见的 Pod 控制器类型

控制器 主要功能 典型使用场景
ReplicationController (RC) 早期的副本控制器,保证固定数量 Pod 运行,现在基本被 ReplicaSet 替代 老版本 K8s 兼容
ReplicaSet (RS) 保证固定数量的 Pod 副本运行,支持标签选择器 Deployment 的底层实现
Deployment 管理 ReplicaSet,支持滚动更新、回滚 绝大多数无状态服务
StatefulSet 管理有状态应用,Pod 有固定名称和稳定存储 MySQL、Zookeeper、Kafka
DaemonSet 确保每个(或特定)节点都运行一个 Pod 日志收集、监控代理
Job 一次性任务,执行完成后退出 数据导入、批处理
CronJob 定时任务 定时备份、定期数据清理

1、ReplicaSet控制器

ReplicaSet 会不断执行 控制循环

  1. 检查当前标签选择器匹配的 Pod 数量

  2. 和 YAML 中 replicas 的期望值比对

  3. 少了就创建新的 Pod(用 template 模板)

  4. 多了就删除多余的 Pod

#查看定义 Replicaset 资源
[root@k8s1 ~]# kubectl explain rs

1.1、使用案例

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx          ##这里的标签要和下面的一样
  template:
    metadata:
      labels:
        app: nginx       ##和上面一样,否则创建不起来
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - 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: 3
  revisionHistoryLimit: 5       # 保留多少个历史版本,默认是 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate          # 滚动更新
    rollingUpdate:
      maxUnavailable: 1          # 更新时最多不可用的 Pod 数
      maxSurge: 1                 # 更新时最多多出来的 Pod 数
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - 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-deploy
  namespace: production         # 生产环境命名空间
  labels:
    app: nginx
spec:
  replicas: 4                   # 生产常用 >= 3 保证高可用
  revisionHistoryLimit: 5       # 保留5个历史版本,便于回滚
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate         # 滚动更新策略
    rollingUpdate:
      maxUnavailable: 1         # 更新时最多 1 个不可用
      maxSurge: 1                # 更新时最多多出来 1 个 Pod
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.4      # 企业会固定小版本,避免镜像漂移
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:               # 资源限制
          requests:
            cpu: "200m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
        env:                      # 环境变量(可从 ConfigMap/Secret 注入)
        - name: NGINX_ENV
          valueFrom:
            configMapKeyRef:
              name: nginx-config
              key: env
        volumeMounts:             # 日志/配置挂载
        - name: nginx-config-vol
          mountPath: /etc/nginx/conf.d
        - name: nginx-logs
          mountPath: /var/log/nginx
        livenessProbe:            # 存活探针(Pod 崩溃自动重启)
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 15
          failureThreshold: 3
        readinessProbe:           # 就绪探针(就绪才接流量)
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
          failureThreshold: 3
      volumes:                    # 关联 ConfigMap、日志
      - name: nginx-config-vol
        configMap:
          name: nginx-config
      - name: nginx-logs
        emptyDir: {}              # 企业一般会挂到持久卷
      restartPolicy: Always
      imagePullSecrets:           # 如果镜像仓库需要认证
      - name: regcred

ConfigMap(nginx-config)

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: 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

####待补充


网站公告

今日签到

点亮在社区的每一天
去签到