日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

k8s之ReplicaSet

發布時間:2024/3/7 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 k8s之ReplicaSet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們在定義pod資源時,可以直接創建一個kind:Pod類型的自主式pod,但是這存在一個問題,假如pod被刪除了,那這個pod就不能自我恢復,就會徹底被刪除,線上這種情況非常危險,所以今天就給大家講解下pod的控制器,所謂控制器就是能夠管理pod,監測pod運行狀況,當pod發生故障,可以自動恢復pod。也就是說能夠代我們去管理pod中間層,并幫助我們確保每一個pod資源始終處于我們所定義或者我們所期望的目標狀態,一旦pod資源出現故障,那么控制器會嘗試重啟pod或者里面的容器,如果一直重啟有問題的話那么它可能會基于某種策略來進行重新布派或者重新編排;如果pod副本數量低于用戶所定義的目標數量,它也會自動補全;如果多余,也會自動終止pod資源。

1、Replicaset控制器:概念、原理解讀

1.1 Replicaset概述

ReplicaSet是kubernetes中的一種副本控制器,簡稱rs,主要作用是控制由其管理的pod,使pod副本的數量始終維持在預設的個數。它的主要作用就是保證一定數量的Pod能夠在集群中正常運行,它會持續監聽這些Pod的運行狀態,在Pod發生故障時重啟pod,pod數量減少時重新運行新的 Pod副本。官方推薦不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高級的概念,它會管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持聲明式更新,聲明式更新的好處是不會丟失歷史變更。所以Deployment控制器不直接管理Pod對象,而是由 Deployment 管理ReplicaSet,再由ReplicaSet負責管理Pod對象。

1.2 Replicaset工作原理:如何管理Pod?

Replicaset核心作用在于代用戶創建指定數量的pod副本,并確保pod副本一直處于滿足用戶期望的數量, 起到多退少補的作用,并且還具有自動擴容縮容等機制。

Replicaset控制器主要由三個部分組成:

  • 1、用戶期望的pod副本數:用來定義由這個控制器管控的pod副本有幾個

  • 2、標簽選擇器:選定哪些pod是自己管理的,如果通過標簽選擇器選到的pod副本數量少于我們指定的數量,需要用到下面的組件

  • 3、pod資源模板:如果集群中現存的pod數量不夠我們定義的副本中期望的數量怎么辦,需要新建pod,這就需要pod模板,新建的pod是基于模板來創建的。

2、 Replicaset資源清單文件編寫技巧

#查看定義Replicaset資源需要的字段有哪些?

[root@master1 ~]# kubectl explain rs KIND: 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字段如何定義?

[root@master1 ~]# kubectl explain rs.spec KIND: 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 <integer>replicas <integer> #定義的pod副本數,根據我們指定的值創建對應數量的podselector <Object> -required- #用于匹配pod的標簽選擇器template <Object> #定義Pod的模板,基于這個模板定義的所有pod是一樣的

查看replicaset的spec.template字段如何定義?
對于template而言,其內部定義的就是pod,pod模板是一個獨立的對象

[root@master1 ~]# kubectl explain rs.spec.template KIND: ReplicaSet VERSION: apps/v1 RESOURCE: template <Object> DESCRIPTION:Template is the object that describes the pod that will be created ifinsufficient replicas are detected。PodTemplateSpec describes the data a pod should have when created from atemplate FIELDS:metadata <Object>spec <Object>[root@master1 ~]# kubectl explain rs.spec.template.spec

上面可以看到,ReplicaSet資源中有兩個spec字段。第一個spec聲明的是ReplicaSet定義多少個Pod副本(默認將僅部署1個Pod)、匹配Pod標簽的選擇器、創建pod的模板。第二個spec是spec.template.spec:主要用于Pod里的容器屬性等配置。
.spec.template里的內容是聲明Pod對象時要定義的各種屬性,所以這部分也叫做PodTemplate(Pod模板)。還有一個值得注意的地方是:在.spec.selector中定義的標簽選擇器必須能夠匹配到spec.template.metadata.labels里定義的Pod標簽,否則Kubernetes將不允許創建ReplicaSet。

3、Replicaset使用案例:部署Guestbook留言板

[root@master1 replicaset]# vim replicaset.yaml [root@master1 replicaset]# cat replicaset.yaml apiVersion: apps/v1 kind: ReplicaSet metadata:name: forntendlabels:app: guestbooktier: frontend spec:replicas: 3selector:matchLabels:tier: frontendtemplate:metadata:labels:tier: frontendspec:containers:- name: php-redisimage: yecc/gcr.io-google_samples-gb-frontend:v3imagePullPolicy: IfNotPresent [root@master1 replicaset]# kubectl apply -f replicaset.yaml replicaset.apps/forntend created #pod的名字是由控制器的名字-隨機數組成的 [root@master1 replicaset]# kubectl get pods NAME READY STATUS RESTARTS AGE forntend-4vtcp 1/1 Running 0 73s forntend-8jqtt 1/1 Running 0 73s forntend-bpfck 1/1 Running 0 73s [root@master1 replicaset]# kubectl get rs NAME DESIRED CURRENT READY AGE forntend 3 3 3 84s

#資源清單詳細說明

apiVersion: apps/v1 #ReplicaSet 這個控制器屬于的核心群組 kind: ReplicaSet #創建的資源類型 metadata:name: frontend #控制器的名字labels:app: guestbooktier: frontend spec:replicas: 3 #管理的pod副本數量selector:matchLabels:tier: frontend #管理帶有tier=frontend標簽的podtemplate: #定義pod的模板metadata:labels:tier: frontend #pod標簽,一定要有,這樣上面控制器就能找到它要管理的pod是哪些了spec:containers: #定義pod里運行的容器- name: php-redis #定義容器的名字image: yecc/gcr.io-google_samples-gb-frontend:v3ports: #定義端口- name: http #定義容器的名字containerPort: 80 #定義容器暴露的端口

4、Replicaset管理pod:擴容、縮容、更新
Replicaset實現pod的動態擴容

ReplicaSet最核心的功能是可以動態擴容和回縮,如果我們覺得兩個副本太少了,想要增加,只需要修改配置文件replicaset.yaml里的replicas的值即可,原來replicas: 3,現在變成replicaset: 4,修改之后,執行如下命令更新:

[root@master1 replicaset]# vim replicaset.yaml [root@master1 replicaset]# cat replicaset.yaml | grep replicasreplicas: 4 [root@master1 replicaset]# vim replicaset.yaml [root@master1 replicaset]# kubectl apply -f replicaset.yaml replicaset.apps/forntend configured [root@master1 replicaset]# kubectl get rs NAME DESIRED CURRENT READY AGE forntend 4 4 4 5m2s [root@master1 replicaset]# kubectl get pods NAME READY STATUS RESTARTS AGE forntend-4vtcp 1/1 Running 0 5m6s forntend-8jqtt 1/1 Running 0 5m6s forntend-bpfck 1/1 Running 0 5m6s forntend-zt2jn 1/1 Running 0 10s

也可以直接編輯控制器實現擴容
kubectl edit rs frontend #這個是我們把請求提交給了apiserver,實時修改

[root@master1 replicaset]# kubectl edit rs forntend replicaset.apps/forntend edited 把上面的spec下的replicas 后面的值改成5,保存退出 [root@master1 replicaset]# kubectl get rs NAME DESIRED CURRENT READY AGE forntend 5 5 5 8m4s [root@master1 replicaset]# kubectl get pods NAME READY STATUS RESTARTS AGE forntend-4vtcp 1/1 Running 0 8m7s forntend-8jqtt 1/1 Running 0 8m7s forntend-bpfck 1/1 Running 0 8m7s forntend-glhdg 1/1 Running 0 34s forntend-zt2jn 1/1 Running 0 3m11s

Replicaset實現pod的動態縮容

如果我們覺得5個Pod副本太多了,想要減少,只需要修改配置文件replicaset.yaml里的replicas的值即可,把replicaset:4變成replicas: 2,修改之后,執行如下命令更新:

[root@master1 replicaset]# vim replicaset.yaml [root@master1 replicaset]# cat replicaset.yaml | grep replicasreplicas: 2 [root@master1 replicaset]# kubectl apply -f replicaset.yaml replicaset.apps/forntend configured [root@master1 replicaset]# kubectl get rs NAME DESIRED CURRENT READY AGE forntend 2 2 2 9m52s [root@master1 replicaset]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES forntend-8jqtt 1/1 Running 0 13m 10.1.104.36 node2 <none> <none> forntend-bpfck 1/1 Running 0 13m 10.1.166.174 node1 <none><none> [root@master1 replicaset]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR forntend 2 2 2 13m php-redis yecc/gcr.io-google_samples-gb-frontend:v2 tier=frontend [root@master1 replicaset]# curl 10.1.104.36 <html ng-app="redis"><head><title>Guestbook</title><link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"><script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script><script src="controllers.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.0/ui-bootstrap-tpls.js"></script></head><body ng-controller="RedisCtrl"><div style="width: 50%; margin-left: 20px"><h2>Guestbook</h2><form><fieldset><input ng-model="msg" placeholder="Messages" class="form-control" type="text" name="input"><br><button type="button" class="btn btn-primary" ng-click="controller.onRedis()">Submit</button></fieldset></form><div><div ng-repeat="msg in messages track by $index">{{msg}}</div></div></div></body> </html>

Replicaset實現pod的更新

修改鏡像image: yecc/gcr.io-google_samples-gb-frontend:v3變成- image: ikubernetes/myapp:v2,修改之后保存退出

[root@master1 replicaset]# kubectl edit rs forntend replicaset.apps/forntend edited[root@master1 replicaset]# kubectl get rs -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR forntend 2 2 1 27m php-redis ikubernetes/myapp:v2 tier=frontend #上面可以看到鏡像變成了ikubernetes/myapp:v2,說明滾動升級成功了[root@master1 replicaset]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES forntend-8jqtt 1/1 Running 0 18m 10.1.104.36 node2 <none> <none> forntend-bpfck 1/1 Running 0 18m 10.1.166.174 node1 <none> <none> [root@master1 replicaset]# curl 10.1.104.36 <html ng-app="redis"><head><title>Guestbook</title><link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"><script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script><script src="controllers.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.0/ui-bootstrap-tpls.js"></script></head><body ng-controller="RedisCtrl"><div style="width: 50%; margin-left: 20px"><h2>Guestbook</h2><form><fieldset><input ng-model="msg" placeholder="Messages" class="form-control" type="text" name="input"><br><button type="button" class="btn btn-primary" ng-click="controller.onRedis()">Submit</button></fieldset></form><div><div ng-repeat="msg in messages track by $index">{{msg}}</div></div></div></body> </html>

#上面可以看到雖然鏡像已經更新了,但是原來的pod使用的還是之前的鏡像,新創建的pod才會使用最新的鏡像

刪除一個pod,讓replicaset新建一個pod資源 [root@master1 replicaset]# kubectl delete pods forntend-8jqtt pod "forntend-8jqtt" deleted [root@master1 replicaset]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES forntend-75cg6 1/1 Running 0 26s 10.1.104.39 node2 <none> <none> forntend-bpfck 1/1 Running 0 28m 10.1.166.174 node1 <none> #新生成的pod的鏡像已經變成了myapp的,說明更新完成了 [root@master1 replicaset]# curl 10.1.104.39 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

如果我們直接修改replicaset.yaml文件,把image: yecc/gcr.io-google_samples-gb-frontend:v3變成- image: ikubernetes/myapp:v2
kubectl apply -f replicaset.yaml
發現原來的pod還是用的frontend:v3這個鏡像,沒有實現自動更新

生產環境如果升級,可以刪除一個pod,觀察一段時間之后沒問題再刪除另一個pod,但是這樣需要人工干預多次;實際生產環境一般采用藍綠發布,原來有一個rs1,再創建一個rs2(控制器),通過修改service標簽,修改service可以匹配到rs2的控制器,這樣才是藍綠發布,這個也需要我們精心的部署規劃,我們有一個控制器就是建立在rs之上完成的,叫做Deployment

總結

以上是生活随笔為你收集整理的k8s之ReplicaSet的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。