您好,登錄后才能下訂單哦!
標簽的主要作用:解決同類型的資源對象越來越多,為了更好的管理,按照標簽分組;
常用的標簽分類:
- release(版本):stable(穩定版)、canary(金絲雀版本、可以理解為測試版)、beta(測試版)
- environment(環境變量):dev(開發)、qa(測試)、production(生產)
- application(應用):ui、as(應用軟件)、pc、sc
- tier(架構層級):frontend(前端)、backend(后端)、cache(緩存、隱藏)
- partition(分區):customerA(客戶A)、customerB(客戶B)
- track(品控級別):daily(每天)、weekly(每周)
K8s集群中雖然沒有對有嚴格的要求,但是標簽還是要做到:見名知意!方便自己也方便別人!
常用的命令有:
[root@master yaml]# kubectl get pod --show-labels //顯示pod的標簽
[root@master yaml]# kubectl get pod -L env //顯示鍵對應的值
[root@master yaml]# kubectl get pod -l env //通過小l查看僅包含env標簽的資源
[root@master yaml]# kubectl get pod -l env --show-labels //顯示對應的鍵值
[root@master yaml]# kubectl label pod labels app=pc //給pod打標簽
[root@master yaml]# kubectl label pod labels app- //去除標簽
[root@master yaml]# kubectl label pod labels env=dev --overwrite //修改標簽內容
標簽與標簽選擇器的關系:
- 如果標簽有多個,標簽選擇器選擇其中一個,也可以關聯成功!
- 如果選擇器有多個,那么標簽必須滿足標簽選擇器的條件,才可關聯成功!
標簽選擇器:標簽的查詢過濾條件
基于等值關系的(equality-based):”=“、”==“、”!=“前兩個等于,最后一個不等于
基于集合關系(set-based):in、notin、exists三種;
selector:
matchLables: //指定等值關系的標簽選擇器
app: nginx
matchExpressions: //基于集合的標簽選擇器。選擇器列表間為”邏輯與“關系;使用In或NotIn操作是,其values不強制要求為空的字符串列表,而使用Exists或DostNotExists時,其values必須為空;
- {key: name,operator: In,values: [zhangsan,lisi]}
- {key: age,operator: Exists,values:}
使用標簽選擇器的邏輯:
- 同時指定的多個選擇器之間的邏輯關系為”與“操作;
- 使用空值的標簽選擇器意味著每個資源對象都將被選擇中;
- 空的標簽選擇器無法選中任何資源;
Pod控制器基本概念:
Pod是kubernetes的最小單元,自主式創建的pod刪除就沒有了,但是通過資源控制器創建的pod如果刪除還會重建。pod控制器就是用于實現代替我們去管理pod的中間層,并幫我們確保每一個pod資源處于我們所定義或者所期望的目標狀態,pod資源出現故障首先要重啟容器,如果一直重啟有問題的話會基于某種策略重新編排。自動適應期望pod數量。
Kubernetes中內建了很多controller(控制器),這些相當于?個狀態機,?來控制Pod的具體狀態和?為。
Pod控制器有很多種類型,但是目前kubernetes中常用的控制器有:
- Replication Controller(RC):是Kubernetes系統中的核心概念,用于定義Pod副本的數量。在Master內,RC進程通過RC的定義來完成Pod的創建、監控、啟停等操作。根據RC定義,Kubernetes能夠確保在任意時刻都能運行用于指定的Pod"副本"(Replica)數量。隨著kubernetes的迭代更新,RC即將被廢棄,逐漸被ReplicaSet替代;
- ReplicaSet(RS):它的核心作用是代用戶創建指定數量的Pod副本,并確定Pod副本一直處于滿足用戶期望數量的狀態,多退少補,同時支持擴縮容機制。主要有三個組件:用戶期望的Pod副本數量;標簽選擇器,選擇屬于自己管理和控制的Pod;當前Pod數量不滿足用戶期望數量時,根據資源模板進行新建;
- Deployment:工作在ReplicaSet之上,用于管理無狀態應用,除了ReplicaSet的機制,還增加了滾動更新和回滾功能,提供聲明式配置;
- DaemonSet:用于確保集群中的每一個節點只運行特定的pod副本,通常用于實現系統級后臺任務。比如ELK服務。要求:服務是無狀態的;服務必須是守護進程;
Pod控制器通常包含三個組成部分:
基本概念
Replication Controller 簡稱RC,它能確保任何時候Kubernetes集群中有指定數量的pod副本(replicas)在運行, 如果少于指定數量的pod副本(replicas),Replication Controller會啟動新的Container,反之會殺死多余的以保證數量不變。Replication Controller使用預先定義的pod模板創建pods,一旦創建成功,pod 模板和創建的pods沒有任何關聯,可以修改pod 模板而不會對已創建pods有任何影響,也可以直接更新通過Replication Controller創建的pods。對于利用pod 模板創建的pods,Replication Controller根據label selector來關聯,通過修改pods的label可以刪除對應的pods。
最初Replication Controller 是用于復制和在異常時重新調度節點的唯一kubernetes組件,后來逐漸被replicaSet代替了。現在基本上很少見到Replication Controller,它即將被廢棄。但是有的kubernates容器環境還是有可能會有RC,所以還是有必要知道它的用法。
根據Replication Controller的定義,Kubernetes能夠確保在任意時刻都能運行用于指定的Pod"副本"(Replica)數量。如果有過多的Pod副本在運行,系統就會停掉一些Pod;如果運行的Pod副本數量太少,系統就會再啟動一些Pod,總之,通過RC的定義,Kubernetes總是保證集群中運行著用戶期望的副本數量。
Replication Controller(RC)的特點:
- 確保Pod數量;
- 確保Pod健康;
- 彈性伸縮;
- 滾動更新;
應用示例
[root@master yaml]# vim rc.yaml
kind: ReplicationController
apiVersion: v1
metadata:
name: http-rc
spec:
replicas: 2
selector:
name: http-rc
template:
metadata:
labels:
name: http-rc
spec:
containers:
- name: http-rc
image: httpd
[root@master yaml]# kubectl apply -f rc.yaml
[root@master yaml]# kubectl get rc http-rc
NAME DESIRED CURRENT READY AGE
http-rc 2 2 2 103s
[root@master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
http-rc-l2sp6 1/1 Running 0 98s 10.244.1.5 node01 <none> <none>
http-rc-xghkm 1/1 Running 0 98s 10.244.2.5 node02 <none> <none>
[root@master yaml]# kubectl delete -f rc.yaml
基本概念
ReplicaSet是Replication Controller的替代者,確保Pod副本數在任一時刻都精確滿足期望值。用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod來替代;而如果異常多出來的容器也會自動回收。雖然ReplicaSet可以獨立使用,但一般還是建議使用 Deployment 來自動管理ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet不支持rolling-update但Deployment支持)。也就是說Replicaset通常不會直接創建,而是在創建最高層級的deployment資源時自動創建。
RS與RC相比,RS不僅支持等值的標簽器,而且還支持基于集合的標簽選擇器;
ReplicaSet(RS)主要功能:
- 確保Pod數量;
- 確保Pod健康;
- 彈性伸縮;
- 滾動更新;
應用示例
[root@master yaml]# cat rs.yaml
kind: ReplicaSet
apiVersion: apps/v1
metadata:
name: http-rs
spec:
replicas: 2
selector:
matchLabels:
name: http-rs
template:
metadata:
labels:
name: http-rs
spec:
containers:
- name: http-rs
image: httpd
[root@master yaml]# kubectl apply -f rs.yaml
[root@master yaml]# kubectl get rs http-rs
NAME DESIRED CURRENT READY AGE
http-rs 2 2 2 11s
[root@master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
http-rs-2sstf 1/1 Running 0 19s 10.244.1.6 node01 <none> <none>
http-rs-jm8ph 1/1 Running 0 19s 10.244.2.6 node02 <none> <none>
[root@master yaml]# kubectl delete -f rs.yaml
根據上面的yaml文件可以看出,ReplicaSet和Replication Controller的template部分是一樣的,但是selector處不一樣。Replication Controller用selector , ReplicaSet用 selector.matchLables選擇器 ,這樣更簡單,更具有表達力!
RS支持的spec.selector 支持matchLabels和matchExpressions兩種匹配機制!
ReplicaSet 與 Replication Controller 的區別
- ReplicaSet 標簽選擇器的能力更強;
- Replication Controller只能指定標簽名:標簽值;
- Replicaset 可以指定env=pro,env=devel ,也可以指定只要包含env標簽就行,理解為env=*;
總之,目前來說,RS可以代替RC的所有的功能,而且RC已經處于快被淘汰的邊緣!
基本概念
Deployment構建于ReplicaSet之上,支持事件和狀態查看、回滾、版本記錄、暫停和啟動升級;Deployment有多種自動更新方案:Recreate,先刪除再新建;RollingUpdate,滾動升級,逐步替換。Deployment為Pod和Replica Set(下一代Replication Controller)提供聲明式更新,它可以更加方便的管理Pod和Replica Set。只需要在 Deployment 中描述想要的目標狀態是什么,Deployment controller 就會幫您將 Pod 和ReplicaSet 的實際狀態改變到您的目標狀態。此外,也可以定義一個全新的 Deployment 來創建 ReplicaSet 或刪除已有Deployment 并創建一個新的來替換。
Deployment控制器典型的應用如下:
- 使用Deployment來創建ReplicaSet (即RS)。RS在后臺創建pod。檢查啟動狀態,看它是成功還是失敗;
- 接著通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態;這會創建一個新的RS,Deployment會按照控制的速率將pod從舊的RS移動到新的RS中;
- 如果當前狀態不穩定,回滾到之前的Deployment revision。每次回滾都會更新Deployment的revision;
- 擴容Deployment以滿足更高的負載;
- 暫停Deployment來應用PodTemplateSpec的多個修復,然后恢復上線;
- 根據Deployment 的狀態判斷上線是否hang住了;
- 清除舊的不必要的 ReplicaSet;
Deployment和RC、RS一樣都是Kubernetes的一個核心內容,主要職責同樣是為了保證pod的數量和健康,90%的功能與Replication Controller完全一樣,可以看做新一代的Replication Controller。
但是,它又具備了Replication Controller之外的新特性:
- RC的全部功能;
- 事件和狀態查看;
- 回滾;
- 版本記錄;
- 暫停和啟動;
- 多種升級方案;
一般情況下,個人推薦使用Deployment!
應用示例
[root@master yaml]# cat deployment.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: http-deployment
spec:
replicas: 2
selector:
matchLabels:
name: http-deployment
template:
metadata:
labels:
name: http-deployment
spec:
containers:
- name: http-deployment
image: httpd
[root@master yaml]# kubectl apply -f deployment.yaml
[root@master yaml]# kubectl get deployments. http-deployment
NAME READY UP-TO-DATE AVAILABLE AGE
http-deployment 2/2 2 2 9s
[root@master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
http-deployment-548ddf7b65-77vfk 1/1 Running 0 18s 10.244.1.7 node01 <none> <none>
http-deployment-548ddf7b65-hdczk 1/1 Running 0 18s 10.244.2.7 node02 <none> <none>
[root@master yaml]# kubectl delete -f deployment.yaml
基本概念
DaemonSet確保全部(或者一些)Node節點上運行一個Pod 的副本,可使用節點選擇器及節點標簽指定Pod僅在部分Node節點運行。當有Node加入集群時,會為他們新增一個Pod;當有Node從集群移除時,這些Pod也會被回收。刪除 DaemonSet將會刪除它創建的所有Pod。DaemonSet常用于存儲、日志、監控類守護進程。
DeamonSet簡單的用法是,在所有的 Node 上都存在一個 DaemonSet,將被作為每種類型的 daemon 使用。 一個稍微復雜的用法可能是,對單獨的每種類型的 daemon 使用多個 DaemonSet,但具有不同的標志,和/或對不同硬件類型具有不同的內存、CPU要求。
應用示例
[root@master yaml]# cat ds.yaml
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: http-ds
spec:
selector:
matchLabels:
name: http-ds
template:
metadata:
labels:
name: http-ds
spec:
containers:
- name: http-ds
image: httpd
[root@master yaml]# kubectl apply -f ds.yaml
daemonset.extensions/http-ds created
[root@master yaml]# kubectl get ds http-ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
http-ds 2 2 2 2 2 <none> 17s
[root@master yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
http-ds-gkscx 1/1 Running 0 39s
http-ds-nbq69 1/1 Running 0 39s
[root@master yaml]# kubectl delete -f ds.yaml
注意:DaemonSet中不可寫replicas(副本)數量。它會根據當前k8s集群中的node自動生成!
——————————本文到此結束,感謝閱讀——————————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。