一、常见的 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: 3 selector: matchLabels: app: nginx ##这里的标签要和下面的一样 template: metadata: labels: app: nginx ##和上面一样,否则创建不起来 spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80kubectl 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: 80kubectl 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: regcredConfigMap(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
###有待补充。。。。。

801

被折叠的 条评论
为什么被折叠?



