kubernetes controller 控制器

在Kubernetes中,Controller 是一种特殊的对象,它们负责运行和监控集群中一组Pods的状态,确保这些Pods的实际运行状态与预期状态保持一致。

1 controller分类

  1. Deployment
    • 部署无状态应用,Controller会自动维护Pod副本的生命周期和更新。
  1. StatefulSet
    • 用于管理有状态的应用,为每个Pod提供持久化存储和唯一网络标识。
  1. DaemonSet
    • 守护进程,确保在集群中的每个节点上运行一个Pod副本,通常用于运行日志收集、监控等系统服务。
  1. ReplicaSet(RS):
    • 确保Pod副本始终运行,通常由Deployment间接使用,但也可以独立使用。
  1. ReplicationController(Deprecated):
    • 早期的副本管理Controller,已被ReplicaSet和Deployment取代。
  1. CronJob
    • 基于时间表创建Jobs,用于定时执行任务
  1. Job
    • 负责运行一次性任务,直到任务成功完成或达到指定的重试次数。

2 Deployment介绍及应用

2.1 相关概念及其功能

2.1.1 ReplicaSet控制器功能

支持新的基于集合的selector(以前的rc里没有这种功能)

通过改变Pod副本数量实现Pod的扩容和缩容

2.1.2 Deployment控制器功能

Deployment集成了上线部署、滚动升级、创建副本、回滚等功能

Deployment里包含并使用了ReplicaSet

2.2 使用deployment控制器部署无状态应用

2.2.1 Deployment用于部署无状态应用

无状态应用的特点:

  • 所有pod无差别
  • 所有pod中容器运行同一个image
  • 所有pod可以运行在集群中任意node上
  • 所有pod无启动顺序先后之分
  • 随意pod数量扩容或缩容
  • 例如简单运行一个静态web程序
2.2.2 创建deployment类型应用
  1. 编写yaml文件
vim deployment-nginx.yaml
apiVersion: apps/v1 # 指定使用的Kubernetes API版本
kind: Deployment # 定义资源类型为Deployment
metadata:
  name: nginx-deployment # 定义Deployment的名称
  labels: # 定义标签,用于标识和选择Deployment
    app: nginx
spec:
  replicas: 3 # 定义期望运行的Pod副本数
  selector: # 定义如何选择Pod,通常与标签匹配
    matchLabels:
      app: nginx
  template: # Pod模板,定义了Pod的规格和运行的容器
    metadata:
      labels: # Pod的标签,需要与selector匹配
        app: nginx
    spec:
      containers: # 定义容器列表
      - name: nginx # 容器的名称
        image: nginx # 使用的Docker镜像名称和标签
        ports: # 定义容器的端口映射
        - containerPort: 80 # 容器内部监听的端口
        # 可以添加更多的配置,如资源限制、环境变量、存储卷等。
  1. 验证
kubectl apply -f deployment-nginx.yaml
kubectl get deploy
kubectl get pod
2.2.3 删除deployment中的pod

如果你手动删除了Pod,Deployment控制器会识别到Pod副本数的减少,并根据spec.replicas字段指定的数量,自动创建一个新的Pod来替换被删除的Pod。

  1. 使用kubectl delete pod命令直接删除Pod
  • 可以使用Pod的名称来指定要删除的Pod。
kubectl delete pod <pod-name>

这将删除指定的Pod,但Deployment控制器会根据其配置自动替换被删除的Pod。

2.2.4 删除deployment
kubectl delete deploy <deploy-name>
kubectl get deploy
kubectl get pod

2.3 pod版本升级

[root@master ~]# kubectl set image -h # 查看帮助
[root@master ~]# kubectl get pod 
[root@master ~]# kubectl describe pod <pod-name> | grep Image:
Image:          nginx:1.9.1
# 开始升级镜像版本
[root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record
[root@master ~]# kubectl describe pod <pod-name> | grep Image:
Image:          nginx:1.9.1

2.4 pod版本回退

  1. 监控更新状态 和 检查更新历史:
[root@master ~]# kubectl rollout status deployment nginx-deployment
[root@master ~]# kubectl rollout history deployment nginx-deployment
  1. 定义要回退的版本(还未正式执行)
[root@master ~]# kubectl rollout history deployment nginx-deployment --revision=1

3. 执行回退

[root@master ~]# kubectl rollout undo deployment nginx-deployment --to-revision=1
deployment.apps/nginx-deployment rolled back
  1. 验证
[root@easzlab ~]# kubectl rollout history deployment nginx-deployment

2.5 副本扩缩容

  1. 查看帮助文档
[root@master ~]# kubectl scale -h
  1. 查看当前副本数: 使用kubectl get deployment或kubectl get statefulset查看当前的副本数。
kubectl get deployment <deployment-name>
  1. 执行扩容操作: 使用kubectl scale命令来增加Pod的副本数。
kubectl scale deployment <deployment-name> --replicas=<new-replica-count>

其中<new-replica-count>是你希望设置的新副本数量。

  1. 执行缩容操作: 如果需要减少Pod的副本数,同样使用kubectl scale命令,但设置一个较小的副本数。
kubectl scale deployment <deployment-name> --replicas=<new-replica-count>
  1. 确认副本数更新: 使用kubectl get deployment再次查看Deployment,确认副本数已经更新。
kubectl get deployment <deployment-name>

2.6 滚动更新

多副本滚动更新是Kubernetes Deployment控制器的一个特性,它允许你逐步更新Pods到新版本,而不会一次性替换所有Pods。这种更新方式可以减少服务中断的风险,并确保服务的高可用性。操作与前面类似不过多赘述。

[root@master ~]# kubectl scale deployment nginx-deployment --replicas=16
[root@master ~]# kubectl get pod
[root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record
[root@master ~]# kubectl rollout status deployment nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 8 out of 16 new replicas have been updated...

3 Replicaset介绍及应用

ReplicaSet确保Pod副本始终运行,如果Pod由于某种原因失败,ReplicaSet会自动替换它。此外,Deployment资源通常会包含ReplicaSet,并且是推荐用于管理无状态应用的方式,因为Deployment可以提供声明式更新和更好的生命周期管理。ReplicaSet作为一种底层资源,通常由Deployment间接管理。

  1. 编写yaml文件
[root@master ~]# vim rs-nginx.yaml
apiVersion: apps/v1 # 使用的Kubernetes API版本
kind: ReplicaSet # 资源类型为ReplicaSet
metadata:
  name: rs-nginx # ReplicaSet的名称
  labels: # 定义标签,用于标识ReplicaSet
    app: nginx
spec:
  replicas: 3 # 期望运行的Pod副本数量
  selector: # 定义如何选取Pod,通常基于标签选择
    matchLabels:
      app: nginx
  template: # Pod模板,定义了Pod的规格和运行的容器
    metadata:
      labels: # Pod的标签,需要与selector匹配
        app: nginx
    spec:
      containers: # 定义容器列表
      - name: nginx # 容器名称
        image: nginx:1.19.0 # 使用的Docker镜像名称和标签
        ports: # 定义容器的端口映射
        - containerPort: 80 # 容器内部监听的端口80
[root@master ~]# kubectl apply -f rs-nginx.yaml

ReplicaSet只能扩缩容,不能做版本更新

4 StatefulSet介绍及应用

4.1 StatefulSet控制器作用

StatefulSet是Kubernetes中的一个控制器,用于管理有状态应用的生命周期。与Deployment控制器(用于管理无状态应用)不同,StatefulSet提供了一些特定的特性来满足有状态应用的需求。

  • 稳定的持久化标识符。
  • 有序的部署、扩展、更新和删除。
  • 持久化存储,确保数据在Pod重新调度后仍然可用。

4.2 无状态应用和有状态应用

4.2.1 无状态应用
  • 如nginx
  • 请求本身包含了响应端为响应这一请求所需的全部信息。每一个请求都像首次执行一样,不会依赖之前的数据进行响应。
  • 不需要持久化的数据。
  • 无状态应用的多个实例之间互不依赖,可以无序的部署、删除或伸缩。
4.2.2 有状态应用
  • 如mysql
  • 前后请求有关联与依赖
  • 需要持久化的数据
  • 有状态应用的多个实例之间有依赖,不能相互替换:无论怎么调度,每个Pod都有一个永久不变的ID。

4.3 StatefulSet的特点

  1. 顺序部署、扩展和删除
  • StatefulSet保证Pod副本按照顺序进行初始化、扩展和删除,每个Pod都有一个唯一的序号,从0开始递增。
  1. 稳定的网络标识
  • 每个Pod副本都有一个与Pod生命周期一致的、持久的DNS名称,这使得Pod可以被其他服务通过稳定的名称访问。
  1. 持久化存储
  • StatefulSet支持为每个Pod副本提供持久化存储。即使Pod被重新调度到其他节点,它的存储卷也会跟随Pod,保证数据的持久性。
  1. 有序的滚动更新
  • 当StatefulSet进行更新时,Pod副本会按顺序一个接一个地更新,而不是同时更新所有Pod,这有助于减少更新过程中的服务中断。
  1. 有状态服务的扩展和缩容
  • StatefulSet允许你指定Pod副本的数量,并根据需要进行扩展或缩容,同时保持每个Pod副本的顺序和唯一性。
  1. 自动恢复
  • 如果Pod副本失败,StatefulSet控制器会替换失败的Pod,并尝试恢复到期望的副本数量。
  1. 滚动重启
  • 可以触发StatefulSet中的所有Pod进行滚动重启,这在更新应用配置或需要刷新Pod状态时非常有用。
  1. 有序的终止
  • 当StatefulSet缩容时,Pod副本会按照相反的顺序(从最大序号到最小序号)进行终止,这有助于减少对有状态服务的影响。

4.4 StatefulSet案例

4.4.1 应用配置
[root@master ~]# vim ss-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  clusterIP: None  # Headless Service,不分配Cluster IP
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
spec:
  serviceName: "nginx-service"  # 指定Service名称
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-client"
      resources:
        requests:
          storage: 1Gi
[root@master ~]# kubectl apply -f ds-nginx.yaml
4.4.2 访问Service

由于Service定义为Headless(clusterIP: None),它不会为Pod分配一个Cluster IP。相反,它会返回与StatefulSet关联的Pod的DNS记录列表。这意味着你可以使用如下格式的DNS名称访问每个Pod:

<pod-name>.<service-name>.<namespace>.svc.cluster.local

例如,访问第一个Nginx Pod的URL将是:

curl http://nginx-statefulset-0.nginx-service.default.svc.cluster.local.
4.4.3 验证

使用以下命令检查StatefulSet和Service的状态:

kubectl get statefulset
kubectl get service
kubectl describe statefulset nginx-statefulset
kubectl describe service nginx-service
4.4.4 扩展和缩容

根据需要,可以扩展或缩容StatefulSet:

kubectl scale statefulset nginx-statefulset --replicas=5
4.4.5 有序滚动更新
  1. 触发滚动更新
kubectl set image statefulset/nginx nginx=nginx:1.19.1 --record

这条命令更新了Nginx镜像到指定版本,并记录了这次更新,允许我们回滚到这个版本。

  1. 观察滚动更新
kubectl rollout status statefulset/nginx
  1. 查看更新历史
kubectl rollout history statefulset/nginx
  1. 回滚更新(如果需要)

如果在更新过程中发现问题,可以使用kubectl rollout undo命令来回滚到之前的版本。

kubectl rollout undo statefulset/nginx
  1. 验证更新

更新完成后,使用kubectl get命令来验证所有Pod是否已经更新到新的版本。

kubectl get statefulset nginx
kubectl get pods -l app=nginx

5 DaemonSet介绍及应用

5.1 DaemonSet 介绍

  • DemonSet能够让所有(或者特定)的节点运行同一个pod。
  • 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除
  • 如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
  • 如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。
  • DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等。

5.2 DaemonSet 案例

[root@master ~]# vim ds-nginx.yaml
apiVersion: apps/v1 # 使用的Kubernetes API版本
kind: DaemonSet # 资源类型为DaemonSet
metadata:
  name: nginx-daemonset # DaemonSet的名称
spec:
  selector: # 定义如何选取Pod,通常基于标签选择
    matchLabels:
      app: nginx-daemon
  template: # Pod模板,定义了Pod的规格和运行的容器
    metadata:
      labels: # Pod的标签,需要与selector匹配
        app: nginx-daemon
    spec:
      containers: # 定义容器列表
      - name: nginx # 容器名称
        image: nginx # 使用的Docker镜像名称和标签
        ports: # 定义容器的端口映射
        - containerPort: 80 # 容器内部监听的端口80
        resources:   # 资源限制
          requests:
            memory: "64Mi"  # Pod启动的内存请求
            cpu: "250m"     # Pod启动的CPU请求
          limits:
            memory: "128Mi" # Pod可以使用的最大内存
            cpu: "500m"     # Pod可以使用的最大CPU
      tolerations: # 容忍度,允许Pod在具有相应污点的节点上运行
      - key: "node-role.kubernetes.io/master"
        effect: "NoSchedule" # 例如,这里禁止在master节点上运行
[root@master ~]# kubectl apply -f ds-nginx.yaml

demonset会在每一个节点中创建一个pod

6 Job介绍及应用

6.1 Job介绍

对于ReplicaSet而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。

对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。

pob负责批量处理短暂的一次性任务(shortlivedone-offtasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

6.2 Job案例

  1. 创建Job YAML配置

首先,创建一个名为job.yaml的YAML配置文件,定义一个Job资源,使用busybox镜像来执行一个简单的echo命令:

[root@master ~]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    metadata:
      name: example-job
    spec:
      containers:
      - name: busybox
        image: busybox:1.28
        command: ["echo", "Hello, Kubernetes Job!"]
      restartPolicy: Never
  backoffLimit: 3
[root@master ~]# kubectl apply -f job.yaml
  1. 查看Pod日志

如果需要查看执行任务的Pod的日志,可以使用以下命令:

kubectl logs -f <pod-name>
  1. 并行处理任务

如果你需要并行处理多个任务,可以设置spec.completions和spec.parallelism:

spec:
  completions: 5  # Job需要完成的工作总数
  parallelism: 2  # 同时运行的Pod数量

这将创建一个Job,它将并行执行任务,直到完成指定数量的任务。

7 CronJob介绍及应用

CronJob是Kubernetes中用于定时执行任务的控制器,类似于操作系统中的cron工具。

7.1 CronJob案例

  1. 创建CronJob YAML配置
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello-world-cronjob
spec:
  schedule: "0/5 * * * *"  # 每5分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: busybox
            image: busybox:1.28
            command: ["/bin/sh", "-c", "echo Hello, Kubernetes CronJob at $(date)"]
          restartPolicy: OnFailure
[root@master ~]# kubectl apply -f cronjob.yaml
  1. 查看CronJob的日志

由于CronJob每次执行都会创建一个新的Job,可以查看最近创建的Job的日志:

复制
# 列出CronJob创建的所有Jobs
kubectl get jobs -l job-name=hello-world-cronjob

# 获取最新的Job名称,然后查看日志
kubectl logs -f <latest-job-pod-name>
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值