1、Deplyment
2、DaemonSet
3、Job
4、CronJob
**

Deployment

【十期/七章】

Pod与controllers的关系

• controllers:在集群上管理和运行容器的对象
• 通过label-selector(标签选择器)相关联、相互匹配
• Pod通过控制器实现应用的运维,如伸缩,滚动升级等(部署应用都是通过控制器来部署的)
5.jpg

**

Deployment功能

  • 部署无状态应用
  • 管理Pod和ReplicaSet

    1. ReplicaSet:控制副本数量、管理滚动升级、发布版本管理
  • 具有上线部署、副本设定、滚动升级、回滚等功能

  • 提供声明式更新,例如只更新一个新的Image
  • 应用场景:Web服务,微服务、api服务(这些都是无状态应用的服务)

无状态服务

没有状态的服务,是指不在本地存储持久化数据,多个实例对同一个请求相应的结果是完全一致的,各个请求对于服务器来说统一无差别处理。请求自身携带了所有服务端所需要的的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息)

有状态服务

与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等。指该服务的实例可以将一部分数据随时进行备份,并且在创建一个新的有状态服务时,可以通过备份恢复这些数据,以达到数据持久化的目的

无状态服务可以有一个或多个实例,因此支持两种服务容量调节模式;有状态服务只能有一个实例,不允许创建多个实例,因此也不支持服务容量调节模式

举例:
在商城购买商品,需要经过放入购物车,确认订单、付款等多个步骤,由于HTTP协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的session,将用户挑选的商品(购物车)保存到session中,当付款的时候,在从购物车取出商品信息。

6.jpg

  • 创建

kubectl create deployment web —image=nginx
kubectl get deploy,pods

  • 发布(将创建的pod服务暴露出去)

kubectl expose deployment web —port=80 —type=NodePort —target-port=80 —name=web
kubect get expose —help #查看语法帮助
kubectl get service

  • 升级(升级deployment的镜像)

kubectl set image deployment/web nginx=nginx:1.16
kubectl set image —help #查看语法帮助
kubectl rollout status deployment/web
#该升级的方式为滚动升级,例有三个deployment/web的pod,逐个升级每个pod

  • 回滚(回滚到上一个镜像的版本)

kubectl rollout history deployment/web
kubectl rollout undo deployment/web # 回滚到上一个版本
kubectl rollout undo deployment/web —revision=2 # —revision参数指定某个历史版本

  • 扩容/缩容

kubectl scale deployment web —replicas=5 # 扩容为5个pod

  • 查看缩写

kubectl api-resources

Daemonset

Daemonset的功能

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

Daemonset确保全部(或者一些)Node运行Pod的副本。当有Node加入集群时,也会为他们新增一些Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。
场景:**比较适合每个节点上都运行一个应用

  • 每个节点运行日志收集服务
  • 每个节点运行监控服务
  • 每个节点运行网络插件、存储插件

      ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1189031/1589955258554-2dd13797-61b9-4760-a4f5-a73a8f400811.png#align=left&display=inline&height=364&margin=%5Bobject%20Object%5D&name=image.png&originHeight=364&originWidth=638&size=27838&status=done&style=shadow&width=638)
    

举例:flannel网络组件使用的就是DaemonSet的控制器,在每个节点中都存在pod
1111.jpg

Job

Job分为普通任务(Job)和定时任务(CronJob)

  • 一次性执行

应用场景:离线数据处理,视频解码等业务

举例:

# 创建一个job控制器的yaml
vim job.yaml

# 如下是job的yaml
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

# 创建该yaml
kubectl create -f job.yaml

# 查看job控制器
kubectl get job

2222.jpg
注意:Job执行完成之后的状态就是Completed

CronJob

定时任务,与Linux的Crontab一样

  • 定时任务

举例:

# 编写cronjob的yaml
vim cronjob.yaml

# 如下是cronjob的yaml
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

# 创建cronjob的yaml
kubectl apply -f cronjob.yaml

# 查看结果
kubectl get cronjob
kubectl get pod
![3333.jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/1189031/1589960836373-93796280-8664-430b-a562-e98ca6719d66.jpeg#align=left&display=inline&height=402&margin=%5Bobject%20Object%5D&name=3333.jpg&originHeight=402&originWidth=525&size=92976&status=done&style=none&width=525)

总结

  • Deployment:无状态部署
  • DaemonSet:守护进程部署
  • Job & Cronjob:批处理