上一章對(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 代理震桶,或 Gangliagmond
。
上面的說(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的!
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)建順序
通過(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"
注意
Job
的RestartPolicy
只支持Never
和OnFailure
兩種汗侵,不支持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
修改副本數(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
-
-
查看資源
# 調(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
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
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ò)信息。
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
-
查看資源
-
訪問(wèn)Web UI
https://192.168.50.113:30018/
谷歌瀏覽器無(wú)法直接訪問(wèn)费坊,K8S內(nèi)部的一些證書它不支持倒槐,要想用谷歌瀏覽器打開(kāi)dashboard,得手動(dòng)配置一些證書才行附井,具體怎么配讨越,網(wǎng)上一堆两残,這里不演示
我這里通過(guò)搜狗瀏覽器打開(kāi)
發(fā)現(xiàn)需要認(rèn)證,有兩種方式把跨,我們選擇Token令牌的方式登錄
-
生成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登錄
Dashboard功能很全面人弓,有了Dashboard我們很多簡(jiǎn)單操作無(wú)需再到宿主機(jī)中去敲命令,直接通過(guò)界面操作即可着逐。
具體的使用這里不錯(cuò)介紹了崔赌,功能很簡(jiǎn)單,多點(diǎn)點(diǎn)多看看就知道怎么玩了耸别。