k8s 中的 Deployment,DaemonSet,Job
k8s 通常不会直接创建Pod,而是通过 Controller 来管理Pod的,Controller 定义了Pod的部署特性,比如有几个副本,在什么样的Node上运行等。为了满足不同的业务场景,k8s提供了多种Controller ,包括Deployment,DaemonSet,Job 等。
Deployment
配置文件简介
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web_server
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.14.0
使用kubectl apply -f nginx.yml
部署完成我们第一个deployment。
# kubectl get deployment
image.png
伸缩
伸缩指的是在线增加或减少Pod的副本数。
image.png
从上面可以看出,nginx deployment 初始是2个副本,分别被调度到了 viros2 和 viros3 上执行。现在我们将副本数从2改为5。再重新部署,发现新建的副本被部署到了viros1, viros2,viros3。
image.png
如果我们再将副本数改为3,再重新部署,发现有2个副本被删除:
image.png
Failover
我们模拟viros3 故障,关闭该节点。
label 实现控制POD的位置
默认情况下,Scheduler 会将Pod调度到所有可用的Node,
DaemonSet
Deployment 部署的副本Pod 会分布在各个Node上,每个Node可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行一个副本。
DaemonSet 典型应用场景有:
- 在集群的每个节点上运行的存储Daemon,比如ceph
- 在每个节点上运行的日志收集的Daemon
- 在每个节点上运行的监控Daemon,比如 prometheus 的 node exporter
其实k8s 自己就在用 DaemonSet 运行系统组件:
image.png
Job
容器按照持续运行的时间可分为两类:
- 服务类容器
服务类容器通常持续提供服务,需要一直运行,比如HTTP Server,Daemon 等。 - 工作类容器
工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。
定义 job.yml 文件如下:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: [ "echo", "Hello kids jobs" ]
restartPolicy: Never
- restartPolicy
指定什么情况下需要重启容器,对于Job,只能设置为Nerver 或者 OnFailure,对于其他 controller(比如deployment)可以设置为Always。
通过kubectl apply -f job.yml
,启动:
# kubectl get job
image.png
我们可以通过查看pod的状态和输出来确定我们Job是否已经成功执行:
因为pod已经退出,所以我们需要使用-A
选项查看。
Job 的并行性
定时Job
Linux 中有cron程序定时执行任务,k8s 中也有 CronJob 提供类似的功能,可以定制执行Job。
定义 cronjob.yml 文件如下:
apiVersion: batch/v1
kind: CronJob
metadata:
name: mycronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: [ "echo", "Hello kids cronjobs" ]
restartPolicy: Never
通过 kubectl apply -f cronjob.yml
,启动:
# kubectl get cronjob
image.png
可以看到每隔1分钟就会启动一个Job,可以查看相应的Pod输出:
image.png