Loading

第7章:深入理解常用控制器

7.1 Pod与controller的关系

  • controllers:在集群上管理和运行容器的对象。有时也称为工作负载(workload)

  • 通过label-selector相关联,如下图所示。

  • Pod通过控制器实现应用的运维,如伸缩,滚动升级等

pod-controller

7.2 无状态应用部署控制器 Deployment

Deployment功能:

  • 部署无状态应用(无状态应用简单来讲,就是Pod可以漂移任意节点,而不用考虑数据和IP变化)

  • 管理Pod和ReplicaSet(副本数量管理控制器)

  • 具有上线部署、副本设定、滚动升级、回滚等功能

  • 提供声明式更新,例如只更新一个新的Image

应用场景:Web服务,微服务

下图是Deployment 标准YAML,通过标签与Pod关联。

deployment-yaml

使用YAML部署一个java应用:

# kubectl create deployment web --image=lizhenliang/java-demo -o yaml --dry-run > web-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
  namespace: default
spec:
  replicas: 3    # 设置3个副本
  selector:
    matchLabels:
      app: web   # deployment控制器关联pod的标签,与下面pod的标签名称相同,否则deployment控制器无法管理pod
  template:      # pod模板
    metadata:
      labels:
        app: web # pod的标签名称
    spec:
      containers:
      - image: lizhenliang/java-demo
        name: java-demo
    
# kubectl apply -f web-deploy.yaml

将这个java应用暴露到集群外部访问:

# kubectl expose deployment/web --port=80 --target-port=8080 --name web --type=NodePort -o yaml --dry-run > web-expose.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: web
  name: web
  namespace: default
spec:
  ports:
  - port: 80             # 集群内容访问应用端口
    protocol: TCP
    targetPort: 8080     # 容器镜像端口
    nodePort: 30008      # 对外暴露的端口
  selector:
    app: web             # 该标签名称必须与deployment控制器中关联pod的标签名称相同,否则无法连暴露pod
  type: NodePort
 
# kubectl apply -f web-expose.yaml

查看资源:

# kubectl get deploy,pods,svc,ep -o wide -n default

image-20210504004105351

浏览器输入:http://NodeIP:30008 即可访问到该应用。

1 升级项目,即更新最新镜像版本,这里换一个nginx镜像为例
kubectl set image deployment/web java-demo=tomcat --record
# 查看升级状态
# kubectl rollout status deployment/web
Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
deployment "web" successfully rolled out

2 如果该版本发布失败想回滚到上一个版本可以执行
# 回滚最新版本
kubectl rollout undo deployment/web
# 也可以回滚到指定发布记录
# 查看发布记录
kubectl rollout history deployment/web
# 回滚指定版本
kubectl rollout undo deployment/web --to-revision=1
kubectl rollout status deployment/web

3 扩容/缩容
# 将pod扩容到5个
kubectl scale deployment web --replicas=5
# --replicas 设置比现在值大就是扩容,反之就是缩容。
kubectl rollout status deployment/web

4 查看扩容后的状态
# kubectl get rs,deploy
NAME                             DESIRED   CURRENT   READY   AGE
replicaset.apps/web-787b446885   0         0         0       22m
replicaset.apps/web-7c65cbbdfd   0         0         0       26m
replicaset.apps/web-844f79f54c   5         5         5       40m

NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/web   5/5     5           5           40m

kubectl set image 会触发滚动更新,即分批升级Pod。

滚动更新原理其实很简单,利用新旧两个replicaset,例如副本是3个,首先Scale Up增加新RS副本数量为1,准备就绪后,Scale Down减少旧RS副本数量为2,以此类推,逐渐替代,最终旧RS副本数量为0,新RS副本数量为3,完成本次更新。这个过程可通过 kubectl describe deployment web 看到。

rolling-update

7.3 守护进程控制器 DaemonSet

DaemonSet功能:

  • 在每一个Node上运行一个Pod

  • 新加入的Node也同样会自动运行一个Pod

应用场景:Agent,例如监控采集工具,日志采集工具

daemonset

# cat daemonset-busybox.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: busybox
  name: busybox
  namespace: default
spec:
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - image: busybox
        name: busybox

7.4 批处理 Job & CronJob

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   # 作业失败后会不再尝试创建新的Pod
  backoffLimit: 4            # .spec.backoffLimit字段限制重试次数。默认情况下,这个字段默认值是6。

上述示例中将π计算到2000个位置并将其打印出来。完成大约需要10秒。

查看任务:

# kubectl get job,pod -o wide

image-20210504001155195

CronJob:定时任务,像Linux的Crontab一样。

应用场景:通知,备份

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure  # 作业失败并返回状态码非0时,尝试创建新的Pod运行任务

上述示例中将每分钟打印一次Hello。

查看任务:

# kubectl get cronjob,pod -o wide

image-20210504001528077


posted @ 2021-05-04 13:29  云起时。  阅读(270)  评论(0编辑  收藏  举报