k8s五种控制器

本文详细介绍了Kubernetes中的五种控制器:Deployment用于无状态服务的部署和更新;StatefulSet管理有状态应用,保持Pod的有序性和持久化存储;DaemonSet确保每个节点运行一个Pod副本;Job创建并确保指定数量的Pod成功执行;CronJob按预设时间计划执行Job。
摘要由CSDN通过智能技术生成

1.Deployment

1.1Deployment 概述

Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得您能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集).

1.2 创建Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
kubectl apply -f nginx-dep.yml

执行命令 kubectl get deployments` 检查 Deployment 的创建情况。

root@k8s-master ~]# kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           4d23h

字段含义

字段名称说明
NAMEDeployment name
DESIREDDeployment 期望的 Pod 副本数,即 Deployment 中 .spec.replicas 字段指定的数值。该数值是“期望”值
CURRENT当前有多少个 Pod 副本数在运行
UP-TO-DATEDeployment 中,符合当前 Pod Template 定义的 Pod 数量
AVAILABLE当前对用户可用的 Pod 副本数
AGEDeployment 部署以来到现在的时长1.3更新Deployment

查看 Deployment 的发布状态(rollout status)

[root@k8s-master ~]# kubectl rollout status deployment nginx
deployment "nginx" successfully rolled out

1.3更新Deployment

1.执行以下命令,将容器镜像从 nginx:1.7.9 更新到 nginx:1.9.1

[root@k8s-master k8s]# kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/nginx-deployment image updated
deployment.apps/nginx-deployment image updated

2.使用edit 该 Deployment,并将 .spec.template.spec.containers[0].image 从 nginx:1.7.9 修改为 nginx:1.9.1

kubectl edit deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment edited

3.查看发布更新(rollout)的状态,执行命令

[root@k8s-master k8s]# kubectl rollout status deployment.v1.apps/nginx-deployment

1.4回滚Deployment

某些情况下,您可能想要回滚(rollback)Deployment,例如:Deployment 不稳定(可能是不断地崩溃)。默认情况下,kubernetes 将保存 Deployment 的所有更新(rollout)历史。您可以设定 revision history limit 来确定保存的历史版本数量 。

假设您在更新 Deployment 的时候,犯了一个拼写错误,将 nginx:1.9.1 写成了 nginx:1.91

kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
输出结果:
deployment.apps/nginx-deployment image updated

该更新将卡住,您可以执行命令 kubectl rollout status deployment.v1.apps/nginx-deployment 检查其状态,输出结果如下所示:

aiting for rollout to finish: 1 out of 3 new replicas have been updated...

执行命令 kubectl get rs 您将看到两个旧的 ReplicaSet(nginx-deployment-1564180365 and nginx-deployment-2035384211)和一个新的 ReplicaSet (nginx-deployment-3066724191) 。如下所示:

NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-1564180365   3         3         3       25s
nginx-deployment-2035384211   0         0         0       36s
nginx-deployment-3066724191   1         1         0       6s

执行命令 kubectl get pods,您将看到 1 个由新 ReplicaSet 创建的 Pod 卡在抓取 image 的死循环里

NAME                                READY     STATUS             RESTARTS   AGE
nginx-deployment-1564180365-70iae   1/1       Running            0          25s
nginx-deployment-1564180365-jbqqo   1/1       Running            0          25s
nginx-deployment-1564180365-hysrc   1/1       Running            0          25s
nginx-deployment-3066724191-08mng   0/1       ImagePullBackOff   0          6s
  • 检查 Deployment 的更新历史

kubectl rollout history deployment.v1.apps/nginx-deployment
deployments "nginx-deployment"
REVISION    CHANGE-CAUSE
1           kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true
2           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
3           kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true

执行命令 kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2,查看 revision(版本)的详细信息,输出结果如下所示:

deployments "nginx-deployment" revision 2
  Labels:       app=nginx
          pod-template-hash=1159050644
  Annotations:  kubernetes.io/change-cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
  Containers:
  nginx:
    Image:      nginx:1.9.1
    Port:       80/TCP
    QoS Tier:
        cpu:      BestEffort
        memory:   BestEffort
    Environment Variables:      <none>
  No volumes.
  • 回滚到前一个 revision(版本)

执行命令 kubectl rollout undo deployment.v1.apps/nginx-deployment 将当前版本回滚到前一个版本,输出结果如下所示:

deployment.apps/nginx-deployment

或者,您也可以使用 --to-revision 选项回滚到前面的某一个指定版本,执行如下命令

kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2

输出结果如下:

deployment.apps/nginx-deployment

1.5伸缩Deployment

执行命令 kubectl scale deployment.v1.apps/nginx-deployment --replicas=10,可以伸缩 Deployment,输出结果如下所示:

deployment.apps/nginx-deployment scaled

如果您的集群启用了自动伸缩(horizontal Pod autoscaling (opens new window)),执行以下命令,您就可以基于 CPU 的利用率在一个最大和最小的区间自动伸缩您的 Deployment

kubectl autoscale deployment.v1.apps/nginx-deployment --min=10 --max=15 --cpu-percent=80

输出结果如下所示:

deployment.apps/nginx-deployment scaled

1.6暂停和继续Deployment

执行命令 kubectl rollout pause deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment paused

执行命令 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1,更新 Deployment 的容器镜像,输出结果如下所示:

deployment.apps/nginx-deployment image updated

执行命令 kubectl rollout history deployment.v1.apps/nginx-deployment,可查看到尚未生成新的 Deployment 版本(revision),输出结果如下所示

deployments "nginx"
REVISION  CHANGE-CAUSE
1   <none>

执行命令 kubectl get rs 可查看到没有新的滚动更新开始执行,输出结果如下所示

NAME               DESIRED   CURRENT   READY     AGE
nginx-2142116321   3         3         3         2m

如果需要的话,您可以针对 Deployment 执行更多的修改,例如,执行命令 kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi 更新其 resource 限制,输出结果如下所示:

kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
deployment.apps/nginx-deployment resource requirements updated

执行命令 kubectl describe deployment nginx-deployment,确保 Deployment 的信息已被正确修改

最后,执行命令 kubectl rollout resume deployment.v1.apps/nginx-deployment,继续(resume)该 Deployment,可使前面所有的变更一次性生效,输出结果如下所示:

kubectl rollout resume deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment resumed

执行命令 kubectl get rs -w 观察滚动更新的进展,输出结果如下所示:

1.7查看Deployment状态

命令:kubectl rollout status deployment.v1.apps/nginx-deployment

执行命令 :kubectl get deployment nginx-deployment -o yaml查看yaml文件

2.StatefulSet

2.1statefulset

StatefulSet 顾名思义,用于管理 Stateful(有状态)的应用程序。

与 Deployment 相似,StatefulSet 基于一个 Pod 模板管理其 Pod。与 Deployment 最大的不同在于 StatefulSet 始终将一系列不变的名字分配给其 Pod。这些 Pod 从同一个模板创建,但是并不能相互替换:每个 Pod 都对应一个特有的持久化存储标识。

  • StatefulSet 使用场景

  稳定、唯一的网络标识(dnsname)
  每个Pod始终对应各自的存储路径(PersistantVolumeClaimTemplate)
  按顺序地增加副本、减少副本,并在减少副本时执行清理
  按顺序自动地执行滚动更新

2.2创建StatefulSet

下面是一个 StatefulSet 的例子,由如下内容组成:

  • 一个名为 nginx 的 Headless Service (opens new window),用于控制网络域

  • 一个名为 web 的StatefulSet,副本数为 3

  • volumeClaimTemplates 提供稳定的存储(每一个 Pod ID 对应自己的存储卷,且 Pod 重建后,仍然能找到对应的存储卷)

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: nginx:1.7.9
        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

pod的标识

StatefulSet 中的 Pod 具备一个唯一标识,该标识由以下几部分组成:

  • 序号

  • 稳定的网络标识

  • 稳定的存储

该标识始终与 Pod 绑定,无论该 Pod 被调度(重新调度)到哪一个节点上。

3.DaemonSet

DaemonSet 控制器确保所有(或一部分)的节点都运行了一个指定的 Pod 副本

1.每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上
2.当节点从集群中移除时,Pod 也就被垃圾回收了
3.删除一个 DaemonSet 可以清理所有由其创建的 Pod

DaemonSet 的典型使用场景有

1.在每个节点上运行集群的存储守护进程,例如 glusterd、ceph
2.在每个节点上运行日志收集守护进程,例如 fluentd、logstash
3.在每个节点上运行监控守护进程

创建DaemonSet

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: fluent/fluentd-kubernetes-daemonset:v1.7.1-debian-syslog-1.0
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

执行如下命令可创建该 DaemonSet:

kubectl apply -f ./daemonset.yaml

与 DaemonSet 容器组通信的模式有:

Push: DaemonSet 容器组用来向另一个服务推送信息,例如数据库的统计信息。这种情况下 DaemonSet 容器组没有客户端
NodeIP + Port: DaemonSet 容器组可以使用 hostPort,此时可通过节点的 IP 地址直接访问该容器组。客户端需要知道节点的 IP 地址,以及 DaemonSet 容器组的 端口号
DNS: 创建一个 headless service (opens new window),且该 Service 与 DaemonSet 有相同的 Pod Selector。此时,客户端可通过该 Service 的 DNS 解析到 DaemonSet 的 IP 地址
Service: 创建一个 Service,且该 Service 与 DaemonSet 有相同的 Pod Selector,客户端通过该 Service,可随机访问到某一个节点上的 DaemonSet 容器组


4.Job

Kubernetes中的 Job 对象将创建一个或多个 Pod,并确保指定数量的 Pod 可以成功执行到进程正常结束:

  • 当 Job 创建的 Pod 执行成功并正常结束时,Job 将记录成功结束的 Pod 数量

  • 当成功结束的 Pod 达到指定的数量时,Job 将完成执行

  • 删除 Job 对象时,将清理掉由 Job 创建的 Pod

运行一个Job的例子

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
  • 执行如下命令创建该对象:

    kubectl apply -f https://kuboard.cn/statics/learning/job/job.yaml
    
    
    
  • 执行命令查看创建结果

    kubectl describe jobs/pi
    

执行以下命令可查看所有结束的 Pod

kubectl get pods

执行以下命令可获得该 Job 所有 Pod 的名字:

pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath='{.items[*].metadata.name}')
echo $pods

输出结果如下

pi-aiw0a


5.CronJob

CronJob 按照预定的时间计划(schedule)创建 Job。一个 CronJob 对象类似于 crontab (cron table) 文件中的一行记录。该对象根据 Cron (opens new window)格式定义的时间计划,周期性地创建 Job 对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值