Kubernetes:Pod总结(二)
承接上文。
在实际的生产使用场景中,直接用 Pod 是不合适的,因为必然会产生单点故障。因此,我们需要有一种方法来方便地创建、管理同一个服务的多个实例 Pod。Kubernetes 中引入了 Workload(工作负载) 的概念,它可以理解为 Pod 的父资源,主要的作用就是来管理多个 Pod 的生命周期。
Workload资源主要分为以下几类:
- Deployment 和 ReplicaSet :最常见的类型,用来管理集群上的无状态应用。
- DaemonSet:在集群的每个节点上部署一个 Pod,适用于各种 agent 业务的场景。 such as a networking helper tool, or be part of an add-on.
- StatefulSet:适用于各种有状态服务的场景。 例如,如果负载会将数据作持久存储,可以运行一个
StatefulSet
,将每个Pod
与某个PersistentVolume
对应起来。 - Job 和 CronJob: 用于一些自动化任务。
Job
用来表达的是一次性的任务,而CronJob
会根据其时间规划反复运行。
接下来将详细介绍几种Workload资源的使用方法。
Deployment 和 ReplicaSet
通常,我们不直接创建Pod,而是通过Deployment来创建Pod,由 Deployment 来负责创建、更新、维护其所管理的所有 Pods。而ReplicaSet则负责控制replicas(副本)的数量。
接下来,使用以下deployment作为例子来剖析两者的关系:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
topologySpreadConstraints:
- topologyKey: address
maxSkew: 1
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: nginx
创建这个deployment:
[root@master-1 test]# kubectl create -f nginx.yml
deployment.apps/nginx created
[root@master-1 test]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-58c948c775-5hbhf 1/1 Running 0 20s 10.16.84.138 node-1 <none> <none>
nginx-58c948c775-vfdp8 1/1 Running 0 20s 10.16.247.19 node-2 <none> <none>
通过kubectl describe deploy nginx
可知,有ScalingReplicaSet
信息:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 79s deployment-controller Scaled up replica set nginx-58c948c775 to 2
可以清晰的看到2个pod实例是通过replicaset
生成的:
[root@master-1 test]# kubectl get rs nginx-58c948c775
NAME DESIRED CURRENT READY AGE
nginx-58c948c775 2 2 2 4m22s
[root@master-1 test]# kubectl describe rs nginx-58c948c775
Name: nginx-58c948c775
Namespace: default
Selector: app=nginx,pod-template-hash=58c948c775
Labels: app=nginx
pod-template-hash=58c948c775
Annotations: deployment.kubernetes.io/desired-replicas: 2
deployment.kubernetes.io/max-replicas: 3
deployment.kubernetes.io/revision: 1
Controlled By: Deployment/nginx
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
pod-template-hash=58c948c775
Containers:
nginx:
Image: nginx:latest
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 4m31s replicaset-controller Created pod: nginx-58c948c775-5hbhf
Normal SuccessfulCreate 4m31s replicaset-controller Created pod: nginx-58c948c775-vfdp8
说明:
NAME
:列出名字空间中 ReplicaSet 的名称;DESIRED
:显示应用的期望副本个数,即在创建 Deployment 时所定义的值。 此为期望状态;CURRENT
:显示当前运行状态中的副本个数;READY
:显示应用中有多少副本可以为用户提供服务;AGE
:显示应用已经运行的时间长度。
总结
- 通过
kubectl create
创建一个deployment,那么此时就会调用deployment-controller创建一个replicaset; - replicaset则会调用replicaset-controller创建相应的pod;
- 最后由default-scheduler将pod分配到对应的node节点。
注意:尽管 ReplicaSet 可以独立使用,目前它们的主要用途是提供给 Deployment 作为 编排 Pod 创建、删除和更新的一种机制。
DaemonSet
DaemonSet确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的一些典型用法:
- 在每个节点上运行集群守护进程,例如ceph。
- 在每个节点上运行日志收集守护进程,例如filebeat、logstash。
- 在每个节点上运行监控守护进程,例如Promethues Node Exporter。
例如:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
namespace: default
spec:
selector:
matchLabels:
app: nginx-ds
release: stable
template:
metadata:
labels:
app: nginx-ds
release: stable
spec:
containers:
- name: nginx-ds
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
创建DaemonSet:
[root@master-1 test]# kubectl create -f nginx-ds.yml
daemonset.apps/nginx-ds created
[root@master-1 test]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-ds-fhz7n 1/1 Running 0 97s 10.16.84.139 node-1 <none> <none>
nginx-ds-jvc9p 1/1 Running 0 97s 10.16.247.20 node-2 <none> <none>
注意:
apiVersion
、kind
和metadata
也是DaemonSet必需字段。
调度指定节点:
nodeSelector:只调度到匹配指定 label 的 Node 上
nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作
podAffinity:调度到满足条件的 Pod 所在的 Node 上
StatefulSet
StatefulSet是Kubernetes中有状态应用管理的标准实现,本质上是Deployment的一种变体。
在日常开发的应用中,通常可以分为两类:有状态与无状态,比如web服务通常都是无状态的,web应用数据主要来自后端存储、缓存等中间件,而本身并不保存数据;而MySQL、Redis等中间件是有状态的,其数据也是应用自身的一部分,由此可以看出有状态应用本身会包含两部分:应用与数据。
Jobs
Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。
示例:
kubectl apply -f https://kubernetes.io/examples/controllers/job.yaml
查看Pods:
[root@master-1 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pi-bkpn8 1/1 Running 0 36s
查看输出:
[root@master-1 test]# kubectl logs pi-bkpn8
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
Tips:Job 完成时不会再创建新的 Pod,不过已有的 Pod 通常也不会被删除。 保留这些 Pod 使得你可以查看已完成的 Pod 的日志输出,以便检查错误、警告 或者其它诊断性输出。 Job 完成时 Job 对象也一样被保留下来,这样你就可以查看它的状态。 在查看了 Job 状态之后删除老的 Job 的操作留给了用户自己。
删除Job:
[root@master-1 test]# kubectl delete jobs/pi
job.batch "pi" deleted
也可通过CronJob来清理。
CronJob
FEATURE STATE: Kubernetes v1.21 [stable]
CronJob 创建基于时隔重复调度的 Jobs。它用 Cron 格式进行编写, 并周期性地在给定的调度时间执行 Job。
示例:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
Kubernetes:Pod总结(二)的更多相关文章
- Kubernetes Pod 驱逐详解
原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...
- Kubernetes Pod 镜像拉取策略
Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...
- Kubernetes Pod 资源限制
Kubernetes Pod 资源限制 官方文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources- ...
- Kubernetes Pod 调度约束
Kubernetes Pod 调度约束 可以将pod调度到指定的节点Node内 默认:根据节点资源利用率等分配Node节点. nodeName用于将Pod调度到指定的Node名称上 nodeSelec ...
- [原]部署kubernetes dashboard(二)
####################### 以下为声明 ##################### 此文档是之前做笔记在两台机上进行的实践,kubernetes处于不断开发阶段 不能保证每 ...
- Kubernetes Pod故障归类与排查方法
Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...
- Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize
追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...
- Kubernetes Pod 全面知识
Pod 是在 Kubernetes 中创建和管理的.最小的可部署的计算单元,是最重要的对象之一.一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络.存储等环境. 学习 Kubern ...
- kubernetes云平台管理实战: 最小的资源pod(二)
一.pod初体验 1.编辑k8s_pod.yml文件 [root@k8s-master ~]# cat k8s_pod.yml apiVersion: v1 kind: Pod metadata: n ...
- 【三小时学会Kubernetes!(二) 】Kubernetes 简介及Pod实践
Kubernetes 简介 我向你保证我没有夸大其词,读完本文你会问“为什么我们不称它为 Supernetes?” Kubernetes 是什么? 从容器启动微服务后,我们有一个问题,让我们通过如下问 ...
随机推荐
- Java程序设计基础笔记 • 【第6章 循环结构进阶】
全部章节 >>>> 本章目录 6.1 for循环 6.1.1 for循环的简介 6.1.2 for循环的使用 6.1.3 for循环的表达式 6.1.4 实践练习 6.2 ...
- 编写Java程序,实现控制台版的省市联动
返回本章节 返回作业目录 需求说明: 系统显示用户所有直辖市的名称,用户在控制台输入直辖市的名称,即可在控制台中显示该直辖市所管辖的所有区的名称. 实现思路: 创建省市联动类ProvincialLin ...
- C#读取注释的方法
友好的注释能提高代码的可读性,几乎所有的编程语言都支持注释. 在C#中,注释不是可执行代码的一部分,因此注释不会被编译到程序集中去,但是我们可以提取注释[右键项目]-[属性]-[生成]-[输出]-[X ...
- Location配置项及LNMP架构
目录 Location配置项及LNMP架构 Location location匹配符号 LNMP架构 UWSGI uwsgi服务部署 部署BBS项目 步骤 Location配置项及LNMP架构 Loc ...
- 目录-Bug集锦
<Bug集锦>主要是收集一些较有回顾意义的Bug以及Bug的处理思路,方便大家互相学习. 目录 BUG-Nuget包版本不一致导致程序行为与预期不符
- SpringBoot 之 国际化
增加国际化i18n语言配置: # src/main/resources/i18n/login.properties login.btn=登录 # src/main/resources/i18n/log ...
- STM32F3 GPIO的八种模式及工作原理
一.GPIO简介 GPIO(英语:General-purpose input/output),通用型之输入输出的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来 ...
- for update未提交导致锁表
select for update 是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性. 应用场景: 什么时候需要使用for update?就是那些需要业务层面数据独占时, ...
- Hive UDF,就这
摘要:Hive UDF是什么?有什么用?怎么用?什么原理?本文从UDF使用入手,简要介绍相关源码,UDF从零开始. 本文分享自华为云社区<Hive UDF,就这>,作者:汤忒撒. Hive ...
- Mybatis(万能map)
mybatis(万能map) 我们使用对象作为参数有一个缺点: 我们要在mapper.xml文件和测试中要把所有的字段都写出来,那么,假如一个对象有100个字段,那我们要把这些字段都写出来吗? 所以这 ...