是你想要的K8S--五种控制器类型解析(Deployment 、StatefulSet 、DaemonSet 、Job 、CronJob)

本文详细介绍了Kubernetes中的一些核心控制器,包括Deployment用于无状态应用的管理,具备滚动更新、回滚等特性;StatefulSet适用于有状态服务,保证Pod的顺序和持久存储;DaemonSet确保每个Node上运行一个Pod;Job和CronJob则用于一次性或周期性任务的执行。此外,还涉及了Pod、Service、Endpoint和DNS解析等内容。

一、 控制器

控制器:又称之为工作负载,分别包含以下类型控制器

  1. Deployment,适合无状态的服务部署
  2. StatefulSet,适合有状态的服务部署
  3. DaemonSet,一次部署,所有的node节点都会部署,包括新加入的node节点,同样会被部署。适用于集群、日志、监控。
  4. Job,一次性执行任务,执行完任务容器关闭。
  5. CronJob,周期性执行任务。

1.1 Pod与控制器之间的关系

kubernetes内部会有很多的控制器,这些控制器相当于一个状态机,用来控制Pod的具体状态和行为。
controllers:在集群上管理和运行容器的对象通过label-selector相关联
Pod通过控制器实现应用的运维,如伸缩,升级等
在这里插入图片描述

1.2 Deployment

特点:

  • 部署无状态应用
  • 管理Pod和ReplicaSet
  • 具有上线部署、副本设定、滚动升级、回滚等功能
  • 提供声明式更新,例如只更新一个新的Image

应用场景:web服务

测试

[root@master test]# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80
[root@master test]# kubectl create -f nginx-deployment.yaml    ##创建pod
deployment.apps/nginx-deployment created 
[root@master test]# kubectl get pods,deploy,rs     ##查看创建的pod、deployment、replicasets资源
NAME                                  READY   STATUS      RESTARTS   AGE
pod/foo                               0/1     Completed   0          22h
pod/frontend                          2/2     Running     0          23h
pod/liveness-exec                     1/1     Running     70         12h
pod/nginx-deployment-d55b94fd-2s2zf   1/1     Running     0          26m
pod/nginx-deployment-d55b94fd-bpn9w   1/1     Running     0          26m
pod/nginx-deployment-d55b94fd-qlvtz   1/1     Running     0          26m

NAME                                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/nginx-deployment   3         3         3            3           26m

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.extensions/nginx-deployment-d55b94fd   3         3         3       26m

查看控制器,并可以对控制器的参数进行修改

kubectl edit deployment/nginx-deployment

查看Deployment历史版本

[root@master test]# kubectl rollout history deployment/nginx-deployment
deployment.extensions/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>

1.2 SatefulSet

官方文档

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

特点

  • 部署有状态应用
  • 解决Pod独立生命周期,保持Pod启动顺序和唯一性
  • 稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)
  • 有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)
  • 有序,滚动更新

应用场景:数据库

常规service和无头服务区别

service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
Headless service:就是无头服务,不需要cluster-IP,ClusterIP设置为none,直接绑定具体的Pod的IP。

测试

官方文档讲解

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi

名为 nginx 的 Headless Service 用来控制网络域名。
名为 web 的 StatefulSet 有一个 Spec,它表明将在独立的 3 个 Pod 副本中启动 nginx 容器。
volume ClaimTemplates 将通过 Persistent Volumes 驱动提供的 Persistent Volumes 来提供稳定的存储。

[root@master test]# vim nginx-headless.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-headless
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
[root@master test]# kubectl create -f nginx-headless.yaml 
service/nginx-headless 
### **Kubernetes 控制器(Controller)详解** #### **1. 什么是 Kubernetes 控制器?** 控制器(Controller)是 Kubernetes 的核心组件,用于**管理 Pod 的生命周期**,确保集群的当前状态(Actual State)与用户声明的期望状态(Desired State)一致。 --- ### **2. 常见的 Kubernetes 控制器** 以下是你提到的几种控制器及其作用: | **控制器** | **用途** | **适用场景** | |----------------|-------------------------------------------------------------------------|--------------------------------| | **Deployment** | 管理无状态应用的 Pod,支持滚动更新、回滚 | Web 服务、API 服务(如 Nginx) | | **StatefulSet** | 管理有状态应用的 Pod,提供稳定的网络标识、持久化存储和有序部署/伸缩 | 数据库(MySQL、MongoDB)、消息队列(Kafka) | | **ConfigMap** | ❌ **不是控制器**,而是存储配置数据的资源对象,供 Pod 挂载使用 | 环境变量、配置文件 | --- ### **3. 其他重要的 Kubernetes 控制器** 除了上述资源,Kubernetes 还提供了多种控制器: | **控制器** | **用途** | **适用场景** | |---------------------|-------------------------------------------------------------------------|--------------------------------| | **DaemonSet** | 确保每个 Node 上运行一个指定的 Pod(如日志采集 Agent) | Fluentd(日志收集)、Node Exporter(监控) | | **ReplicaSet** | 确保指定数量的 Pod 副本运行(Deployment 底层使用它) | 通常不直接使用,由 Deployment 管理 | | **Job** | 创建一次性任务,任务完成后 Pod 自动退出 | 批处理任务(如数据迁移) | | **CronJob** | 定时运行的 Job(类似 Linux Cron) | 定时备份、定期清理数据 | | **Horizontal Pod Autoscaler (HPA)** | 根据 CPU/内存等指标自动扩缩 Pod 数量 | 应对流量高峰(如电商大促) | | **EndpointSlice** | 管理 Service 的后端 Endpoint(现代替代方案,比传统 Endpoints 更高效) | 大规模微服务集群 | --- ### **4. 控制器的工作原理** 所有控制器的核心逻辑: 1. **监听集群状态**(通过 Kubernetes API Server)。 2. **比较当前状态与期望状态**(如 `replicas: 3` 但实际只有 2 个 Pod)。 3. **执行调谐(Reconcile)**:创建/删除 Pod 或其他资源,使状态一致。 --- ### **5. 示例:控制器关系图** ``` 用户定义 Deployment(期望 3 个 Nginx Pod) ↓ Deployment 创建 ReplicaSet ↓ ReplicaSet 创建 3 个 Pod ↓ Node 故障导致 1 个 Pod 消失 → ReplicaSet 检测并重新创建 1 个 Pod ``` --- ### **6. 总结** - ✅ **DeploymentStatefulSetDaemonSetJob/CronJob 都是控制器**,用于管理 Pod。 - ❌ **ConfigMap 不是控制器**,只是配置存储。 - **其他控制器**(如 HPA、ReplicaSet)在特定场景下发挥作用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值