南宁网站建设mxfsem,做塑料哪个网站好,163网易免费邮箱,企业管理软件价格K8s控制器Replicaset Replicaset控制器#xff1a;概念、原理解读Replicaset概述Replicaset工作原理#xff1a;如何管理PodReplicaset控制器三个组成部分 Replicaset资源清单文件编写技巧Replicaset使用案例#xff1a;部署Guestbook留言板编写一个ReplicaSet资源清单资源清… K8s控制器Replicaset Replicaset控制器概念、原理解读Replicaset概述Replicaset工作原理如何管理PodReplicaset控制器三个组成部分 Replicaset资源清单文件编写技巧Replicaset使用案例部署Guestbook留言板编写一个ReplicaSet资源清单资源清单详细说明 Replicaset管理pod扩容、缩容、更新Replicaset实现pod的动态扩容Replicaset实现pod的动态缩容Replicaset实现pod的更新 生产环境升级 Replicaset控制器概念、原理解读 我们在定义pod资源时可以直接创建一个kindPod类型的自主式pod但是这存在一个问题假如pod被删除了那这个pod就不能自我恢复就会彻底被删除线上这种情况非常危险所以今天就给大家讲解下pod的控制器所谓控制器就是能够管理pod监测pod运行状况当pod发生故障可以自动恢复pod。也就是说能够代我们去管理pod中间层并帮助我们确保每一个pod资源始终处于我们所定义或者我们所期望的目标状态一旦pod资源出现故障那么控制器会尝试重启pod或者里面的容器如果一直重启有问题的话那么它可能会基于某种策略来进行重新布派或者重新编排如果pod副本数量低于用户所定义的目标数量它也会自动补全如果多余也会自动终止pod资源。 Replicaset概述 ReplicaSet是kubernetes中的一种副本控制器简称rs主要作用是控制由其管理的pod使pod副本的数量始终维持在预设的个数。它的主要作用就是保证一定数量的Pod能够在集群中正常运行它会持续监听这些Pod的运行状态在Pod发生故障时重启podpod数量减少时重新运行新的 Pod副本。官方推荐不要直接使用ReplicaSet用Deployments取而代之Deployments是比ReplicaSet更高级的概念它会管理ReplicaSet并提供很多其它有用的特性最重要的是Deployments支持声明式更新声明式更新的好处是不会丢失历史变更。所以Deployment控制器不直接管理Pod对象而是由 Deployment 管理ReplicaSet再由ReplicaSet负责管理Pod对象。 Replicaset工作原理如何管理Pod Replicaset核心作用在于代用户创建指定数量的pod副本并确保pod副本一直处于满足用户期望的数量 起到多退少补的作用并且还具有自动扩容缩容等机制。 Replicaset控制器三个组成部分
用户期望的pod副本数用来定义由这个控制器管控的pod副本有几个标签选择器选定哪些pod是自己管理的如果通过标签选择器选到的pod副本数量少于我们指定的数量需要用到下面的组件pod资源模板如果集群中现存的pod数量不够我们定义的副本中期望的数量怎么办需要新建pod这就需要pod模板新建的pod是基于模板来创建的。
Replicaset资源清单文件编写技巧 查看定义Replicaset资源需要的字段有哪些 kubectl explain rsKIND: ReplicaSet
VERSION: apps/v1
DESCRIPTION:ReplicaSet ensures that a specified number of pod replicas are running atany given time.
FIELDS:apiVersion string #当前资源使用的api版本跟VERSION: apps/v1保持一致kind string #资源类型跟KIND: ReplicaSet保持一致metadata Object #元数据定义Replicaset名字的spec Object ##定义副本数、定义标签选择器、定义Pod模板status Object #状态信息不能改查看replicaset的spec字段如何定义 kubectl explain rs.specKIND: ReplicaSet
VERSION: apps/v1
RESOURCE: spec Object
DESCRIPTION:Spec defines the specification of the desired behavior of the ReplicaSet.More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-statusReplicaSetSpec is the specification of a ReplicaSet.
FIELDS:minReadySeconds integerreplicas integer #定义的pod副本数根据我们指定的值创建对应数量的podselector Object -required- #用于匹配pod的标签选择器template Object #定义Pod的模板基于这个模板定义的所有pod是一样的查看replicaset的spec.template字段如何定义 对于template而言其内部定义的就是podpod模板是一个独立的对象 kubectl explain rs.spec.template通过上面可以看到ReplicaSet资源中有两个spec字段。第一个spec声明的是ReplicaSet定义多少个Pod副本默认将仅部署1个Pod、匹配Pod标签的选择器、创建pod的模板。第二个spec是spec.template.spec主要用于Pod里的容器属性等配置。 .spec.template里的内容是声明Pod对象时要定义的各种属性所以这部分也叫做PodTemplatePod模板。还有一个值得注意的地方是在.spec.selector中定义的标签选择器必须能够匹配到spec.template.metadata.labels里定义的Pod标签否则Kubernetes将不允许创建ReplicaSet。 Replicaset使用案例部署Guestbook留言板 把frontend.tar.gz上传到节点服务器上 链接https://pan.baidu.com/s/1yz4mpX3EilhgKyYbMXgM0Q?pwdzk9n 提取码zk9n ctr -nk8s.io images import frontend.tar.gz编写一个ReplicaSet资源清单
cat replicaset.yaml apiVersion: apps/v1
kind: ReplicaSet
metadata:name: frontendnamespace: defaultlabels:app: guestbooktier: frontend
spec:replicas: 3selector:matchLabels:tier1: frontend1template:metadata: labels: tier1: frontend1spec:containers:- name: php-redisimage: docker.io/yecc/gcr.io-google_samples-gb-frontend:v3imagePullPolicy: IfNotPresentports:- containerPort: 80startupProbe:periodSeconds: 5initialDelaySeconds: 20timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /livenessProbe:periodSeconds: 5initialDelaySeconds: 20timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /readinessProbe:periodSeconds: 5initialDelaySeconds: 20timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /kubectl apply -f replicaset.yaml kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend 3 3 3 53mkubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-82p9b 1/1 Running 0 36m
frontend-j6twz 1/1 Running 0 36m
frontend-lcnq6 1/1 Running 0 36mpod的名字是由控制器的名字-随机数组成的 资源清单详细说明
apiVersion: apps/v1 #ReplicaSet 这个控制器属于的核心群组
kind: ReplicaSet #创建的资源类型
metadata:name: frontend #控制器的名字labels:app: guestbooktier: frontend
spec:replicas: 3 #管理的pod副本数量selector:matchLabels:tier1: frontend1 #管理带有tierfrontend标签的podtemplate: #定义pod的模板metadata:labels:tier1: frontend 1
#pod标签一定要有这样上面控制器就能找到它要管理的pod是哪些了spec:containers: #定义pod里运行的容器- name: php-redis #定义容器的名字image: yecc/gcr.io-google_samples-gb-frontend:v3ports: #定义端口
- name: http #定义容器的名字
containerPort: 80 #定义容器暴露的端口Replicaset管理pod扩容、缩容、更新
Replicaset实现pod的动态扩容 ReplicaSet最核心的功能是可以动态扩容和回缩如果我们觉得两个副本太少了想要增加只需要修改配置文件replicaset.yaml里的replicas的值即可原来replicas: 3现在变成replicaset: 4修改之后执行如下命令更新 kubectl apply -f replicaset.yaml kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend 4 4 4 62mkubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-82p9b 1/1 Running 0 62m
frontend-j6twz 1/1 Running 0 62m
frontend-kzjm7 1/1 Running 0 33s
frontend-lcnq6 1/1 Running 0 62mReplicaset实现pod的动态缩容 如果我们觉得5个Pod副本太多了想要减少只需要修改配置文件replicaset.yaml里的replicas的值即可把replicaset4变成replicas: 2修改之后执行如下命令更新 kubectl apply -f replicaset.yaml kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend 2 2 2 70m kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-j6twz 1/1 Running 0 70m
frontend-lcnq6 1/1 Running 0 70mReplicaset实现pod的更新 把myapp-v2.tar.gz上传到节点服务器 链接https://pan.baidu.com/s/1RsBdDrhSkR5kZAxbDznlXw?pwdop8h 提取码op8h ctr -nk8s.io images import myapp-v2.tar.gz修改镜像变成ikubernetes/myapp:v2 vim replicaset.yamlkubectl apply -f replicaset.yamlkubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
frontend-glb2c 1/1 Running 0 34s 10.244.209.133 k8s1
frontend-lck9t 1/1 Running 0 34s 10.244.187.74 k8s2 curl 10.244.209.133
div stylewidth: 50%; margin-left: 20pxh2Guestbook/h2curl 10.244.209.74
div stylewidth: 50%; margin-left: 20pxh2Guestbook/h2上面可以看到虽然replicaset.yaml修改了镜像执行了kubectl apply -f replicaset.yaml但是pod还是用的frontend:v3这个镜像没有实现自动更新 10.244.209.133这个ip对应的pod删除 kubectl delete pods frontend-glb2ckubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE
frontend-hkhdw 1/1 Running 0 15s 10.244.187.75 k8s2
frontend-lck9t 1/1 Running 0 2m37s 10.244.187.74 k8s2 重新生成了一个新的podfrontend-hkhdw curl 10.244.187.75
Hello MyApp | Version: v2 | a hrefhostname.htmlPod Name/a新生成的pod的镜像已经变成了myapp的说明更新完成了 生产环境升级 生产环境如果升级可以删除一个pod观察一段时间之后没问题再删除另一个pod但是这样需要人工干预多次实际生产环境一般采用蓝绿发布原来有一个rs1再创建一个rs2控制器通过修改service标签修改service可以匹配到rs2的控制器这样才是蓝绿发布这个也需要我们精心的部署规划我们有一个控制器就是建立在rs之上完成的叫做Deployment