kubernetes核心概念 controller 介绍(上)

kubernetes核心概念 Controller

一、pod控制器controller

1.1 Controller作用及分类

controller用于控制pod

控制器主要分为:

  • Deployments:Deployment是管理应用副本的API对象。管理员只需要在Deployment中描述期望的状态,Deployment就能根据一定的策略将ReplicaSet与Pod更新到管理员预期的状态。Deployment提供了运行Pod的能力,并且为Pod提供滚动升级、伸缩、副本等功能,一般用于运行无状态的应用
  • ReplicaSet :副本集,控制pod扩容,裁减
  • StatefulSets:StatefulSet用来管理一组Pod集合的部署和扩缩容,并为这些Pod提供持久化存储和持久化标识符。与Deployment不同的是,StatefulSet为每个Pod维护了一个固定的ID。这些Pod是基于相同的模板来创建的,但是不能相互替换,无论怎么调度,每个Pod都有一个固定的ID比如部署mysql,kafka等
  • DaemonSet:DaemonSet确保全部Node上运行一个Pod的副本。当有Node加入集群时,会自动为它们新增一个Pod;当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod
  • Jobs:Job负责批量处理短暂的一次性任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
  • Cronjob:CronJob负责周期性的处理任务,根据Cron表达式定时执行Job。

1.2 Deployment

1.2.1 Replicaset控制器的功能

  • 支持新的基于集合的selector(以前的rc里没有这种功能)
  • 通过改变Pod副本数量实现Pod的扩容和缩容

1.2.2 Deployment控制器的功能

  • Deployment集成了上线部署、滚动升级、创建副本、回滚等功能
  • Deployment里包含并使用了ReplicaSet

1.2.3 Deployment用于部署无状态应用

1.2.4 创建deployment类型应用

1, 准备YAML文件

[root@k8s-master1 ~]# vim deployment-nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx                    # deployment名
spec:                           
  replicas: 1                                   # 副本集,deployment,pod的个数里使用了replicaset
  selector:
    matchLabels:
      app: nginx                                # 匹配的pod标签,表示deployment和rs控制器控制带有此标签的pod
  template:                                         # 代表pod的配置模板
    metadata:
      labels:
        app: nginx                              # pod的标签
    spec:
      nodeName: k8s-worker01                    # 调度到k8s-worker1节点
      containers:                               # 以下为pod里的容器定义
      - name: nginx
        image: nginx:1.19.6
        imagePullPolicy: IfNotPresent          #先使用本地镜像,在下载镜像
        ports:
        - containerPort: 80
        resources:                            #内存限制
          limits:
            memory: "200Mi"                   
          requests:
            memory: "100Mi"
        livenessProbe:
          httpGet:                          # 使用httpGet方式
            port: http                      # http协议,也可以直接写80端口
            path: /index.html               # 探测家目录下的index.html
          initialDelaySeconds: 3            # 延迟3秒开始探测
          periodSeconds: 5                  # 每隔5s钟探测一次

2, 应用YAML文件创建deployment

[root@k8s-master1 ~]# kubectl apply -f deployment-nginx.yml
deployment.apps/deploy-nginx created

3, 查看验证

[root@k8s-master1 ~]# kubectl get deployment				# deployment可简写成depoly
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   1/1     1            1           2m3s
[root@k8s-master1 ~]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-7f64bfc548-wdqs9   1/1     Running   0          91s   192.168.79.101   k8s-worker01   <none>           <none>
[root@k8s-master1 ~]# kubectl get rs				
NAME                      DESIRED   CURRENT   READY   AGE
deploy-nginx-7f64bfc548   1         1         1       3m38s
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-7f64bfc548-wdqs9   1/1     Running   0          7m33s   192.168.79.101   k8s-worker01   <none>           <none>

1, 删除pod(**注意: 是删除deployment中的pod**)

~~~powershell
[root@k8s-master01 pod]# kubectl delete pods deploy-nginx-7f64bfc548-wdqs9
pod "deploy-nginx-7f64bfc548-wdqs9" deleted

在这里插入图片描述
也就是说**pod的IP不是固定的,IP地址也会变化

既然IP地址不是固定的,所以需要一个固定的访问endpoint给用户,那么这种方式就是service.

1.2.7 pod版本升级

1, 升级前验证nginx版本

[root@k8s-master01 pod]# kubectl describe pods deploy-nginx-7f64bfc548-sm7q7 | grep Image
Image: nginx:1.19.6
Image ID: docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4

2, 升级为1.20.2版

kubectl set image deployment deploy-nginx nginx=nginx:1.20.2
deployment.apps/deploy-nginx image updated

说明:

  • deployment deploy-nginx代表名为deploy-nginx的deployment

可通过下面命令查看是否已经成功

[root@k8s-master01 pod]# kubectl describe pods deploy-nginx-6f7d7cb688-zltbf | grep Image
Image: nginx:1.20.2
Image ID: docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4

验证 pod
[root@k8s-master01 pod]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
deploy-nginx-6f7d7cb688-zltbf   1/1     Running   0          2m18s

验证版本

root@k8s-master01 pod]# kubectl describe pods deploy-nginx-6f7d7cb688-zltbf | grep Image
    Image:          nginx:1.20.2
    Image ID:       docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4
    
2, 定义要回退的版本
~~~powershell
[root@k8s-master1 ~]# kubectl rollout history deployment deploy-nginx --revision=1


3, 执行回退

~~~powershell
[root@k8s-master1 ~]# kubectl rollout undo deployment deploy-nginx --to-revision=1
deployment.apps/deploy-nginx rolled back

4, 验证

[root@k8s-master01 pod]# kubectl describe pods deploy-nginx-7f64bfc548-bpt68 | grep Image
Image: nginx:1.19.6
Image ID: docker-pullable://nginx@sha256:8e10956422503824ebb599f37c26a90fe70541942687f70bbdb744530fc9eba4


### 1.2.9 副本扩容

1, 扩容为2个副本

~~~powershell
[root@k8s-master1 ~]# kubectl scale deployment deploy-nginx --replicas=2
deployment.apps/deploy-nginx scaled

2, 查看

[root@k8s-master01 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-7f64bfc548-542h2 1/1 Running 0 3s
deploy-nginx-7f64bfc548-bpt68 1/1 Running 0 85s

1.2.10 副本裁减

1, 指定副本数为1进行裁减

[root@k8s-master1 ~]# kubectl scale deployment deploy-nginx --replicas=1
deployment.apps/deploy-nginx scaled

2, 查看验证

[root@k8s-master01 pod]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-7f64bfc548-bpt68 1/1 Running 0 2m20s 192.168.79.104 k8s-worker01

1.2.12 删除deployment

如果使用 kubectl delete deployment deploy-nginx 命令删除deployment,那么里面的pod也会被自动删除

二、pod控制器Controller进阶

2.1 DaemonSet

2.1.1 DaemonSet介绍

DaemonSet是Kubernetes中的一种控制器对象,它的主要作用是在Kubernetes集群的每个节点上运行一个Pod的副本。这意味着,当DaemonSet被创建时,系统会自动调度Pod到所有符合条件的节点上,确保每个节点上都有且仅有一个该Pod的实例。
DaemonSet在Kubernetes中有着广泛的应用场景,例如部署网络插件的Agent组件、存储插件的Agent组件、监控组件和日志组件等。这些组件都需要在每个节点上运行,以处理节点上的容器网络、挂载远程存储目录、操作容器的Volume目录、收集监控信息和日志等任务。
DaemonSet的特性
1.每个节点运行一个实例:DaemonSet会在集群的每个节点上自动创建一个Pod的副本,并确保每个节点上都有一个Pod在运行。这种特性使得DaemonSet特别适合用于部署需要在每个节点上运行的守护进程应用程序。
2.节点生命周期绑定:当新的节点加入到Kubernetes集群时,DaemonSet会自动在该节点上运行所需的Pod副本。相反,当节点从集群中移除或被标记为不可调度时,DaemonSet会移除或清理与之关联的Pod。
3.节点选择性部署:DaemonSet支持使用NodeSelector、NodeAffinity等机制来精细控制Pod在哪些节点上运行。这使得用户可以根据需要,将Pod部署在具有特定标签的节点上

2.1.2 DaemonSet应用案例

1, 编写YAML文件

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.6
imagePullPolicy: IfNotPresent
3, 验证

[root@k8s-master01 pod]# kubectl get daemonset -o wide
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-daemonset   3         3         2       3            2           <none>          92s   nginx        nginx:1.19.6   app=nginx

~~~powershell
[root@k8s-master01 pod]# kubectl get pods -o wide
NAME                    READY   STATUS             RESTARTS   AGE    IP               NODE           NOMINATED NODE   READINESS GATES
nginx-daemonset-cmxdt   1/1     Running            0          114s   192.168.79.111   k8s-worker01   <none>           <none>
nginx-daemonset-pbd6s   1/1     Running            0          114s   192.168.32.157   k8s-master01   <none>           <none>
nginx-daemonset-wkf68   0/1     ImagePullBackOff   0          114s   192.168.69.230   k8s-worker02   <none>           <none>
k8s集群中每个节点都会运行一个pod

2.2 Job

2.2.1 Job介绍

  • 对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。
  • Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
    特点:

创建Pod运行特定任务,确保任务运行完成
任务运行期间节点异常时会自动重新创建Pod
支持并发创建Pod任务数和指定任务数

1, 编写YAML文件

[root@master ~]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    metadata:
      name: example-job-pod
    spec:
      containers:
      - name: c
        image: busybox
        command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 30']
      restartPolicy: OnFailure  失败后重启

2, 应用YAML文件创建job

[root@master ~]# kubectl apply -f job.yml
job.batch/example-job created

3, 验证

[root@k8s-master1 ~]# kubectl get jobs
NAME   COMPLETIONS   DURATION   AGE
example-job    1/1           11s        18s
[root@k8s-master1 ~]# kubectl get pods
NAME                         READY   STATUS             RESTARTS   AGE
example-job-tjq9b                     0/1     Completed          0         27s

Completed状态,也不再是ready状态

2.3 CronJob

2.3.1 CronJob介绍

在 k8s 中,CronJob 是一种用于定期执行任务的资源对象。它基于 Cron 表达式,允许您在指定的时间间隔内自动运行容器化的任务
CronJob 特点
在现代的云原生应用中,定时任务是一个非常重要的组成部分。k8s 提供了一种称为 CronJob 的机制,可以让我们方便地定义和管理定时任务。
CronJob 管理基于时间的 job,即:
在给定时间点只运行一次
周期性地在给定时间点运行
一个 CronJob 对象类似于 crontab(cron table)文件中的一行。它根据指定的预定计划周期性地运行一个 Job,格式可以参考 cron。
典型的用法如下所示:
在给定的时间点调度 Job 运行
创建周期性运行的 Job,例如:数据库备份、发送邮件

2.3.2 CronJob应用案例

1, 编写YAML文件

[root@k8s-master1 ~]# vim cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob1
spec:
  schedule: "* * * * *"                 # 分时日月周
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo hello kubernetes
            imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure

2, 应用YAML文件创建cronjob

[root@k8s-master1 ~]# kubectl apply -f cronjob.yml
cronjob.batch/cronjob1 created

3, 查看验证

[root@k8s-master1 ~]# kubectl get cronjob
NAME       SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob1   * * * * *   False     0        <none>          21s
[root@k8s-master1 ~]# kubectl get pods
NAME                         READY   STATUS             RESTARTS   AGE
cronjob-1564993080-qlbgv     0/1     Completed          0          2m10s
cronjob-1564993140-zbv7f     0/1     Completed          0          70s
cronjob-1564993200-gx5xz     0/1     Completed          0          10s

看AGE时间,每分钟整点执行一次

猜你喜欢

转载自blog.csdn.net/weixin_46544841/article/details/140552440