Docker 与 K8S学习笔记(二十四)—— 工作负载的使用
我们前面讲了很多关于Pod的使用,但是在实际应用中,我们不会去直接创建Pod,我们一般通过Kubernetes提供的工作负载(Deployment、DeamonSet、StatefulSet、Job等)完成对一组Pod全生命周期的控制,本节开始我们来看看这些工作负载是如何使用的。
一、Deployments
Deployments可以自动部署一个容器应用的多个副本,监控其副本数量并始终维持这一数量。我们来创建一个Deployments看看:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx-deployment
- spec:
- selector:
- matchLabels:
- app: nginx
- replicas: 3
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:latest
- ports:
- - containerPort: 80
我们的Deployment会创建并维持三个nginx副本,我们通过kubectl create创建此Deployment:
- [root@kubevm1 workspace] kubectl create -f demo_deployment.yml
- [root@kubevm1 workspace] kubectl get deployments
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx-deployment 3/3 3 3 2m40s
- [root@kubevm1 workspace] kubectl get pods
- NAME READY STATUS RESTARTS AGE
- nginx-deployment-585449566-b6v88 1/1 Running 0 2m4s
- nginx-deployment-585449566-p4vb7 1/1 Running 0 2m4s
- nginx-deployment-585449566-s95sr 1/1 Running 0 2m4s
我们看到三个nginx的Pod豆启动完毕了,当我们手动杀掉一个Pod,Deployment会自动将其恢复:
- [root@kubevm1 workspace] kubectl delete pod nginx-deployment-585449566-b6v88
- [root@kubevm1 workspace] kubectl get pods
- NAME READY STATUS RESTARTS AGE
- nginx-deployment-585449566-b6v88 0/1 Terminating 0 7m23s
- nginx-deployment-585449566-nbrdm 0/1 ContainerCreating 0 6s
- nginx-deployment-585449566-p4vb7 1/1 Running 0 7m23s
- nginx-deployment-585449566-s95sr 1/1 Running 0 7m23s
我们前面说过Deployment是自动启动并调度Pod的,这三个Pod最终在哪些节点上运行,完全由master的Scheduler来控制,我们通过-o wide来看看这三个Pod都分布在哪里:
- [root@kubevm1 workspace] kubectl get pods -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nginx-deployment-585449566-nbrdm 1/1 Running 0 3m12s 10.244.1.8 kubevm2 <none> <none>
- nginx-deployment-585449566-p4vb7 1/1 Running 0 10m 10.244.2.5 kubevm3 <none> <none>
- nginx-deployment-585449566-s95sr 1/1 Running 0 10m 10.244.1.7 kubevm2 <none> <none>
二、DaemonSet
DaemonSet是kubernetes 1.2新增的资源对象,它可以确保在每个Node上仅运行一份Pod的副本,DaemonSet可用于以下场景:
在每个节点上运行集群守护进程
在每个节点上运行日志收集守护进程
在每个节点上运行监控守护进程
我们创建一个DaemonSet看看效果,我们还是以Nginx为例,下面的例子定义的Daemon将会为每个Node都启动一个Nginx容器:
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: nginx-daemonset
- labels:
- app: nginx
- spec:
- selector:
- matchLabels:
- name: nginx-daemonset
- template:
- metadata:
- labels:
- name: nginx-daemonset
- spec:
- containers:
- - name: nginx
- image: nginx:latest
- ports:
- - containerPort: 80
我们创建此DaemonSet看看:
- [root@kubevm1 workspace] kubectl create -f demo_daemonset.yml
- daemonset.apps/nginx-daemonset created
- [root@kubevm1 workspace] kubectl get DaemonSet
- NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
- nginx-daemonset 2 2 2 2 2 <none> 11m
- [root@kubevm1 workspace] kubectl get pods -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nginx-daemonset-49tcp 1/1 Running 0 14m 10.244.1.13 kubevm2 <none> <none>
- nginx-daemonset-w2xc2 1/1 Running 0 14m 10.244.2.11 kubevm3 <none> <none>
与Deployment不同的是,我们在yaml中没有指定replicas,但是DaemonSet自动为除Master节点外每一个Node都创建了一个副本,这里大家可能会问:为什么Master没有Pod副本呢?这个因为缺省状态下,DaemonSet只会在Node中创建副本,如果需要在Master中也启动Pod,则需要设置容忍度:
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: nginx-daemonset
- labels:
- app: nginx
- spec:
- selector:
- matchLabels:
- name: nginx-daemonset
- template:
- metadata:
- labels:
- name: nginx-daemonset
- spec:
- tolerations:
- - key: node-role.kubernetes.io/control-plane
- operator: Exists
- effect: NoSchedule
- - key: node-role.kubernetes.io/master
- operator: Exists
- effect: NoSchedule
- containers:
- - name: nginx
- image: nginx:latest
- ports:
- - containerPort: 80
我们重新创建DaemonSet,看看效果:
- [root@kubevm1 workspace] kubectl get pods -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nginx-daemonset-45z95 1/1 Running 0 46s 10.244.2.13 kubevm3 <none> <none>
- nginx-daemonset-9z2lt 1/1 Running 0 46s 10.244.0.5 kubevm1 <none> <none>
- nginx-daemonset-cjf6k 1/1 Running 0 46s 10.244.1.15 kubevm2 <none> <none>
关于容忍度的内容我们后续会详细介绍。
三、Jobs
我们使用Jobs可以定义并启动一个批处理任务,处理完成后,整个批处理任务结束。下面我们创建一个Job,此Job会输出一段文本:
- apiVersion: batch/v1
- kind: Job
- metadata:
- name: echo
- spec:
- template:
- spec:
- containers:
- - name: echo
- image: busybox
- command: ["sh", "-c", "echo this a job"]
- restartPolicy: Never
我们创建Job看一下效果:
- [root@kubevm1 workspace] kubectl get job
- NAME COMPLETIONS DURATION AGE
- echo 1/1 14s 7h3m
- [root@kubevm1 workspace] kubectl get pods
- NAME READY STATUS RESTARTS AGE
- echo-c5kmf 0/1 Completed 0 7h3m
- [root@kubevm1 workspace] kubectl logs echo-c5kmf
- this a job
我们设置Job运行完毕后不会重启,所以最终其Pod状态为Complated。
上面的例子只是起了一个Pod比较简单,在实际应用中,我们往往会启动多个Pod并行处理任务,因此Job的使用有以下三种常见模式:
Non-parallel Jobs:一个Job只启动一个Pod,当Pod异常会重启Pod,一旦此Pod正常结束,Job将结束。
Parallel Jobs with a fixed completiong count:并行Job会启动多个Pod,此时需要设定Job的spec.completions为一个正数,当正常结束的Pod数达到此参数设定值后,Job结束。此外,通过设置spec.parallelism可以设置并行度即同时启动几个Job来处理工作项。
Parallel Jobs with a work queue:工作项都放在消息队列中,此模式不需要设置spec.completions参数,而Pod具有以下特性:
每个Pod都能独立判断和决定释放还有任务项需要处理;
如果某个Pod正常结束,则Job不会再启动新的Pod,并且其他Pod应该处于即将结束的状态,毕竟队列里没任务了嘛;
如果所有Pod都结束了,且至少有一个Pod成功结束,则整个Job成功结束。
限于篇幅,关于Job的后两种模式,后面会有专门讲解。
四、CronJob
CronJob其实就是具有定时功能的Job,可以设置Job定时执行或者周期性执行,CronJob使用Cron表达式配置执行周期。我们修改下上面Job定义文件:
- apiVersion: batch/v1beta1
- kind: CronJob
- metadata:
- name: echo
- spec:
- schedule: "*/1 * * * *"
- jobTemplate:
- spec:
- template:
- spec:
- containers:
- - name: echo
- image: busybox
- command: ["sh", "-c", "echo this a job"]
- restartPolicy: OnFailure
我们设置每一分钟执行一次,这里也能看出来,在Kubernetes中,CronJob最小调度间隔为分钟级。
- [root@kubevm1 workspace] kubectl get cronjob
- NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
- echo */1 * * * * False 0 29s 4m48s
- [root@kubevm1 workspace] kubectl get pods
- NAME READY STATUS RESTARTS AGE
- echo-1655768220-m5p9x 0/1 Completed 0 2m34s
- echo-1655768280-m7gsj 0/1 Completed 0 93s
- echo-1655768340-h2n6n 0/1 Completed 0 33s
Docker 与 K8S学习笔记(二十四)—— 工作负载的使用的更多相关文章
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- Docker 与 K8S学习笔记(十 二)容器间数据共享
数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...
- Docker 与 K8S学习笔记(十八)—— Pod的使用
Pod 是一组紧密关联的容器集合,它们共享IPC.Network和UTS namespace,是 Kubernetes 调度的基本单元.Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件 ...
- Java基础学习笔记二十四 MySQL安装图解
.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Compl ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- Docker 与 K8S学习笔记(十)—— 容器的端口映射
我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...
- Docker 与 K8S学习笔记(十九)—— Pod的配置管理
我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能.将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是 ...
- PHP学习笔记二十四【Get Set】
<?php Class Person{ private $n1; private $n2; private $n3; //使用__set方法来管理所有的属性 public function __ ...
- angular学习笔记(二十四)-$http(2)-设置http请求头
1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 Accept:application/json,text/plain ...
随机推荐
- PowerBI开发:用自然语言来探索数据--Q&A
Power BI报表的用户,肯定会被Q&A的功能惊艳到,在查看报表时,仅仅通过输入文本就可以探索数据,并且结果是可视化的,更令人惊艳的时,结果几乎是实时显示出来的.这使得Q&A Vis ...
- gin框架使用【1.Hello World】
package mainimport ( "github.com/gin-gonic/gin")func main() { router := gin.Default() rout ...
- 一篇文章带你搞懂InnoDB的索引|结合样例
关注公众号[程序员白泽],带你走进一个不一样的程序员/学生党 前言 前阵子面试的时候,在第三面问到了MySQL索引相关的知识点,并且给出了一些SQL语句分析索引的执行情况.所以今天这篇文章给大家讲讲索 ...
- HCIE笔记-第三节-数据链路层与MAC地址
如果数据进行封装时,基于E2或者802.3标准,此时我们称之为是一个以太网数据帧. E2和802.3作用:定义帧头和帧尾的格式. 以太网是现在局域网组网的唯一标准. 数据:对于下层的每个层级而言,上层 ...
- Visual Studio2019 F5调试程序时选择文件后调试控制台进程关闭问题
问题:Visual Studio2019 F5调试程序时选择文件后调试控制台进程关闭问题 解决方案: 修改Visual Studio 配置项 [工具]-[选项]-[项目和解决方案]-[Web项目]-[ ...
- .NET 7 Preview 3添加了这些增强功能
.NET 7 Preview 3 已发布, .NET 7 的第三个预览版包括对可观察性.启动时间.代码生成.GC Region.Native AOT 编译等方面的增强. 有兴趣的用户可以下载适用于 W ...
- postgreSQL使用sql归一化数据表的某列,以及出现“字段 ‘xxx’ 必须出现在 GROUP BY 子句中或者在聚合函数中”错误的可能原因之一
前言: 归一化(区别于标准化)一般是指,把数据变换到(0,1)之间的小数.主要是为了方便数据处理,或者把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权. 不过还是有很多人使用 ...
- XCTF练习题---WEB---backup
XCTF练习题---WEB---backup flag:Cyberpeace{855A1C4B3401294CB6604CCC98BDE334} 解题步骤: 1.观察题目,打开场景 2.打开以后发现是 ...
- 同时将代码备份到Gitee和GitHub
同时将代码备份到Gitee和GitHub 如何将GitHub项目一步导入Gitee 如何保持Gitee和GitHub同步更新 如何将GitHub项目一步导入Gitee 方法一: 登陆 Gitee 账号 ...
- 【Git】一台电脑与多个分布式版本管理平台连接
六. 一台电脑与多个版本控制平台 1. 一台电脑同时通过ssh连接github和码云gitee 打开git bash 进入.ssh cd ~/.ssh 分别生成两个平台的公钥和私钥 $ ssh-key ...