6. kubernetes pod控制器

6. kubernetes pod控制器

[TOC]

本文基于馬哥的docker和k8s視頻總結(jié), 在此致謝馬哥.

Pod控制器類(lèi)型

  • ReplicaSet(創(chuàng)建并保持指定數(shù)量的pod副本, 支持動(dòng)態(tài)擴(kuò)縮容和滾動(dòng)更新)
    • 用戶期望的副本數(shù)
    • 標(biāo)簽選擇器
    • pod資源模板
  • Deployment (建構(gòu)在ReplicaSet之上, 用來(lái)管理無(wú)狀態(tài)應(yīng)用)
  • DaemonSet (節(jié)點(diǎn)級(jí)控制器, 確保集群中滿足條件的每個(gè)節(jié)點(diǎn)只運(yùn)行一個(gè)特定pod副本)
  • Job (執(zhí)行一次性的作業(yè), 確保任務(wù)是正常完成而不是異常退出)
  • CronJob (周期性運(yùn)行作業(yè))
  • StatefulSet (管理有狀態(tài)應(yīng)用且每個(gè)應(yīng)用, 每個(gè)pod副本都被單獨(dú)管理)

ReplicaSet

使用rs示例

生產(chǎn)環(huán)境中千萬(wàn)不可隨意給pod打標(biāo)簽, 否則有標(biāo)簽重疊時(shí)k8s集群可能會(huì)隨機(jī)殺掉正在服務(wù)的pod !

kubectl explain rs
apiVersion: app/v1
kind: ReplicaSet
metadata:
    name: myapp
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels: # 通過(guò)selector, 選擇標(biāo)簽為app, 值為myapp且標(biāo)簽為release, 值為canary的pod
            app: myapp
            release: canary
    template: # 定義創(chuàng)建pod的模板
        metadata: # 此處指定的是創(chuàng)建出來(lái)的pod的元數(shù)據(jù)
            name: myapp-pod # 此處定義的pod名其實(shí)沒(méi)什么用
            labels: # 由template中定義的標(biāo)簽一定要符合selector中定義的標(biāo)準(zhǔn), 否則會(huì)一直創(chuàng)建
                app: myapp
                release: canary
                enviroment: qa
        spec: # 此處指定的是創(chuàng)建出來(lái)的pod的spec
            containers: 
            - name: myapp-container
                image: nginx:1.14-alpine
                imagePullPolicy: IfNotPresent # 默認(rèn)值就是IfNotPresent, 此處可省略
                ports:
                - name: http
                    containerPort: 80
                - name: https
                    containerPort: 443
kubectl create -f replicaset-demo.yml
# 支持動(dòng)態(tài)擴(kuò)展和滾動(dòng)更新 (但滾動(dòng)更新需要手動(dòng)重啟pod)
kubectl edit rs myapp
    # 將replicas的值修改為5, 即可實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容(k8s集群會(huì)幫你自動(dòng)去創(chuàng)建新的3個(gè)pod)
    # 將image的值改為更高版本, pod所使用的的鏡像會(huì)更新, 但是pod需要被重啟才會(huì)使用新的鏡像版本

Deployment

能提供滾動(dòng)式自定義自控制的更新:

Deployment.png
Deployment與replicaSet的關(guān)系.png

能控制更新節(jié)奏和更新邏輯: 允許最多(少)存在幾個(gè)pod和同時(shí)更新幾個(gè)pod

更新時(shí)做readiness特別重要 !!! 因?yàn)槲磖eady的不能算更新好.

使用Deployment示例

kubectl explain deploy
apiVersion: apps/v1
kind: Deployment
metadata:
    name: myapp-deploy
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels: 
            app: myapp
            release: canary
    template:
        metadata:
            labels:
                app: myapp
                release: canary
        spec:
          containers:
            - name: myapp-container
                image: nginx:1.14-alpine
                imagePullPolicy: IfNotPresent
                ports:
                - name: http
                    containerPort: 80
                - name: https
                    containerPort: 443
kubectl apply -f deploy-demo.yml # 聲明式創(chuàng)建(即能創(chuàng)建, 亦能更新)

kubectl get deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
myapp-deploy   2/2     2            2           11s

kubectl get rs # 可以發(fā)現(xiàn)有rs被創(chuàng)建, 說(shuō)明Deployment是基于repolicaSet的
NAME                     DESIRED   CURRENT   READY   AGE
myapp-deploy-fc645b99f   2         2         2       21s
    # myapp-deploy-fc645b99f <==> Deployment_name-模板(即deploy-demo.yml)的哈希值

動(dòng)態(tài)擴(kuò)展

  • Deployment在實(shí)現(xiàn)更新應(yīng)用時(shí), 可直接編輯記配置文件實(shí)現(xiàn):
# 1. 編輯配置文件deploy-demo.yml, 將replicas值改為3

# 2. 再次應(yīng)用配置文件deploy-demo.yml
kubectl apply -f deploy-demp.yml # apply可以使用多次

# 3. 每次版本變化都會(huì)顯示在Annotations的值中
kubectl describe deploy myapp-deploy

滾動(dòng)更新與回退

# 1. 編輯配置文件deploy-demo.yml, 將image的值改為nginx:1.15-alpine

# 2. 再次應(yīng)用
kubectl apply -f deploy-demp.yml

# 3. 查看滾動(dòng)更新時(shí)狀態(tài)信息
kubectl get pods -l app=myapp -w

# 4. 顯示歷史版本信息, 可用于版本回退 (舊版本模板會(huì)被保留, 隨時(shí)等待回退)
kubectl get rs -o wide

# 5. 查看滾動(dòng)歷史
kubectl rollout history deployment myapp-deploy

# 5.5. 若新版有問(wèn)題, 可回退到上一版本
kubectl rollout undo deployment myapp-deploy

# 6. 也可使用打補(bǔ)丁的方式更新
kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'
    # -p選項(xiàng)后使用JSON格式數(shù)組指明打的補(bǔ)丁, 鍵需要用引號(hào)引起來(lái)

更復(fù)雜的更新

# 方法一: 打補(bǔ)丁
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

# 方法二: 直接交互式編輯
kubectl edit deploy myapp-deploy
  • 可以做到更新版本時(shí)只更新其中一個(gè), 然后暫停更新 ==> 金絲雀發(fā)布:
# 1. 
kubectl set image deployment myapp-deploy myapp-container=nginx:1.15-alpine && kubectl rollout pause deployment myapp-deploy

# 2. 監(jiān)視更新過(guò)程
kubectl get pods -l app=myapp -w
kubectl rollout status deployment myapp-deploy

# 3. 若更新沒(méi)問(wèn)題, 可以繼續(xù)更新
kubectl rollout resume deployment myapp-deploy

# 4. 此時(shí)也可以看到版本迭代
kubectl get rs -o wide

# 5. 可回滾到指定版本
kubectl rollout undo deployment myapp-deploy --to-revision=1

DaementSet

使用ds示例

kubectl explain ds
apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis
    namespace: default
spec:
    replicas: 1
    selector:
        matchLabels:
            app: redis
            role: logstore
    template:
        metadata:
            labels:
                app: redis
                role: logstore
        spec:
            containers:
            - name: redis
                image: redis:4.0-alpine
                imagePullPolicy: IfNotPresent
                ports:
                - name: redis
                    containerPort: 6379
                    protocol: TCP
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
    name: filebeat-ds
    namespace: default
spec:
    selector:
        matchLabels:
            app: filebeat
            release: stable
    template:
        metadata:
            label:
                app: filebeat
                release: stable
        spec:
            containers:
            - name: filebeat-container
                image: filebeat:5.6.5-alpine
                imagePullPolicy: IfNotPresent
                env: # 可以在容器創(chuàng)建時(shí)傳入環(huán)境變量
                - name: REDIS_HOST
                    value: redis.default.svc.cluster.local # 各pod之間通過(guò)service的主機(jī)名互相調(diào)用, 通信
                - name: REDIS_LOG_LEVEL
                    value: info
kubectl apply -f ds-demo.yml
  • DaemonSet也支持滾動(dòng)更新: kubectl set image -h
kubectl set image ds filebeat-ds filebeat:5.6.6-alpine 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腌乡,一起剝皮案震驚了整個(gè)濱河市吟孙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌制跟,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件子漩,死亡現(xiàn)場(chǎng)離奇詭異幼衰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诊霹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)羞延,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人脾还,你說(shuō)我怎么就攤上這事伴箩。” “怎么了鄙漏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嗤谚,是天一觀的道長(zhǎng)棺蛛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)巩步,這世上最難降的妖魔是什么旁赊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮椅野,結(jié)果婚禮上彤恶,老公的妹妹穿的比我還像新娘。我一直安慰自己鳄橘,他們只是感情好声离,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘫怜,像睡著了一般术徊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲸湃,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天赠涮,我揣著相機(jī)與錄音,去河邊找鬼暗挑。 笑死笋除,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炸裆。 我是一名探鬼主播垃它,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烹看!你這毒婦竟也來(lái)了国拇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惯殊,失蹤者是張志新(化名)和其女友劉穎酱吝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體土思,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡务热,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了己儒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崎岂。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖址愿,靈堂內(nèi)的尸體忽然破棺而出该镣,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布损合,位于F島的核電站省艳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫁审。R本人自食惡果不足惜跋炕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望律适。 院中可真熱鬧辐烂,春花似錦、人聲如沸捂贿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厂僧。三九已至扣草,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颜屠,已是汗流浹背辰妙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甫窟,地道東北人密浑。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像粗井,于是被迫代替她去往敵國(guó)和親尔破。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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