java系统找不到指定文件怎么解决
240
2022-09-11
(六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet
Pod控制器相关知识
控制器的必要性
自主式Pod对象由调度器调度到目标工作节点后即由相应节点上的kubelet负责监控其容器的存活状态,容器主进程崩溃后,kubelet能够自动重启相应的容器。但对出现非主进程崩溃类的容器错误却无从感知,这便依赖于pod资源对象定义的存活探测,以便kubelet能够探知到此类故障。但若pod被删除或者工作节点自身发生故障(工作节点上都有kubelet,kubelet不可用,因此其健康状态便无法保证),则便需要控制器来处理相应的容器重启和配置。
常见的工作负载控制器
Pod控制器概述
Kubernetes的核心功能之一还在于要确保各资源对象的当前状态(status)以匹配用户期望的状态(spec),使当前状态不断地向期望状态“和解”(reconciliation)来完成容器应用管理。而这些则是kube-controller-manager的任务。创建为具体的控制器对象之后,每个控制器均通过API Server提供的接口持续监控相关资源对象的当前状态,并在因故障、更新或其他原因导致系统状态发生变化时,尝试让资源的当前状态想期望状态迁移和逼近。List-Watch是kubernetes实现的核心机制之一,在资源对象的状态发生变动时,由API Server负责写入etcd并通过水平触发(level-triggered)机制主动通知给相关的客户端程序以确保其不会错过任何一个事件。控制器通过API Server的watch接口实时监控目标资源对象的变动并执行和解操作,但并不会与其他控制器进行任何交互。
Pod和Pod控制器
Pod控制器资源通过持续性地监控集群中运行着的Pod资源对象来确保受其管控的资源严格符合用户期望的状态,例如资源副本的数量要精确符合期望等。通常,一个Pod控制器资源至少应该包含三个基本的组成部分:标签选择器:匹配并关联Pod资源对象,并据此完成受其管控的Pod资源计数。期望的副本数:期望在集群中精确运行着的Pod资源的对象数量。Pod模板:用于新建Pod资源对象的Pod模板资源。
ReplicaSet控制器
ReplicaSet概述
ReplicaSet是取代早期版本中的ReplicationController控制器,其功能基本上与ReplicationController相同ReplicaSet(简称RS)是Pod控制器类型的一种实现,用于确保由其管控的Pod对象副本数在任意时刻都能精确满足期望的数量。ReplicaSet控制器资源启动后会查找集群中匹配器标签选择器的Pod资源对象,当前活动对象的数量与期望的数量不吻合时,多则删除,少则通过Pod模板创建以补足。ReplicaSet能够实现以下功能:确保Pod资源对象的数量精确反映期望值:ReplicaSet需要确保由其控制运行的Pod副本数量精确吻合配置中定义的期望值,否则就会自动补足所缺或终止所余。确保Pod健康运行:探测到由其管控的Pod对象因其所在的工作节点故障而不可用时,自动请求由调度器于其他工作节点创建缺失的Pod副本。弹性伸缩:可通过ReplicaSet控制器动态扩容或者缩容Pod资源对象的数量。必要时还可以通过HPA控制器实现Pod资源规模的自动伸缩。
创建ReplicaSet
核心字段
spec字段一般嵌套使用以下几个属性字段:replicas
ReplicaSet示例
#(1)命令行查看ReplicaSet清单定义规则[root@k8s-master ~]# kubectl explain rs[root@k8s-master ~]# kubectl explain rs.spec[root@k8s-master ~]# kubectl explain rs.spec.template#(2)创建ReplicaSet示例[root@k8s-master ~]# vim manfests/rs-demo.yamlapiVersion: apps/v1 #api版本定义kind: ReplicaSet #定义资源类型为ReplicaSetmetadata: #元数据定义 name: myapp namespace: defaultspec: #ReplicaSet的规格定义 replicas: 2 #定义副本数量为2个 selector: #标签选择器,定义匹配Pod的标签 matchLabels: app: myapp release: canary template: #Pod的模板定义 metadata: #Pod的元数据定义 name: myapp-pod #自定义Pod的名称 labels: #定义Pod的标签,需要和上面的标签选择器内匹配规则中定义的标签一致,可以多出其他标签 app: myapp release: canary spec: #Pod的规格定义 containers: #容器定义 - name: myapp-containers #容器名称 image: ikubernetes/myapp:v1 #容器镜像 imagePullPolicy: IfNotPresent #拉取镜像的规则 ports: #暴露端口 - name: #端口名称 containerPort: 80 #(3)创建ReplicaSet定义的Pod[root@k8s-master ~]# kubectl apply -f manfests/rs-demo.yamlreplicaset.apps/myapp created[root@k8s-master ~]# kubectl get rs #查看创建的ReplicaSet控制器NAME DESIRED CURRENT READY AGEmyapp 4 4 4 3m23s[root@k8s-master ~]# kubectl get pods #通过查看pod可以看出pod命令是规则是前面是replicaset控制器的名称加随机生成的字符串NAME READY STATUS RESTARTS AGEmyapp-bln4v 1/1 Running 0 6smyapp-bxpzt 1/1 Running 0 6s#(4)修改Pod的副本数量[root@k8s-master ~]# kubectl edit rs myapp replicas: 4[root@k8s-master ~]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTORmyapp 4 4 4 2m50s myapp-containers ikubernetes/myapp:v2 app=myapp,release=canary[root@k8s-master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSmyapp-8hkcr 1/1 Running 0 2m2s app=myapp,release=canarymyapp-bln4v 1/1 Running 0 3m40s app=myapp,release=canarymyapp-bxpzt 1/1 Running 0 3m40s app=myapp,release=canarymyapp-ql2wk 1/1 Running 0 2m2s app=myapp,release=canary
更新ReplicaSet控制器
修改Pod模板:升级应用
修改上面创建的replicaset示例文件,将镜像ikubernetes/myapp:v1改为v2版本
[root@k8s-master ~]# vim manfests/rs-demo.yaml spec: #Pod的规格定义 containers: #容器定义 - name: myapp-containers #容器名称 image: ikubernetes/myapp:v2 #容器镜像 imagePullPolicy: IfNotPresent #拉取镜像的规则 ports: #暴露端口 - name: #端口名称 containerPort: 80[root@k8s-master ~]# kubectl apply -f manfests/rs-demo.yaml #执行apply让其重载[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].imageName Imagemyapp-bln4v ikubernetes/myapp:v1myapp-bxpzt ikubernetes/myapp:v1#说明:这里虽然重载了,但是已有的pod所使用的镜像仍然是v1版本的,只是新建pod时才会使用v2版本,这里测试先手动删除已有的pod。[root@k8s-master ~]# kubectl delete pods -l app=myapp #删除标签app=myapp的pod资源pod "myapp-bln4v" deletedpod "myapp-bxpzt" deleted[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image #再次查看通过ReplicaSet新建的pod资源对象。镜像已使用v2版本Name Imagemyapp-mdn8j ikubernetes/myapp:v2myapp-v5bgr ikubernetes/myapp:v2
扩容和缩容
可以直接通过vim 编辑清单文件修改replicas字段,也可以通过kubect edit 命令去编辑。kubectl还提供了一个专用的子命令scale用于实现应用规模的伸缩,支持从资源清单文件中获取新的目标副本数量,也可以直接在命令行通过“--replicas”选项进行读取。
[root@k8s-master ~]# kubectl get rs #查看ReplicaSetNAME DESIRED CURRENT READY AGEmyapp 2 2 2 154m[root@k8s-master ~]# kubectl get pods #查看PodNAME READY STATUS RESTARTS AGEmyapp-mdn8j 1/1 Running 0 5m26smyapp-v5bgr 1/1 Running 0 5m26s#扩容[root@k8s-master ~]# kubectl scale replicasets myapp --replicas=5 #将上面的Deployments控制器myapp的Pod副本数量提升为5个replicaset.extensions/myapp scaled[root@k8s-master ~]# kubectl get rs #查看ReplicaSetNAME DESIRED CURRENT READY AGEmyapp 5 5 5 156m[root@k8s-master ~]# kubectl get pods #查看PodNAME READY STATUS RESTARTS AGEmyapp-lrrp8 1/1 Running 0 8smyapp-mbqf8 1/1 Running 0 8smyapp-mdn8j 1/1 Running 0 6m48smyapp-ttmf5 1/1 Running 0 8smyapp-v5bgr 1/1 Running 0 6m48s#收缩[root@k8s-master ~]# kubectl scale replicasets myapp --replicas=3replicaset.extensions/myapp scaled[root@k8s-master ~]# kubectl get rsNAME DESIRED CURRENT READY AGEmyapp 3 3 3 159m[root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGEmyapp-mdn8j 1/1 Running 0 10mmyapp-ttmf5 1/1 Running 0 3m48smyapp-v5bgr 1/1 Running 0 10m
删除ReplicaSet控制器资源
使用Kubectl delete命令删除ReplicaSet对象时默认会一并删除其管控的各Pod对象,有时,考虑到这些Pod资源未必由其创建,或者即便由其创建也并非自身的组成部分,这时候可以添加“--cascade=false”选项,取消级联关系。
[root@k8s-master ~]# kubectl get rsNAME DESIRED CURRENT READY AGEmyapp 3 3 3 162m[root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGEmyapp-mdn8j 1/1 Running 0 12mmyapp-ttmf5 1/1 Running 0 6m18smyapp-v5bgr 1/1 Running 0 12m[root@k8s-master ~]# kubectl delete replicasets myapp --cascade=falsereplicaset.extensions "myapp" deleted[root@k8s-master ~]# kubectl get rsNo resources found.[root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGEmyapp-mdn8j 1/1 Running 0 13mmyapp-ttmf5 1/1 Running 0 7mmyapp-v5bgr 1/1 Running 0 13m#通过上面的示例可以看出,添加--cascade=false参数后再删除ReplicaSet资源对象时并没有将其管控的Pod资源对象一并删除。
Deployment控制器
Deployment概述
创建Deployment
Deployment其核心资源和ReplicaSet相似
#(1)命令行查看ReplicaSet清单定义规则[root@k8s-master ~]# kubectl explain deployment[root@k8s-master ~]# kubectl explain deployment.spec[root@k8s-master ~]# kubectl explain deployment.spec.template#(2)创建Deployment示例[root@k8s-master ~]# vim manfests/deploy-demo.yamlapiVersion: apps/v1 #api版本定义kind: Deployment #定义资源类型为Deploymantmetadata: #元数据定义 name: deploy-demo #deployment控制器名称 namespace: default #名称空间spec: #deployment控制器的规格定义 replicas: 2 #定义副本数量为2个 selector: #标签选择器,定义匹配Pod的标签 matchLabels: app: deploy-app release: canary template: #Pod的模板定义 metadata: #Pod的元数据定义 labels: #定义Pod的标签,需要和上面的标签选择器内匹配规则中定义的标签一致,可以多出其他标签 app: deploy-app release: canary spec: #Pod的规格定义 containers: #容器定义 - name: myapp #容器名称 image: ikubernetes/myapp:v1 #容器镜像 ports: #暴露端口 - name: #端口名称 containerPort: 80#(3)创建Deployment对象[root@k8s-master ~]# kubectl apply -f manfests/deploy-demo.yaml deployment.apps/deploy-demo created#(4)查看资源对象[root@k8s-master ~]# kubectl get deployment #查看Deployment资源对象NAME READY UP-TO-DATE AVAILABLE AGEdeploy-demo 2/2 2 2 10s[root@k8s-master ~]# kubectl get replicaset #查看ReplicaSet资源对象NAME DESIRED CURRENT READY AGEdeploy-demo-78c84d4449 2 2 2 20s[root@k8s-master ~]# kubectl get pods #查看Pod资源对象NAME READY STATUS RESTARTS AGEdeploy-demo-78c84d4449-22btc 1/1 Running 0 23sdeploy-demo-78c84d4449-5fn2k 1/1 Running 0 23s---说明:通过查看资源对象可以看出,Deployment会自动创建相关的ReplicaSet控制器资源,并以"[DEPLOYMENT-name]-[POD-TEMPLATE-HASH-VALUE]"格式为其命名,其中的hash值由Deployment自动生成。而Pod名则是以ReplicaSet控制器的名称为前缀,后跟5位随机字符。
更新策略
ReplicaSet控制器的应用更新需要手动分成多步并以特定的次序进行,过程繁杂且容易出错,而Deployment却只需要由用户指定在Pod模板中要改动的内容,(如镜像文件的版本),余下的步骤便会由其自动完成。Pod副本数量也是一样。Deployment控制器支持两种更新策略:滚动更新(rollingUpdate)和重建创新(Recreate),默认为滚动更新滚动更新(rollingUpdate):即在删除一部分旧版本Pod资源的同时,补充创建一部分新版本的Pod对象进行应用升级,其优势是升级期间,容器中应用提供的服务不会中断,但更新期间,不同客户端得到的相应内容可能会来自不同版本的应用。重新创建(Recreate):即首先删除现有的Pod对象,而后由控制器基于新模板重行创建出新版本的资源对象。
Deployment控制器的滚动更新操作并非在同一个ReplicaSet控制器对象下删除并创建Pod资源,新控制器的Pod对象数量不断增加,直到旧控制器不再拥有Pod对象,而新控制器的副本数量变得完全符合期望值为止。如图所示
滚动更新时,应用还要确保可用的Pod对象数量不低于某阀值以确保可以持续处理客户端的服务请求,变动的方式和Pod对象的数量范围将通过kubectl explain deployment.spec.strategy.rollingUpdate.maxSurge和kubectl explain deployment.spec.strategy.rollingUpdate.maxUnavailable两个属性同时进行定义。其功能如下:
maxSurge:指定升级期间存在的总Pod对象数量最多可超出期望值的个数,其值可以是0或正整数,也可以是一个期望值的百分比;例如,如果期望值为3,当前的属性值为1,则表示Pod对象的总数不能超过4个。maxUnavailable:升级期间正常可用的Pod副本数(包括新旧版本)最多不能低于期望值的个数,其值可以是0或正整数,也可以是期望值的百分比;默认值为1,该值意味着如果期望值是3,则升级期间至少要有两个Pod对象处于正常提供服务的状态。
maxSurge和maxUnavailable属性的值不可同时为0,否则Pod对象的副本数量在符合用户期望的数量后无法做出合理变动以进行滚动更新操作。
Deployment控制器可以保留其更新历史中的旧ReplicaSet对象版本,所保存的历史版本数量由kubectl explain deployment.spec.revisionHistoryLimit参数指定。只有保存于revision历史中的ReplicaSet版本可用于回滚。注:为了保存版本升级的历史,需要在创建Deployment对象时于命令中使用“--record”选项。
Deployment更新升级
1)首先通过set image命令将上面创建的Deployment对象的镜像版本改为v2版本
#打开1个终端进行升级[root@k8s-master ~]# kubectl set image deployment/deploy-demo myapp=ikubernetes/myapp:v2 deployment.extensions/deploy-demo image updated#同时打开终端2进行查看pod资源对象升级过程[root@k8s-master ~]# kubectl get pods -l app=deploy-app -wNAME READY STATUS RESTARTS AGEdeploy-demo-78c84d4449-2rvxr 1/1 Running 0 33sdeploy-demo-78c84d4449-nd7rr 1/1 Running 0 33sdeploy-demo-7c66dbf45b-7k4xz 0/1 Pending 0 0sdeploy-demo-7c66dbf45b-7k4xz 0/1 Pending 0 0sdeploy-demo-7c66dbf45b-7k4xz 0/1 ContainerCreating 0 0sdeploy-demo-7c66dbf45b-7k4xz 1/1 Running 0 2sdeploy-demo-78c84d4449-2rvxr 1/1 Terminating 0 49sdeploy-demo-7c66dbf45b-r88qr 0/1 Pending 0 0sdeploy-demo-7c66dbf45b-r88qr 0/1 Pending 0 0sdeploy-demo-7c66dbf45b-r88qr 0/1 ContainerCreating 0 0sdeploy-demo-7c66dbf45b-r88qr 1/1 Running 0 1sdeploy-demo-78c84d4449-2rvxr 0/1 Terminating 0 50sdeploy-demo-78c84d4449-nd7rr 1/1 Terminating 0 51sdeploy-demo-78c84d4449-nd7rr 0/1 Terminating 0 51sdeploy-demo-78c84d4449-nd7rr 0/1 Terminating 0 57sdeploy-demo-78c84d4449-nd7rr 0/1 Terminating 0 57sdeploy-demo-78c84d4449-2rvxr 0/1 Terminating 0 60sdeploy-demo-78c84d4449-2rvxr 0/1 Terminating 0 60s#同时打开终端3进行查看pod资源对象变更过程[root@k8s-master ~]# kubectl get deployment deploy-demo -w NAME READY UP-TO-DATE AVAILABLE AGEdeploy-demo 2/2 2 2 37sdeploy-demo 2/2 2 2 47sdeploy-demo 2/2 2 2 47sdeploy-demo 2/2 0 2 47sdeploy-demo 2/2 1 2 47sdeploy-demo 3/2 1 3 49sdeploy-demo 2/2 1 2 49sdeploy-demo 2/2 2 2 49sdeploy-demo 3/2 2 3 50sdeploy-demo 2/2 2 2 51s# 升级完成再次查看rs的情况,以下可以看到原的rs作为备份,而现在启动的是新的rs[root@k8s-master ~]# kubectl get rs NAME DESIRED CURRENT READY AGEdeploy-demo-78c84d4449 0 0 0 4m41sdeploy-demo-7c66dbf45b 2 2 2 3m54s
2)Deployment扩容
#1、使用kubectl scale命令扩容[root@k8s-master ~]# kubectl scale deployment deploy-demo --replicas=3deployment.extensions/deploy-demo scaled[root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGEdeploy-demo-7c66dbf45b-7k4xz 1/1 Running 0 10mdeploy-demo-7c66dbf45b-gq2tw 1/1 Running 0 3sdeploy-demo-7c66dbf45b-r88qr 1/1 Running 0 10m#2、使用直接修改配置清单方式进行扩容[root@k8s-master ~]# vim manfests/deploy-demo.yaml spec: #deployment控制器的规格定义 replicas: 4 #定义副本数量为2个[root@k8s-master ~]# kubectl apply -f manfests/deploy-demo.yaml deployment.apps/deploy-demo configured[root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGEdeploy-demo-78c84d4449-6rmnm 1/1 Running 0 61sdeploy-demo-78c84d4449-9xfp9 1/1 Running 0 58sdeploy-demo-78c84d4449-c2m6h 1/1 Running 0 61sdeploy-demo-78c84d4449-sfxps 1/1 Running 0 57s#3、使用kubectl patch打补丁的方式进行扩容[root@k8s-master ~]# kubectl patch deployment deploy-demo -p '{"spec":{"replicas":5}}'deployment.extensions/deploy-demo patched[root@k8s-master ~]# [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGEdeploy-demo-78c84d4449-6rmnm 1/1 Running 0 3m44sdeploy-demo-78c84d4449-9xfp9 1/1 Running 0 3m41sdeploy-demo-78c84d4449-c2m6h 1/1 Running 0 3m44sdeploy-demo-78c84d4449-sfxps 1/1 Running 0 3m40sdeploy-demo-78c84d4449-t7jxb 1/1 Running 0 3s
金丝雀发布
采用先添加再删除的方式,且可用Pod资源对象总数不低于期望值的方式进行,配置如下:
1)添加其总数多余期望值一个
[root@k8s-master ~]# kubectl patch deployment deploy-demo -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'deployment.extensions/deploy-demo patched
2)启动更新过程,在修改相应容器的镜像版本后立即暂停更新进度。
[root@k8s-master ~]# kubectl set image deployment/deploy-demo myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment deploy-demo deployment.extensions/deploy-demo image updateddeployment.extensions/deploy-demo paused#查看[root@k8s-master ~]# kubectl get deployment #查看deployment资源对象NAME READY UP-TO-DATE AVAILABLE AGEdeploy-demo 6/5 1 6 37m[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image #查看pod资源对象的name和imageName Imagedeploy-demo-6bf8dbdc9f-fjnzn ikubernetes/myapp:v3deploy-demo-78c84d4449-6rmnm ikubernetes/myapp:v1deploy-demo-78c84d4449-9xfp9 ikubernetes/myapp:v1deploy-demo-78c84d4449-c2m6h ikubernetes/myapp:v1deploy-demo-78c84d4449-sfxps ikubernetes/myapp:v1deploy-demo-78c84d4449-t7jxb ikubernetes/myapp:v1[root@k8s-master ~]# kubectl rollout status deployment/deploy-demo #查看更新情况Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...---#通过上面查看可以看出,当前的pod数量为6个,因为此前我们定义的期望值为5个,这里多出了一个,且这个镜像版本为v3版本。#全部更新[root@k8s-master ~]# kubectl rollout resume deployment deploy-demodeployment.extensions/deploy-demo resumed#再次查看[root@k8s-master ~]# kubectl get deployment #查看deployment资源对象NAME READY UP-TO-DATE AVAILABLE AGEdeploy-demo 5/5 5 5 43m[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image #查看pod资源对象的name和imageName Imagedeploy-demo-6bf8dbdc9f-2z6gt ikubernetes/myapp:v3deploy-demo-6bf8dbdc9f-f79q2 ikubernetes/myapp:v3deploy-demo-6bf8dbdc9f-fjnzn ikubernetes/myapp:v3deploy-demo-6bf8dbdc9f-pjf4z ikubernetes/myapp:v3deploy-demo-6bf8dbdc9f-x7fnk ikubernetes/myapp:v3[root@k8s-master ~]# kubectl rollout status deployment/deploy-demo #查看更新情况Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...Waiting for deployment spec update to be observed...Waiting for deployment spec update to be observed...Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 2 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 2 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 2 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 3 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 3 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 3 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 4 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 4 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 4 out of 5 new replicas have been updated...Waiting for deployment "deploy-demo" rollout to finish: 1 old replicas are pending termination...Waiting for deployment "deploy-demo" rollout to finish: 1 old replicas are pending termination...deployment "deploy-demo" successfully rolled out
回滚Deployment控制器下的应用发布
若因各种原因导致滚动更新无法正常进行,如镜像文件获取失败,等等;则应该将应用回滚到之前的版本,或者回滚到指定的历史记录中的版本。则通过kubectl rollout undo命令完成。如果回滚到指定版本则需要添加--to-revision选项
1)回到上一个版本
[root@k8s-master ~]# kubectl rollout undo deployment/deploy-demodeployment.extensions/deploy-demo rolled back[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].imageName Imagedeploy-demo-78c84d4449-2xspz ikubernetes/myapp:v1deploy-demo-78c84d4449-f8p46 ikubernetes/myapp:v1deploy-demo-78c84d4449-mnmvc ikubernetes/myapp:v1deploy-demo-78c84d4449-tsl7r ikubernetes/myapp:v1deploy-demo-78c84d4449-xdt8j ikubernetes/myapp:v1
2)回滚到指定版本
#通过该命令查看更新历史记录[root@k8s-master ~]# kubectl rollout history deployment/deploy-demodeployment.extensions/deploy-demo REVISION CHANGE-CAUSE2
DaemonSet控制器
DaemonSet概述
DaemonSet用于在集群中的全部节点上同时运行一份指定Pod资源副本,后续新加入集群的工作节点也会自动创建一个相关的Pod对象,当从集群移除借点时,此类Pod对象也将被自动回收而无需重建。管理员也可以使用节点选择器及节点标签指定仅在具有特定特征的节点上运行指定的Pod对象。
应用场景
运行集群存储的守护进程,如在各个节点上运行glusterd或ceph。在各个节点上运行日志收集守护进程,如fluentd和logstash。在各个节点上运行监控系统的代理守护进程,如Prometheus Node Exporter、collectd、Datadog agent、New Relic agent和Ganglia gmond等。
创建DaemonSet
DaemonSet控制器的spec字段中嵌套使用的相同字段selector、template和minReadySeconds,并且功能和用法基本相同,但它不支持replicas,因为毕竟不能通过期望值来确定Pod资源的数量,而是基于节点数量。
这里使用nginx来示例,生产环境就比如使用上面提到的logstash等。
#(1) 定义清单文件[root@k8s-master ~]# vim manfests/daemonset-demo.yamlapiVersion: apps/v1 #api版本定义kind: DaemonSet #定义资源类型为DaemonSetmetadata: #元数据定义 name: daemset-nginx #daemonset控制器名称 namespace: default #名称空间 labels: #设置daemonset的标签 app: daem-nginx spec: #DaemonSet控制器的规格定义 selector: #指定匹配pod的标签 matchLabels: #指定匹配pod的标签 app: daem-nginx #注意:这里需要和template中定义的标签一样 template: #Pod的模板定义 metadata: #Pod的元数据定义 name: nginx labels: #定义Pod的标签,需要和上面的标签选择器内匹配规则中定义的标签一致,可以多出其他标签 app: daem-nginx spec: #Pod的规格定义 containers: #容器定义 - name: nginx-pod #容器名字 image: nginx:1.12 #容器镜像 ports: #暴露端口 - name: #端口名称 containerPort: 80 #暴露的端口#(2)创建上面定义的daemonset控制器[root@k8s-master ~]# kubectl apply -f manfests/daemonset-demo.yaml daemonset.apps/daemset-nginx created#(3)查看验证[root@k8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESdaemset-nginx-7s474 1/1 Running 0 80s 10.244.1.61 k8s-node1
通过上面验证查看,Node-Selector字段的值为空,表示它需要运行在集群中的每个节点之上。而当前的节点数是2个,所以其期望的Pod副本数(Desired Number of Nodes Scheduled)为2,而当前也已经创建了2个相关的Pod对象。
注意
对于特殊的硬件的节点来说,可能有的运行程序只需要在某一些节点上运行,那么通过Pod模板的spec字段中嵌套使用nodeSelector字段,并确保其值定义的标签选择器与部分特定工作节点的标签匹配即可。
更新DaemonSet对象
DaemonSet自Kubernetes1.6版本起也开始支持更新机制,相关配置嵌套在kubectl explain daemonset.spec.updateStrategy字段中。其支持RollingUpdate(滚动更新)和OnDelete(删除时更新)两种策略,滚动更新为默认的更新策略。
#(1)查看镜像版本[root@k8s-master ~]# kubectl get pods -l app=daem-nginx -o custom-columns=NAME:metadata.name,NODE:spec.nodeName,Image:spec.containers[0].imageNAME NODE Imagedaemset-nginx-7s474 k8s-node1 nginx:1.12daemset-nginx-kxpl2 k8s-node2 nginx:1.12#(2)更新[root@k8s-master ~]# kubectl set image daemonset/daemset-nginx nginx-pod=nginx:1.14[root@k8s-master ~]# kubectl get pods -l app=daem-nginx -o custom-columns=NAME:metadata.name,NODE:spec.nodeName,Image:spec.containers[0].image #再次查看NAME NODE Imagedaemset-nginx-74c95 k8s-node2 nginx:1.14daemset-nginx-nz6n9 k8s-node1 nginx:1.14#(3)查坎详细信息[root@k8s-master ~]# kubectl describe daemonset daemset-nginx......Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 49m daemonset-controller Created pod: daemset-nginx-6kzg6 Normal SuccessfulCreate 49m daemonset-controller Created pod: daemset-nginx-jjnc2 Normal SuccessfulDelete 40m daemonset-controller Deleted pod: daemset-nginx-jjnc2 Normal SuccessfulCreate 40m daemonset-controller Created pod: daemset-nginx-kxpl2 Normal SuccessfulDelete 40m daemonset-controller Deleted pod: daemset-nginx-6kzg6 Normal SuccessfulCreate 40m daemonset-controller Created pod: daemset-nginx-7s474 Normal SuccessfulDelete 15s daemonset-controller Deleted pod: daemset-nginx-7s474 Normal SuccessfulCreate 8s daemonset-controller Created pod: daemset-nginx-nz6n9 Normal SuccessfulDelete 5s daemonset-controller Deleted pod: daemset-nginx-kxpl2
通过上面查看可以看出,默认的滚动更新策略是一次删除一个工作节点上的Pod资源,待其最新版本Pod重建完成后再开始操作另一个工作节点上的Pod资源。DaemonSet控制器的滚动更新机制也可以借助于minReadySeconds字段控制滚动节奏;必要时也可以执行暂停和继续操作。其也可以进行回滚操作。
]
人生是条无名的河,是浅是深都要过; 人生是杯无色的茶,是苦是甜都要喝; 人生是首无畏的歌,是高是低都要唱。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~