九有额、Kubernetes 進(jìn)階之控制器篇

上一章對(duì)Pod的一些配置進(jìn)行了更深刻的了解,那對(duì)于管理Pod的Controller肯定也要進(jìn)階一下敛劝,

之前我們已經(jīng)學(xué)習(xí)過(guò)的 Controller 有RC、RS和Deployment纷宇,除此之外官方還提供符合其他場(chǎng)景使用的控制器夸盟,如:DaemonSet、statefulSet像捶、Job上陕、cron-job這些。

1作岖、DaemonSet

DaemonSet 確保全部(或者某些)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 的副本唆垃。當(dāng)有節(jié)點(diǎn)加入集群時(shí), 也會(huì)為他們新增一個(gè) Pod 痘儡。當(dāng)有節(jié)點(diǎn)從集群移除時(shí)辕万,這些 Pod 也會(huì)被回收。刪除 DaemonSet 將會(huì)刪除它創(chuàng)建的所有 Pod。

DaemonSet應(yīng)用場(chǎng)景

  • 運(yùn)行集群存儲(chǔ) daemon渐尿,例如在每個(gè)節(jié)點(diǎn)上運(yùn)行 glusterd醉途、ceph
  • 在每個(gè)節(jié)點(diǎn)上運(yùn)行日志收集 daemon砖茸,例如fluentd隘擎、logstash
  • 在每個(gè)節(jié)點(diǎn)上運(yùn)行監(jiān)控 daemon凉夯,例如 Prometheus Node Exporter货葬、collectd、Datadog 代理劲够、New Relic 代理震桶,或 Ganglia gmond

上面的說(shuō)明應(yīng)該很容易理解征绎,簡(jiǎn)單來(lái)說(shuō)就是蹲姐,使用DaemonSet控制器創(chuàng)建資源,它會(huì)讓每個(gè)Node節(jié)點(diǎn)都運(yùn)行一份Pod人柿,比如日志收集柴墩,因?yàn)镻od在不同節(jié)點(diǎn)運(yùn)行,那每個(gè)節(jié)點(diǎn)肯定都要有一個(gè)Pod去收集這些日志凫岖,那就可以使用DaemonSet江咳。

像K8S kube-system命名空間下的calico-node、kube-proxy組件隘截,這些都是要在每個(gè)節(jié)點(diǎn)都要保證有一份Pod存在的扎阶,它們的資源類型肯定也是DaemonSet的!

image.png
image.png

2婶芭、StatefulSet

  • StatefulSet 是用來(lái)管理有狀態(tài)應(yīng)用的工作負(fù)載 API 對(duì)象。

  • StatefulSet 用來(lái)管理 Deployment 和擴(kuò)展一組 Pod着饥,并且能為這些 Pod 提供 序號(hào)和唯一性保證犀农。

  • Deployment 相同的是,StatefulSet 管理了基于相同容器定義的一組 Pod宰掉。但和 Deployment 不同的是呵哨,StatefulSet 為它們的每個(gè) Pod 維護(hù)了一個(gè)固定的 ID媚创。這些 Pod 是基于相同的聲明來(lái)創(chuàng)建的袱饭,但是不能相互替換:無(wú)論怎么調(diào)度,每個(gè) Pod 都有一個(gè)永久不變的 ID裹纳。

  • StatefulSet 和其他控制器使用相同的工作模式挪拟。你在 StatefulSet 對(duì)象 中定義你期望的狀態(tài)挨务,然后 StatefulSet 的 控制器 就會(huì)通過(guò)各種更新來(lái)達(dá)到那種你想要的狀態(tài)。

2.1 StatefulSets 與其他控制器的區(qū)別:

之前接觸的Pod的管理對(duì)象比如RC、Deployment谎柄、DaemonSet等都是面向無(wú)狀態(tài)的服務(wù)丁侄,但是現(xiàn)實(shí)中有很多服務(wù)是有狀態(tài)的,比如MySQL集群朝巫、MongoDB集群鸿摇、ZK集群等,它們都有以下共同的特點(diǎn):

  • 每個(gè)節(jié)點(diǎn)都有固定的ID劈猿,通過(guò)該ID拙吉,集群中的成員可以互相發(fā)現(xiàn)并且通信
  • 集群的規(guī)模是比較固定的,集群規(guī)模不能隨意變動(dòng)
  • 集群里的每個(gè)節(jié)點(diǎn)都是有狀態(tài)的揪荣,通常會(huì)持久化數(shù)據(jù)到永久存儲(chǔ)中
  • 如果磁盤損壞筷黔,則集群里的某個(gè)節(jié)點(diǎn)無(wú)法正常運(yùn)行,集群功能受損

而之前的RC/Deployment沒(méi)辦法滿足要求变逃,所以從Kubernetes v1.4版本就引入了PetSet資源對(duì)象必逆,在v1.5版本時(shí)更名為StatefulSet。從本質(zhì)上說(shuō)揽乱,StatefulSet可以看作是Deployment/RC對(duì)象的特殊變種

  • StatefulSet里的每個(gè)Pod都有穩(wěn)定名眉、唯一的網(wǎng)絡(luò)標(biāo)識(shí),可以用來(lái)發(fā)現(xiàn)集群內(nèi)其他的成員
  • Pod的啟動(dòng)順序是受控的凰棉,操作第n個(gè)Pod時(shí)损拢,前n-1個(gè)Pod已經(jīng)是運(yùn)行且準(zhǔn)備好的狀態(tài)
  • StatefulSet里的Pod采用穩(wěn)定的持久化存儲(chǔ)卷,通過(guò)PV/PVC來(lái)實(shí)現(xiàn)撒犀,刪除Pod時(shí)默認(rèn)不會(huì)刪除與StatefulSet相關(guān)的存儲(chǔ)卷
  • StatefulSet需要與Headless Service配合使用

2.2 使用StatefulSet

  • 準(zhǔn)備YAML文件

    • nginx-statefulset.yaml
    # 定義Service
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    # 定義StatefulSet
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx 
      serviceName: "nginx"  
      replicas: 3 
      template:
        metadata:
          labels:
            app: nginx 
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
    
  • 創(chuàng)建資源

    [root@master-kubeadm-k8s statefulset]# kubectl apply -f nginx-statefulset.yaml
    service/nginx created
    statefulset.apps/web created
    
  • 查看資源

    通過(guò) kubectl get pods -w 監(jiān)控Pod創(chuàng)建過(guò)程福压,觀察Pod名稱及創(chuàng)建順序

image.png

通過(guò)觀察Pod的創(chuàng)建過(guò)程可以發(fā)現(xiàn),StatefulSet類型的資源名稱是有序號(hào)的了或舞,而且肯定是有序創(chuàng)建的荆姆,第一個(gè)Pod沒(méi)創(chuàng)建完成不會(huì)創(chuàng)建第二個(gè)!

3映凳、Job

  • Job會(huì)創(chuàng)建一個(gè)或多個(gè)Pod胆筒,并確保指定數(shù)量的Pod成功終止。job會(huì)跟蹤 Pod 成功完成的情況诈豌。當(dāng)達(dá)到指定的成功完成次數(shù)時(shí)仆救,任務(wù)(即Job)就完成了。刪除 Job 將清除其創(chuàng)建的Pod矫渔。

  • 對(duì)于RS彤蔽,RC之類的控制器,能夠保持Pod按照預(yù)期數(shù)目持久地運(yùn)行下去庙洼,它們針對(duì)的是持久性的任務(wù)顿痪,比如web服務(wù)镊辕。

  • 而有些操作其實(shí)不需要持久,比如壓縮文件员魏,我們希望任務(wù)完成之后丑蛤,Pod就結(jié)束運(yùn)行,不需要保持在系統(tǒng)中撕阎,此時(shí)就需要用到Job受裹。

  • 所以可以這樣理解,Job是對(duì)RS虏束、RC等持久性控制器的補(bǔ)充棉饶,負(fù)責(zé)批量處理短暫的一次性任務(wù),僅執(zhí)行一次镇匀,并保證處理的一個(gè)或者多個(gè)Pod成功結(jié)束照藻。

3.1 使用Job

  • 準(zhǔn)備YAML文件

    • job.yaml

    這個(gè) Job 會(huì)打印 1 ~ 9 的數(shù)字到控制臺(tái),當(dāng)打印完成后這個(gè) Pod 的任務(wù)就完成

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-demo
    spec:
      template:
        metadata:
          name: job-demo
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox
            command:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
    

    注意JobRestartPolicy 只支持NeverOnFailure兩種汗侵,不支持Always幸缕,因?yàn)?Job 就相當(dāng)于來(lái)執(zhí)行一個(gè)批處理任務(wù),執(zhí)行完就結(jié)束了晰韵,如果支持Always的話就陷入死循環(huán)了!

  • 查看日志

    # 創(chuàng)建 Job
    [root@master-kubeadm-k8s job]# kubectl apply -f job.yaml
    job.batch/job-demo created
    
    # 查看Job, 它的狀態(tài)已經(jīng)是 Completed 了,表示已經(jīng)完成了
    [root@master-kubeadm-k8s job]# kubectl get pods
    NAME                   READY   STATUS      RESTARTS   AGE
    job-demo-n7wxf         0/1     Completed   0          64s
    
    # 也可以單獨(dú)查看 Job 資源
    [root@master-kubeadm-k8s job]# kubectl get job
    NAME       COMPLETIONS   DURATION   AGE
    job-demo   1/1           57s        17m
    
    [root@master-kubeadm-k8s job]# kubectl get job -o wide
    NAME       COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES    SELECTOR
    job-demo   1/1           57s        17m   counter      busybox   controller-uid=866bed1d-8cff-11ea-827a-5254008afee6
    
    # 查看日志,輸出了 1 ~ 9 的數(shù)字
    [root@master-kubeadm-k8s job]# kubectl logs job-demo-n7wxf
    9
    8
    7
    6
    5
    4
    3
    2
    1
    

3.2 Job類型

  • 非并行Job:
    • 通常只運(yùn)行一個(gè)Pod发乔,Pod成功結(jié)束Job就退出。
  • 固定完成次數(shù)的并行Job:
    • 并發(fā)運(yùn)行指定數(shù)量的Pod雪猪,直到指定數(shù)量的Pod成功栏尚,Job結(jié)束。
  • 帶有工作隊(duì)列的并行Job:
    • Pod必須在彼此之間或外部服務(wù)之間進(jìn)行協(xié)調(diào)只恨,以確定每個(gè)Pod應(yīng)該如何處理译仗。例如,一個(gè)Pod可以從工作隊(duì)列中獲取最多N批的批處理官觅。
    • 每個(gè)Pod都可以獨(dú)立地確定其所有對(duì)等方是否都已完成纵菌,從而確定了整個(gè)Job。
    • 用戶可以指定并行的Pod數(shù)量休涤,當(dāng)任何Pod成功結(jié)束后产艾,不會(huì)再創(chuàng)建新的Pod
    • 一旦至少有一個(gè)Pod成功結(jié)束,并且所有的Pods都結(jié)束了滑绒,該Job就成功結(jié)束。
    • 一旦有一個(gè)Pod成功結(jié)束隘膘,其他Pods都會(huì)準(zhǔn)備退出疑故。

4、Cron Job

  • Cron Job 創(chuàng)建基于時(shí)間調(diào)度的 Jobs弯菊。它是基于時(shí)間進(jìn)行任務(wù)的定時(shí)管理纵势。

  • 一個(gè) CronJob 對(duì)象就像 crontab (cron table) 文件中的一行。

  • 它用 Cron 格式進(jìn)行編寫,周期性钦铁、或在給定的調(diào)度時(shí)間執(zhí)行 Job软舌。

  • 反復(fù)在指定的時(shí)間點(diǎn)運(yùn)行任務(wù):比如定時(shí)進(jìn)行數(shù)據(jù)庫(kù)備份,定時(shí)發(fā)送電子郵件等等牛曹。

4.1 使用Cron Job

  • 準(zhǔn)備YAML文件

    • cronjob.yaml

    這個(gè) cron job 是會(huì)一分鐘創(chuàng)建一個(gè) Job去運(yùn)行佛点,每個(gè) Job的任務(wù)是:

    ? 輸出當(dāng)前時(shí)間

    ? 打印 Hello Cron Job!!!

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo Hello Cron Job!!!
              restartPolicy: OnFailure
    
  • 創(chuàng)建資源

    [root@master-kubeadm-k8s job]# kubectl apply -f cronjob.yaml
    cronjob.batch/hello created
    
  • 查看資源

    # 查看cronjob資源, CronJob 還沒(méi)有調(diào)度或執(zhí)行任何任務(wù)。大約需要一分鐘任務(wù)才能創(chuàng)建好黎比。
    [root@master-kubeadm-k8s job]# kubectl get cronjob
    NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    hello   */1 * * * *   False     0        <none>          11s
    
    # 通過(guò)監(jiān)控Job狀態(tài)來(lái)觀察
    [root@master-kubeadm-k8s job]# kubectl get jobs --watch
    NAME               DESIRED   SUCCESSFUL   AGE
    hello-4111706356   1         1              20s
    
    # 看到了一個(gè)運(yùn)行中的任務(wù)被 “hello” CronJob 調(diào)度超营。
    # 可以停止監(jiān)視這個(gè)任務(wù),然后再次查看 CronJob 就能看到它調(diào)度任務(wù):
    # 能看到 “hello” CronJob 在 LAST-SCHEDULE 聲明的時(shí)間點(diǎn)成功的調(diào)度了一次任務(wù)阅虫。
    # ACTIVE 為 1 表示 Job 已經(jīng)開(kāi)始運(yùn)行
    [root@master-kubeadm-k8s job]# kubectl get cronjob
    NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    hello   */1 * * * *   False     1        21s             2m
    
    # 可以選擇繼續(xù)觀察Job狀態(tài),它會(huì)周期性的去執(zhí)行這個(gè)任務(wù)
    [root@master-kubeadm-k8s job]# kubectl get jobs --watch
    NAME               COMPLETIONS   DURATION   AGE
    hello-1588485600   1/1           57s        3m45s
    hello-1588485660   1/1           44s        2m45s
    hello-1588485720   1/1           58s        105s
    hello-1588485780   0/1           45s        45s
    
  • 刪除CronJob

    刪除 CronJob 會(huì)清除它創(chuàng)建的所有任務(wù)和 Pod演闭,并阻止它創(chuàng)建額外的任務(wù)。

    [root@master-kubeadm-k8s job]# kubectl delete cronjob hello
    cronjob.batch "hello" deleted
    

5颓帝、Horizontal Pod Autoscaler

  • HPA(Horizontal Pod Autoscaler)特性米碰, 是可以基于CPU利用率自動(dòng)伸縮 replication controller、deployment和 replica set 中的 pod 數(shù)量购城,(除了 CPU 利用率)也可以 基于其他應(yīng)程序提供的度量指標(biāo)custom metrics吕座。

  • pod 自動(dòng)擴(kuò)縮容不適用于無(wú)法擴(kuò)縮容的對(duì)象,比如 DaemonSets工猜。

  • Pod 水平自動(dòng)伸縮特性由 Kubernetes API 資源和控制器實(shí)現(xiàn)米诉。資源決定了控制器的行為。

  • 控制器會(huì)周期性的獲取平均 CPU 利用率篷帅,并與目標(biāo)值相比較后來(lái)調(diào)整 replication controller 或 deployment 中的副本數(shù)量史侣。

5.1 Horizontal Pod Autoscaler的使用

  • 提前準(zhǔn)備一個(gè)YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
    
  • 創(chuàng)建資源

    [root@master-kubeadm-k8s hpa]# kubectl apply -f test-hpa.yaml
    deployment.apps/nginx-deployment created
    
  • 查看資源

    # 3個(gè)副本數(shù)
    [root@master-kubeadm-k8s hpa]# kubectl get deploy
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   3/3     3            3           2m43s
    
    
  • 手動(dòng)擴(kuò)容

    [root@master-kubeadm-k8s hpa]# kubectl edit -f test-hpa.yaml
    deployment.apps/nginx-deployment edited
    
image.png

修改副本數(shù)為 10

  • 查看資源

    # 這塊就會(huì)動(dòng)態(tài)的增加副本數(shù)為10
    [root@master-kubeadm-k8s hpa]# kubectl get deploy
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   10/10    10           3           3m54s
    
  • 使用HPA

    創(chuàng)建HPA后,HPA會(huì)根據(jù)資源的使用情況魏身,動(dòng)態(tài)的調(diào)整Pod數(shù)量惊橱,但范圍是由用戶控制的

    # 創(chuàng)建HPA, 使nginx pod的數(shù)量介于2和10之間,CPU使用率維持在50%
    [root@master-kubeadm-k8s hpa]# kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=50
    horizontalpodautoscaler.autoscaling/nginx-deployment autoscaled
    

    如果想要測(cè)試的話箭昵,可以用JMetter之類的工具去并發(fā)訪問(wèn)税朴,我這里沒(méi)有準(zhǔn)備項(xiàng)目,就通過(guò)手動(dòng)調(diào)整的方式來(lái)判斷HPA是否生效

    • 查看HPA

      [root@master-kubeadm-k8s hpa]# kubectl get hpa
      NAME               REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
      nginx-deployment   Deployment/nginx-deployment   <unknown>/50%   2         10        10         29s
      
    • 調(diào)整副本數(shù)為15

      image.png
  • 查看資源

    # 調(diào)整完成后發(fā)現(xiàn)還是10個(gè), 因?yàn)镠PA限制了它最大可以運(yùn)行的副本數(shù)為 10
    [root@master-kubeadm-k8s hpa]# kubectl get deploy
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   10/10   10           10          5m
    

5.2 HPA工作機(jī)制

HPA實(shí)際就是管理RC或Deployment家制,通過(guò)他們來(lái)進(jìn)行動(dòng)態(tài)的擴(kuò)縮容正林。它可以根據(jù)CPU使用率或應(yīng)用自定義metrics自動(dòng)擴(kuò)展Pod數(shù)量(支持replication controller、deployment和replica set)

  • 控制管理器每隔15s查詢metrics的資源使用情況
  • 通過(guò)kubectl創(chuàng)建一個(gè)horizontalPodAutoscaler對(duì)象颤殴,并存儲(chǔ)到etcd中
  • APIServer: 負(fù)責(zé)接受創(chuàng)建hpa對(duì)象觅廓,然后存入etcd
image.png

6、Resource

  • 因?yàn)镵8S的最小操作單元是Pod涵但,所以這里主要討論的是Pod的資源杈绸。

  • 當(dāng)使用Pod帖蔓,可以指定每個(gè)容器需要多少資源,以及限制容器可以使用的資源瞳脓。

  • 最常見(jiàn)資源是CPU和內(nèi)存(RAM)塑娇。

6.1 reques 與 limit

  • 如果運(yùn)行Pod的節(jié)點(diǎn)有足夠的可用資源,則容器有可能(允許)使用比該request資源指定的資源更多的資源劫侧。但是埋酬,容器不能使用超出其資源的范圍limit

    • 例如板辽,如果為一個(gè)容器設(shè)置了256 MiB 的memory的請(qǐng)求奇瘦,并且該容器位于已分配到具有8GiB內(nèi)存且沒(méi)有其他Pod的節(jié)點(diǎn)的Pod中,則該容器可以嘗試使用更多的RAM劲弦。
  • 如果為該容器設(shè)置了4GiB的memory限制耳标,則kubelet(以及 容器運(yùn)行時(shí))會(huì)強(qiáng)制執(zhí)行該限制。運(yùn)行時(shí)可防止容器使用超出配置的資源限制的容器邑跪。

    • 例如:當(dāng)容器中的進(jìn)程嘗試消耗的內(nèi)存量超過(guò)允許的數(shù)量時(shí)次坡,系統(tǒng)內(nèi)核將終止嘗試分配的進(jìn)程,并出現(xiàn)內(nèi)存不足(OOM)錯(cuò)誤画畅。
  • 可以以反應(yīng)方式實(shí)施限制(一旦發(fā)現(xiàn)違規(guī)砸琅,系統(tǒng)就會(huì)進(jìn)行干預(yù)),也可以強(qiáng)制實(shí)施(系統(tǒng)防止容器超過(guò)限制)轴踱。不同的運(yùn)行時(shí)可以采用不同的方式來(lái)實(shí)現(xiàn)相同的限制症脂。

6.2 資源的配置項(xiàng)

Pod的每個(gè)容器可以指定以下一項(xiàng)或多項(xiàng):

  • spec.containers[].resources.limits.cpu
  • spec.containers[].resources.limits.memory
  • spec.containers[].resources.limits.hugepages-
  • spec.containers[].resources.requests.cpu
  • spec.containers[].resources.requests.memory
  • spec.containers[].resources.requests.hugepages-

需求:requests 定義容器運(yùn)行時(shí)至少需要資源
限制:limits 定義容器運(yùn)行時(shí)最多能分配的資源

盡管只能在單個(gè)容器上指定請(qǐng)求和限制,但是Pod資源請(qǐng)求和限制很方便淫僻。Pod中每個(gè)Container的該類型資源請(qǐng)求/限制的會(huì)進(jìn)行加總求和诱篷。

6.3 資源單位

  • CPU

    • CPU資源的限制和請(qǐng)求以cpu為單位進(jìn)行度量。

    • Kubernetes中的 1 cpu 相當(dāng)于1個(gè)vCPU / Core(對(duì)于云提供商)和1個(gè)超線程(在裸機(jī)Intel處理器上)雳灵。

      spec.containers[].resources.requests.cpu: 0.5

      表示使用 0.5核 CPU的使用率

    • 表達(dá)式0.1等同于表達(dá)式100m棕所,可以將其理解為“一百毫厘”。有人說(shuō)“一百億”悯辙,這被理解為是同一回事琳省。

      100m ≈ 100mi ≈ 0.1

    • 若表達(dá)式是純數(shù)字格式,例如0.1躲撰,K8S會(huì)將具有小數(shù)點(diǎn)的請(qǐng)求轉(zhuǎn)換為100m针贬,但精度超出了100m 的允許范圍。所以更推薦100m的寫法拢蛋。

    • 盡量使用絕對(duì)數(shù)量的利用率坚踩,而不是相對(duì)數(shù)量。

  • 內(nèi)存

    • 限制和請(qǐng)求都是以內(nèi)存 字節(jié) 為單位瓤狐。

    • 可以使用以下后綴之一將內(nèi)存表示為純整數(shù)或定點(diǎn)整數(shù):E瞬铸,P,T础锐,G嗓节,M,K皆警。

    • 還可以使用兩個(gè)冪的等效項(xiàng):Ei拦宣,Pi,Ti 信姓,Gi鸵隧,Mi,Ki意推。

      • 例如豆瘫,以下內(nèi)容表示大致相同的值:

        128974848, 129e6, 129M, 123Mi

6.4 資源的使用

  • 準(zhǔn)備YAML文件

    以下Pod具有兩個(gè)容器。

    ? 每個(gè)容器都有一個(gè)0.25核cpu和64MiB的內(nèi)存請(qǐng)求菊值。

    ? 每個(gè)容器的限制為0.5核cpu和128MiB的內(nèi)存外驱。

    總和為:

    ? 當(dāng)前Pod的請(qǐng)求為0.5核cpu和128 MiB的內(nèi)存,限制為1核cpu和256MiB的內(nèi)存腻窒。

    apiVersion: v1
    kind: Pod
    metadata:
      name: frontend
    spec:
      containers:
      - name: db
        image: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        resources:
          requests:
            memory: "64Mi"            # 表示需要64Mi內(nèi)存
            cpu: "250m"               # 表示需要0.25核的CPU
          limits:
            memory: "128Mi"           # 表示限制最大內(nèi)存為128Mi
            cpu: "500m"               # 表示限制最大CPU使用率為0.5核
      - name: wp
        image: wordpress
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
    
  • 查看資源

    [root@master-kubeadm-k8s resource]# kubectl describe node worker02-kubeadm-k8s
    
    image.png

7昵宇、Web UI (Dashboard)

  • Dashboard 是基于網(wǎng)頁(yè)的 Kubernetes 用戶界面。

  • 可以使用 Dashboard 將容器應(yīng)用部署到 Kubernetes 集群中儿子,也可以對(duì)容器應(yīng)用排錯(cuò)瓦哎,還能管理集群資源。

  • 可以使用 Dashboard 獲取運(yùn)行在集群中的應(yīng)用的概覽信息柔逼,也可以創(chuàng)建或者修改 Kubernetes 資源(如 Deployment蒋譬,Job,DaemonSet 等等)卒落。

    • 例如羡铲,可以對(duì) Deployment 實(shí)現(xiàn)彈性伸縮、發(fā)起滾動(dòng)升級(jí)儡毕、重啟 Pod 或者使用向?qū)?chuàng)建新的應(yīng)用也切。
  • Dashboard 同時(shí)展示了 Kubernetes 集群中的資源狀態(tài)信息和所有報(bào)錯(cuò)信息。

image.png

7.1 部署Dashboard

默認(rèn)情況下腰湾,K8S不會(huì)安裝Dashboard雷恃,可以手動(dòng)下載yaml文件進(jìn)行安裝

  • yaml文件

    有兩處需要修改

    ? 鏡像地址更好為國(guó)內(nèi)鏡像

    ? 默認(rèn)Dashboard只能集群內(nèi)訪問(wèn),所以使用NodePort方式開(kāi)放端口供外部訪問(wèn)

    apiVersion: v1
    kind: ConfigMap
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        # Allows editing resource and makes sure it is created first.
        addonmanager.kubernetes.io/mode: EnsureExists
      name: kubernetes-dashboard-settings
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        addonmanager.kubernetes.io/mode: Reconcile
      name: kubernetes-dashboard
      namespace: kube-system
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kubernetes-dashboard
      namespace: kube-system
      labels:
        k8s-app: kubernetes-dashboard
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: Reconcile
    spec:
      selector:
        matchLabels:
          k8s-app: kubernetes-dashboard
      template:
        metadata:
          labels:
            k8s-app: kubernetes-dashboard
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ''
            seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
        spec:
          priorityClassName: system-cluster-critical
          containers:
          - name: kubernetes-dashboard
            image: registry.cn-hangzhou.aliyuncs.com/kubernete/kubernetes-dashboard-amd64:v1.8.3
            resources:
              limits:
                cpu: 100m
                memory: 300Mi
              requests:
                cpu: 50m
                memory: 100Mi
            ports:
            - containerPort: 8443
              protocol: TCP
            args:
              # PLATFORM-SPECIFIC ARGS HERE
              - --auto-generate-certificates
            volumeMounts:
            - name: kubernetes-dashboard-certs
              mountPath: /certs
            - name: tmp-volume
              mountPath: /tmp
            livenessProbe:
              httpGet:
                scheme: HTTPS
                path: /
                port: 8443
              initialDelaySeconds: 30
              timeoutSeconds: 30
          volumes:
          - name: kubernetes-dashboard-certs
            secret:
              secretName: kubernetes-dashboard-certs
          - name: tmp-volume
            emptyDir: {}
          serviceAccountName: kubernetes-dashboard
          tolerations:
          - key: "CriticalAddonsOnly"
            operator: "Exists"
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        addonmanager.kubernetes.io/mode: Reconcile
      name: kubernetes-dashboard-minimal
      namespace: kube-system
    rules:
      # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
    - apiGroups: [""]
      resources: ["secrets"]
      resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]
      verbs: ["get", "update", "delete"]
      # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
    - apiGroups: [""]
      resources: ["configmaps"]
      resourceNames: ["kubernetes-dashboard-settings"]
      verbs: ["get", "update"]
      # Allow Dashboard to get metrics from heapster.
    - apiGroups: [""]
      resources: ["services"]
      resourceNames: ["heapster"]
      verbs: ["proxy"]
    - apiGroups: [""]
      resources: ["services/proxy"]
      resourceNames: ["heapster", "http:heapster:", "https:heapster:"]
      verbs: ["get"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: kubernetes-dashboard-minimal
      namespace: kube-system
      labels:
        k8s-app: kubernetes-dashboard
        addonmanager.kubernetes.io/mode: Reconcile
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: kubernetes-dashboard-minimal
    subjects:
    - kind: ServiceAccount
      name: kubernetes-dashboard
      namespace: kube-system
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        # Allows editing resource and makes sure it is created first.
        addonmanager.kubernetes.io/mode: EnsureExists
      name: kubernetes-dashboard-certs
      namespace: kube-system
    type: Opaque
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        # Allows editing resource and makes sure it is created first.
        addonmanager.kubernetes.io/mode: EnsureExists
      name: kubernetes-dashboard-key-holder
      namespace: kube-system
    type: Opaque
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: kubernetes-dashboard
      namespace: kube-system
      labels:
        k8s-app: kubernetes-dashboard
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: Reconcile
    spec:
      selector:
        k8s-app: kubernetes-dashboard
      ports:
      - port: 443
        targetPort: 8443
        nodePort: 30018
      type: NodePort
    
  • 創(chuàng)建資源

    [root@master-kubeadm-k8s dashboard]# kubectl apply -f dashboard.yaml
    configmap/kubernetes-dashboard-settings unchanged
    serviceaccount/kubernetes-dashboard unchanged
    deployment.apps/kubernetes-dashboard created
    role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
    rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
    secret/kubernetes-dashboard-certs created
    secret/kubernetes-dashboard-key-holder created
    service/kubernetes-dashboard created
    
  • 查看資源

    image.png
  • 訪問(wèn)Web UI

    https://192.168.50.113:30018/

    谷歌瀏覽器無(wú)法直接訪問(wèn)费坊,K8S內(nèi)部的一些證書它不支持倒槐,要想用谷歌瀏覽器打開(kāi)dashboard,得手動(dòng)配置一些證書才行附井,具體怎么配讨越,網(wǎng)上一堆两残,這里不演示

    image.png

我這里通過(guò)搜狗瀏覽器打開(kāi)

發(fā)現(xiàn)需要認(rèn)證,有兩種方式把跨,我們選擇Token令牌的方式登錄

image.png
  • 生成Token

    # 創(chuàng)建service account
    [root@master-kubeadm-k8s dashboard]# kubectl create sa dashboard-admin -n kube-system
    serviceaccount/dashboard-admin created
    
    # # 創(chuàng)建角色綁定關(guān)系
    [root@master-kubeadm-k8s dashboard]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
    
    # 查看dashboard-admin的secret名字
    [root@master-kubeadm-k8s dashboard]# ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')
    [root@master-kubeadm-k8s dashboard]# echo ADMIN_SECRET
    ADMIN_SECRET
    
    # 打印secret的token
    [root@master-kubeadm-k8s dashboard]# kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}'
    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4temtsNWoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMGVlZjI5ZDEtOGQzYi0xMWVhLTgyN2EtNTI1NDAwOGFmZWU2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.iFaoyxLbiAxuHT5DXZCt1xUjU2n17I0a7ip2zEY6wEKy6ULhG3I9jByeImETAINzqRsPdiRUwi6Rn-oqoq7_36x-XP4EE7C1EgefJqMWPCvVbC4W3UAG6cfjmAUe-9nc5IwxCIxMX-ZeYcNJ8-QiWNVmCxVgqaN53iqKJAwBvHuNQwyrMDI7tBf5SnjLD5_8_HPtzavRH23QlUjT3X_3DHxzYx03oUoVsijs46u-6n52ZNIfemhMzd751Um57RWzvXtYFsXZsRi_KDppw0AuftX6oajXxJvuquP1HWKxKwo0w93FyjKc0GpGCaMooQOim5957j2PJeYOgLX9q8N_qA
    
  • 登錄Dashboard

    復(fù)制生成的Token登錄

    image.png

Dashboard功能很全面人弓,有了Dashboard我們很多簡(jiǎn)單操作無(wú)需再到宿主機(jī)中去敲命令,直接通過(guò)界面操作即可着逐。

具體的使用這里不錯(cuò)介紹了崔赌,功能很簡(jiǎn)單,多點(diǎn)點(diǎn)多看看就知道怎么玩了耸别。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末健芭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秀姐,更是在濱河造成了極大的恐慌慈迈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊扳,死亡現(xiàn)場(chǎng)離奇詭異吩翻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锥咸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門狭瞎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搏予,你說(shuō)我怎么就攤上這事熊锭。” “怎么了雪侥?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵碗殷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我速缨,道長(zhǎng)锌妻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任旬牲,我火速辦了婚禮仿粹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘原茅。我一直安慰自己吭历,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布擂橘。 她就那樣靜靜地躺著晌区,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朗若,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天恼五,我揣著相機(jī)與錄音,去河邊找鬼捡偏。 笑死唤冈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的银伟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绘搞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼彤避!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起夯辖,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤琉预,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蒿褂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圆米,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年啄栓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娄帖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昙楚,死狀恐怖近速,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堪旧,我是刑警寧澤削葱,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站淳梦,受9級(jí)特大地震影響析砸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爆袍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一首繁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧螃宙,春花似錦蛮瞄、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至堂湖,卻和暖如春闲先,著一層夾襖步出監(jiān)牢的瞬間状土,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工伺糠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒙谓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓训桶,卻偏偏與公主長(zhǎng)得像累驮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舵揭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345