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 会不断执行 控制循环

  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

3、Daemonset控制器

DaemonSet 控制器是 Kubernetes 里专门用来确保集群中每个(或特定)节点上都运行一个副本 Pod的控制器。
它的典型用途是部署节点级后台服务,比如监控、日志收集、网络代理等。

kubectl explain ds

1、DaemonSet YAML 示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  labels:
    app: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter:latest
        ports:
        - containerPort: 9100
      tolerations:                 # 容忍污点(可选,让 Pod 能调度到 master 节点)
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
参数说明
selector匹配 Pod 标签,确定哪些 Pod 属于这个 DaemonSet
template定义 Pod 模板(容器镜像、端口、卷等)
nodeSelector / nodeAffinity控制 Pod 只在特定节点上运行
tolerations容忍节点的污点
updateStrategy更新策略(默认 RollingUpdate,可以配置 maxUnavailable)
apiVersion: apps/v1                  # 使用 apps/v1 API 版本
kind: DaemonSet                      # 资源类型为 DaemonSet
metadata: 
  labels:                            # 给 DaemonSet 本身加标签
    k8s-app: fluentd-logging         # 标签键值对(用于管理和选择)
  name: fluentd-elasticsearch        # DaemonSet 名称
  namespace: kube-system             # 部署到 kube-system 命名空间
spec:
  selector:                          # 匹配 DaemonSet 管理的 Pod
    matchLabels:
     name: fluentd-elasticsearch     # 需要和 template.metadata.labels 对应
  template:                          # Pod 模板(DaemonSet 会用它生成 Pod)
    metadata:
     name: fluentd                   # Pod 名称前缀
     labels:                         # 基于此模板定义的 Pod 具有的标签
       name: fluentd-elasticsearch
    spec:
     tolerations:                    # 定义容忍度
     - key: node-role.kubernetes.io/master
       effect: NoSchedule            # 允许调度到 master 节点(默认 master 节点有 NoSchedule 污点)
     containers:                      # 容器定义
     - name: fluentd-elasticsearch   # 容器名称
       image: fluentd:v2.5.1         # 使用的镜像
       resources:                    # 资源限制
         limits: 
           memory: 500Mi              # 最大可用内存 500Mi
         requests: 
           cpu: 100m                  # 最小保证 0.1 核 CPU
           memory: 200Mi              # 最小保证 200Mi 内存
       volumeMounts:                  # 挂载宿主机目录到容器
       - name: varlog
         mountPath: /var/log          # 系统日志目录
       - name: varlibdockercontainers
         mountPath: /var/lib/docker/containers  # Docker 容器日志目录
         readOnly: true               # 只读挂载
     terminationGracePeriodSeconds: 30 # Pod 删除前的优雅退出时间(秒)
     volumes:                         # 定义挂载卷
     - name: varlog
       hostPath:                      # 使用宿主机目录作为数据卷
          path: /var/log
     - name: varlibdockercontainers
       hostPath:
          path: /var/lib/docker/containers

###有待补充。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值