Kubernetes——資源控制器

前言

Pod的分類

自助式pod

  • 只要pod退出了叁鉴,此類型的pod不會被重建怜姿,該pod沒有管理者团搞,死亡后不會被拉起岗照。

控制器管理的pod【生產(chǎn)環(huán)境中大多數(shù)都是選擇控制器去管理pod】

  • 在控制器的生命周期里始終要維持pod的副本數(shù)目

區(qū)別
生命周期被管理的機制不太一致

一、什么是控制器

Kubernetes 中內(nèi)建了很多 controller(控制器)亭病,這些相當(dāng)于一個狀態(tài)機鹅很,用來控制 Pod 的具體狀態(tài)和行為

二、控制器類型

①ReplicationController 和 ReplicaSet

②Deployment

③DaemonSet

④StateFulSet

⑤Job/CronJob

⑥Horizontal Pod Autoscaling

1罪帖、ReplicationController和ReplicaSet

ReplicationController(RC)用來確保容器應(yīng)用的副本數(shù)始終保持在用戶定義的副本數(shù)促煮,即如果有容器異常退出,會自動創(chuàng)建新的 Pod 來替代整袁;而如果異常多出來的容器也會自動回收菠齿;
在新版本的 Kubernetes 中建議使用 ReplicaSet 來取代 ReplicationController 。ReplicaSet 跟ReplicationController 沒有本質(zhì)的不同坐昙,只是名字不一樣绳匀,并且 ReplicaSet 支持集合式的 selector(標(biāo)簽 )

2、Deployment 一般的應(yīng)用程序可用

Deployment 為 Pod 和 ReplicaSet 提供了一個聲明式定義 (declarative) 方法民珍,用來替代以前的ReplicationController 來方便的管理應(yīng)用。典型的應(yīng)用場景包括盗飒;

  • ①定義 Deployment 來創(chuàng)建 Pod 和 ReplicaSet
  • ②滾動升級和回滾應(yīng)用【Deployment自身具備的特點】
  • ③擴容和縮容【RS就已經(jīng)實現(xiàn)嚷量,Deployment通過RS管理Pod因此也支持】
  • ④暫停和繼續(xù) Deployment【Deployment自身具備的特點】

命令式編程:它側(cè)重于如何實現(xiàn)程序,就像我們剛接觸編程的時候那樣逆趣,我們需要將程序的實現(xiàn)過程按照邏輯結(jié)果一步一步實現(xiàn)寫下來
聲明式編程:它側(cè)重于定義想要什么蝶溶,然后告訴計算機 / 引擎,讓它幫你去實現(xiàn)宣渗。

滾動更新:會創(chuàng)建一個新副本的rs1抖所,舊的rs的pod減少一個時,rs1會新加一個痕囱,直到全部增減完成



回滾:同理田轧,需要恢復(fù)舊的rs時,會啟動rs鞍恢,再進行增減操作

3傻粘、DaemonSet 類似與守護進程的應(yīng)用程序可用

DaemonSet確保全部(或者一些)Node 上運行一個 Pod 的副本每窖。當(dāng)有 Node 加入集群時,也會為他們新增一個Pod 弦悉。當(dāng)有 Node 從集群移除時窒典,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創(chuàng)建的所有 Pod

使用 DaemonSet 的一些典型用法:

  • ①運行集群存儲 daemon稽莉,例如在每個 Node 上運行g(shù)lusterd瀑志、ceph
  • ②在每個 Node 上運行日志收集 daemon,例如fluentd污秆、logstash
  • ③在每個 Node 上運行監(jiān)控 daemon劈猪,例如Prometheus Node Exporter、collectd混狠、Datadog 代理岸霹、New Relic 代理,或 Ganglia gmond

4将饺、Job 批處理腳本程序可用

Job 負(fù)責(zé)批處理任務(wù)贡避,即僅執(zhí)行一次的任務(wù),它保證批處理任務(wù)的一個或多個 Pod 成功結(jié)束

5予弧、CronJob【本質(zhì)上是在特定的時間循環(huán)創(chuàng)建Job去實現(xiàn)的】批處理腳本程序可用

管理基于時間的 Job刮吧,即:

  • 在給定時間點只運行一次
  • 周期性地在給定時間點運行
    使用前提條件:當(dāng)前使用的 Kubernetes 集群,版本 >= 1.8(對 CronJob)掖蛤。對于先前版本的集群杀捻,版本 <1.8,啟動 API Server時蚓庭,通過傳遞選項--runtime-config=batch/v2alpha1=true可以開啟 batch/v2alpha1API

典型的用法如下所示:

  • 在給定的時間點調(diào)度 Job 運行
  • 創(chuàng)建周期性運行的 Job致讥,例如:數(shù)據(jù)庫備份、發(fā)送郵件

6器赞、StatefulSet 有狀態(tài)服務(wù)的應(yīng)用程序可用

StatefulSet 作為 Controller 為 Pod 提供唯一的標(biāo)識垢袱。它可以保證部署和 scale 的順序
StatefulSet是為了解決有狀態(tài)服務(wù)的問題(對應(yīng)Deployments和ReplicaSets是為無狀態(tài)服務(wù)而設(shè)計),但到目前為止港柜,MySQL有狀態(tài)服務(wù)部署進K8s并不穩(wěn)定请契,其應(yīng)用場景包括:

  • ①穩(wěn)定的持久化存儲,即Pod重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù)夏醉,基于PVC來實現(xiàn)
  • ②穩(wěn)定的網(wǎng)絡(luò)標(biāo)志爽锥,即Pod重新調(diào)度后其PodName和HostName不變,基于Headless Service(即沒有Cluster IP的Service)來實現(xiàn)
  • ③有序部署畔柔,有序擴展氯夷,即Pod是有順序的,在部署或者擴展的時候要依據(jù)定義的順序依次依次進行(即從0到N-1靶擦,在下一個Pod運行之前所有之前的Pod必須都是Running和Ready狀態(tài))肠槽,基于init containers來實現(xiàn)
  • ④有序收縮擎淤,有序刪除(即從N-1到0)

7、Horizontal Pod Autoscaling【自動擴展秸仙,可以理解為它并不是一個控制器嘴拢,而是一個控制器的附屬品,使用HPA去控制其他的控制器從而使其他的控制器具有自動擴展的功能】

應(yīng)用的資源使用率通常都有高峰和低谷的時候寂纪,如何削峰填谷席吴,提高集群的整體資源利用率,讓service中的Pod個數(shù)自動調(diào)整呢捞蛋?這就有賴于Horizontal Pod Autoscaling了孝冒,顧名思義,使Pod水平自動縮放

資源控制器之ReplicationController拟杉、ReplicaSet和Deployment

1庄涡、ReplicationController和ReplicaSet介紹

RC(ReplicationController)主要的作用就是用來確保容器應(yīng)用的副本數(shù)始終保持在用戶定義的副本數(shù)。即如果有容器異常退出搬设,會自動創(chuàng)建新的Pod來替代穴店;而如果異常多出來的容器也會自動回收
Kubernetes官方建議使用RS(Replicaset)替代RC(ReplicationController)進行部署,RS跟RC沒有本質(zhì)的不同拿穴,只是名字不一樣泣洞,并且RS支持集合式的 selector

查看RS完整模板信息:kubectl explain rs
ReplicaSet資源文件示例

apiVersion: extensions/v1beta1
kind: ReplicaSet 
metadata:
  name: frontend 
spec:
  replicas: 3 #有3個副本
  selector: #標(biāo)簽選擇器
    matchLabels:
      tier: frontend 
  template: #模板
    metadata:
      1abels:
        tier: frontend 
    spec:
      containers:
      - name: php-redis 
        image: gcr.io/google_samples/gb-frontend:v3 
        env:
        - name: GET_HOSTS_FROM 
          value:dns 
        ports:
        - containerPort: 80

資源控制器所創(chuàng)建的pod,刪除后會被新建
kubectl get pod --show-labels 查看標(biāo)簽

2默色、Deployment介紹

RS 與 Deployment 的關(guān)聯(lián)


Deployment通過RS去創(chuàng)建和管理對應(yīng)的pod及不同的RS交替去完成滾動更新球凰。 
Deployment 為 Pod 和 ReplicaSet 提供了一個聲明式定義(declarative)方法腿宰,用來替代以前的ReplicationController 來方便的管理應(yīng)用呕诉。典型的應(yīng)用場景包括:

  • ①定義Deployment來創(chuàng)建Pod和ReplicaSet
  • ②滾動升級和回滾
  • ③應(yīng)用擴容和縮容
  • ④暫停和繼續(xù)Deployment

2.1、部署一個簡單的 Nginx 應(yīng)用

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata:
  name: nginx-deployment 
spec:
  replicas: 3 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:   
      - name: nginx 
        image: nginx:1.7.9 
        ports:
        - containerPort: 80

2.2創(chuàng)建

kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record 
## --record參數(shù)可以記錄命令吃度,我們可以很方便的查看每次 revision 的變化 更新的時候可以記錄狀態(tài)甩挫,每一步是使用什么命令進行更新的

2.3、擴容

kubectl scale deployment nginx-deployment --replicas 10

2.4规肴、如果集群支持horizontal pod autoscaling的話捶闸,還可以為Deployment設(shè)置自動擴展

kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80

2.5夜畴、更新容器中的鏡像

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

2.6拖刃、回滾

kubectl rollout undo deployment/nginx-deployment

2.7、使用edit命令編輯Deployment

kubectl edit deployment/nginx-deployment

2.8贪绘、查看rollout的狀態(tài)

kubectl rollout status deployment/nginx-deployment

2.9兑牡、查看歷史RS

kubectl get rs

3衣撬、Deployment 更新策略【如果我們需要更新時將會創(chuàng)建出兩個RS琐簇,其中舊的RS一次減少25%的pod而新的RS一次創(chuàng)建25%的pod 】

Deployment 可以保證在升級時只有一定數(shù)量的Pod是down的崇堰。默認(rèn)的虚青,它會確保至少有比期望的Pod數(shù)量少一個是up狀態(tài)(最多一個不可用)
Deployment同時也可以確保只創(chuàng)建出超過期望數(shù)量的一定數(shù)量的Pod。默認(rèn)的苞也,它會確保最多比期望的Pod數(shù)量多一個的Pod是up的(最多1個surge)
未來的Kuberentes 版本中洛勉,將從1-1變成25%-25%

kubectl describe deployments

4、Rollover(多個rollout并行)

假如您創(chuàng)建了一個有5個niginx:1.7.9 replica的 Deployment如迟,但是當(dāng)還只有3個nginx:1.7.9的 replica 創(chuàng)建出來的時候您就開始更新含有5個nginx:1.9.1 replica 的 Deployment收毫。在這種情況下,Deployment 會立即殺掉已創(chuàng)建的3個nginx:1.7.9的 Pod殷勘,并開始創(chuàng)建nginx:1.9.1的 Pod此再。它不會等到所有的5個nginx:1.7.9的Pod 都創(chuàng)建完成后才開始改變航道

5、回退Deployment

只要Deployment的rollout被觸發(fā)玲销,就會創(chuàng)建一個revision输拇。也就是說當(dāng)且僅當(dāng)Deployment的Pod template(如.spec.template)被更改,例如更新template中的label和容器鏡像時贤斜,就會創(chuàng)建出一個新的revision策吠。其他的更新,比如擴容Deployment不會創(chuàng)建revision-因此我們可以很方便的手動或者自動擴容蠢古。這意味著當(dāng)您回退到歷史revision時奴曙,只有Deployment中的Pod template部分才會回退

#設(shè)置鏡像
kubectl set image deployment/nginx-deployment nginx=nginx:1.91 
#查看當(dāng)前更新狀態(tài)
kubectl rollout status deployments nginx-deployment 
kubectl get pods 
#查看可回滾的歷史版本
kubectl rollout history deployment/nginx-deployment 
kubectl rollout undo deployment/nginx-deployment
##可以使用--revision參數(shù)指定回退到某個歷史版本 
kubectl rollout undo deployment/nginx-deployment --to-revision=2  
##暫停 deployment的更新
kubectl rollout pause deployment/nginx-deployment

您可以用kubectl rollout status 命令查看Deployment是否完成。如果 rollout成功完成草讶,kubect1rollout status 將返回一個0值的Exit Code

kubect1 rollout status deploy/nginx
echo $?

6洽糟、清理 Policy

您可以通過設(shè)置.spec.revisonHistoryLimit項來指定 deployment 最多保留多少 revision 歷史記錄。默認(rèn)的會保留所有的 revision堕战;如果將該項設(shè)置為0坤溃,Deployment 就不允許回退了

資源控制器之DaemonSet、Job和CronJob

1嘱丢、DaemonSet介紹薪介,什么是DaemonSet

DaemonSet 確保全部(或者一些)Node 上運行一個Pod的副本【注意主節(jié)點并不會參加調(diào)度】。當(dāng)有 Node 加入集群時越驻,也會為他們新增一個Pod汁政。當(dāng)有Node從集群移除時,這些Pod 也會被回收缀旁。刪除DaemonSet將會刪除它創(chuàng)建的所有Pod
使用DaemonSet的一些典型用法:

  • 運行集群存儲 daemon记劈,例如在每個Node 上運行g(shù)lusterd、ceph
  • 在每個Node 上運行日志收集 daemon并巍,例如fluentd目木、logstash
  • 在每個Node 上運行監(jiān)控daemon,例如Prometheus Node Exporter懊渡、collectd刽射、Datadog代理军拟、New Relic 代理,或Ganglia gmond

DaemonSet資源文件示例

apiVersion: apps/v1 
kind: DaemonSet 
metadata:
  name: deamonset-example 
  labels: 
    app: daemonset 
spec:
  selector:
    matchLabels:
      name: deamonset-example 
  template:
    metadata:
      1abels: 
        name: deamonset-example 
    spec: 
      containers:
      - name: daemonset-example 
        image: fanqisoft/myapp:v1

Job介紹誓禁,什么是Job

Job負(fù)責(zé)批處理任務(wù)懈息,即僅執(zhí)行一次的任務(wù),它保證批處理任務(wù)的一個或多個Pod成功結(jié)束
特殊說明

  • spec.template格式同Pod
  • RestartPolicy僅支持Never或OnFailure
  • 單個Pod時摹恰,默認(rèn)Pod成功運行后Job即結(jié)束·
  • spec.completions 標(biāo)志Job結(jié)束需要成功運行的Pod個數(shù)漓拾,默認(rèn)為1·
  • spec.parallelism 標(biāo)志并行運行的Pod的個數(shù),默認(rèn)為1
  • spec.activeDeadlineseconds標(biāo)志失敗Pod的重試最大時間戒祠,超過這個時間不會繼續(xù)重試

Job資源文件示例

apiVersion: batch/v1 
kind: Job 
metadata:
  name:pi 
spec:
  template:
    metadata:
      name:pi 
    spec:
      containers:
      - name: pi 
        image: perl 
      command: ["per1","-Mbignum=bpi","-wle","print bpi(2000)"]
      restartPolicy: Never

CronJob

CronJob管理基于時間的Job骇两,即:

  • 在給定時間點只運行一次
  • 周期性地在給定時間點運行
    使用條件:當(dāng)前使用的Kubernetes 集群,版本>=1.8(對CronJob)
    典型的用法如下所示:
  • 在給定的時間點調(diào)度Job運行
  • 創(chuàng)建周期性運行的Job姜盈,例如:數(shù)據(jù)庫備份低千、發(fā)送郵件

CronJob Spec

  • spec.template格式同Pod

  • RestartPolicy僅支持Never或OnFailure

  • 單個Pod時,默認(rèn)Pod成功運行后Job即結(jié)束·

  • spec.completions標(biāo)志Job結(jié)束需要成功運行的Pod個數(shù)馏颂,默認(rèn)為1·

  • spec.parallelism 標(biāo)志并行運行的Pod的個數(shù)示血,默認(rèn)為1

  • spec.activeDeadlineSeconds 標(biāo)志失敗Pod的重試最大時間,超過這個時間不會繼續(xù)重試

  • spec.schedule:調(diào)度救拉,必需字段难审,指定任務(wù)運行周期,格式同 Cron·

  • spec.jobTemplate:Job模板亿絮,必需字段告喊,指定需要運行的任務(wù),格式同Job

  • spec.startingDeadlineSeconds:啟動Job的期限(秒級別)派昧,該字段是可選的黔姜。如果因為任何原因而錯過了被調(diào)度的時間,那么錯過執(zhí)行時間的Job將被認(rèn)為是失敗的蒂萎。如果沒有指定秆吵,則沒有期限

  • spec.concurrencyPolicy:并發(fā)策略,該字段也是可選的五慈。它指定了如何處理被 Cron Job創(chuàng)建的Job的并發(fā)執(zhí)行纳寂。只允許指定下面策略中的一種:

  • Allow(默認(rèn)):允許并發(fā)運行Job
  • Forbid:禁止并發(fā)運行,如果前一個還沒有完成泻拦,則直接跳過下一個
  • Replace:取消當(dāng)前正在運行的Job毙芜,用一個新的來替換
    注意,當(dāng)前策略只能應(yīng)用于同一個CronJob創(chuàng)建的Job聪轿。如果存在多個Cron Job爷肝,它們創(chuàng)建的Job之間總是允許并發(fā)運行猾浦。
  • spec.suspend:掛起陆错,該字段也是可選的灯抛。如果設(shè)置為true,后續(xù)所有執(zhí)行都會被掛起音瓷。它對已經(jīng)開始執(zhí)行的Job不起作用对嚼。默認(rèn)值為false。
  • spec.successfulJobsHistoryLimit和.spec.failed]obsHistoryLimit:歷史限制绳慎,是可選的字段纵竖。它們指定了可以保留多少完成和失敗的Job。默認(rèn)情況下杏愤,它們分別設(shè)置為3和1靡砌。設(shè)置限制的值為e,相關(guān)類型的Job完成后將不會被保留珊楼。

CronJob資源文件示例

apiVersion: batch/v1beta1 
kind: CronJob 
metadata:
  name: he11o 
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox 
            args:
            - /bin/sh 
            - -c 
            - date;echo Hello from the Kubernetes cluster 
          restartPolicy: OnFailure

Cronjob本身的一些限制
創(chuàng)建Job操作應(yīng)該是冪等的
CronJob并不太好去判斷任務(wù)是否成功通殃,CronJob通過創(chuàng)建Job去完成任務(wù),Job成功與否可以判斷厕宗,但CronJob無法鏈接到Job去獲取成功與否画舌,Cron只會定期的去創(chuàng)建Job,僅此而已已慢。

參考:
https://www.cnblogs.com/LiuQizhong/p/11551381.html

https://www.cnblogs.com/fanqisoft/p/11573458.html

https://www.cnblogs.com/fanqisoft/p/11577889.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曲聂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佑惠,更是在濱河造成了極大的恐慌朋腋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膜楷,死亡現(xiàn)場離奇詭異乍丈,居然都是意外死亡,警方通過查閱死者的電腦和手機把将,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門轻专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人察蹲,你說我怎么就攤上這事请垛。” “怎么了洽议?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵宗收,是天一觀的道長。 經(jīng)常有香客問我亚兄,道長混稽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮匈勋,結(jié)果婚禮上礼旅,老公的妹妹穿的比我還像新娘。我一直安慰自己洽洁,他們只是感情好痘系,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饿自,像睡著了一般汰翠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昭雌,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天复唤,我揣著相機與錄音,去河邊找鬼烛卧。 笑死苟穆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唱星。 我是一名探鬼主播雳旅,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼间聊!你這毒婦竟也來了攒盈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤哎榴,失蹤者是張志新(化名)和其女友劉穎型豁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尚蝌,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡迎变,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了飘言。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衣形。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姿鸿,靈堂內(nèi)的尸體忽然破棺而出谆吴,到底是詐尸還是另有隱情,我是刑警寧澤苛预,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布句狼,位于F島的核電站,受9級特大地震影響热某,放射性物質(zhì)發(fā)生泄漏腻菇。R本人自食惡果不足惜胳螟,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筹吐。 院中可真熱鬧糖耸,春花似錦、人聲如沸骏令。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榔袋。三九已至,卻和暖如春铡俐,著一層夾襖步出監(jiān)牢的瞬間凰兑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工审丘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吏够,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓滩报,卻偏偏與公主長得像锅知,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脓钾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容