前言
kubernates 1.3出了幾個新的概念,其中包括deployments,Replica Sets,并且官網稱之為是the next-generation Replication Controller。由于NCE項目馬上就要使用其中包括deployments以及RS這個方式來管理pod,是以有必要了解下它的優越性。
回顧老版RC概念
說RC之前先要提一個container和pod,container就是docker中的容器,pod可以了解為一個或者一組container。pod中的container可以進行共享資源。 RC-Replication Controller是一種資源對象,它可以通過json模闆來建立,通過模闆中定義的pod模闆(Templet)來建立相應的帶Lable的pod。RC通過包含的标簽選擇器(Label selector)來管理所有帶相應label的pod。 下面是一個RC的定義模闆檔案:
"kind": "ReplicationController",
"apiVersion": "v1",
"metadata": {
"name": "haohua2aa22-13275-c059ac0f",
"namespace": "90ab293349704831aa3977c450235fe1",
"selfLink": "/api/v1/namespaces/90ab293349704831aa3977c450235fe1/replicationcontrollers/haohua2aa22-13275-c059ac0f",
"uid": "87ee2f1e-4f16-11e6-96bb-fa163e70fcd5",
"resourceVersion": "9565340",
"generation": 1,
"creationTimestamp": "2016-07-21T07:41:26Z",
"labels": {
"name": "haohua2aa22-13275-c059ac0f"
}
},
"spec": {
"replicas": 1,
"selector": {
"name": "haohua2aa22-13275-c059ac0f"
},
"podCreatePolicy": "New",
"template": {
"metadata": {
"name": "haohua2aa22-13275-c059ac0f",
"namespace": "90ab293349704831aa3977c450235fe1",
"creationTimestamp": null,
"labels": {
"name": "haohua2aa22-13275-c059ac0f"
}
},
"spec": {
"containers": [
{
...(此處省略)
],
}
],
}
}
可以看到這個RC裡面包含了一個容器的pod:haohua2aa22-13275-c059ac0f,該pod有1個副本( "replicas": 1,)。 pod的模闆檔案中有一個labels辨別pod是屬于哪個rc
"labels": {
"name": "haohua2aa22-13275-c059ac0f"
},
RC内pod變更大概有幾種場景:
1.通過設定副本個數可以動态的調整pod資源,如果将replicas設定為2,則控制器會自動去建立一個pod并且标簽也設定為haohua2aa22-13275-c059ac0f。
2.如果想删除資源,則需要将replicas設定為0,這時候控制器就會自動删除pod副本資源。需要注意如果直接删除RC,pod資源是不會被清理的。
3.如果想更新service内rc中的pod,則需要用rolling Updates滾動更新模式,即逐個替換pod的方式來支援service的滾動更新,建立一個隻有1個pod的rc,若新的rc副本數量加1,則舊的rc副本數減1,直到舊的rc副本數量為0,則删除舊的rc。
deployments&RS概念
deployments是用來為pods和Replica Sets提供更新用的。Replica Sets被官網稱之為下一代的RC,可見取而代之的決心,Replica Set 和Replication Controller僅有的差別是slector的支援,RS支援新的基于集合( set-based)的選擇器,而RC隻支援基于相等( equality-based )的選擇器。
這邊的兩個概念基于集合( set-based);基于相等( equality-based ) 怎麼來了解呢。
基于相等的就是說隻能通過兩種操作來設定:
environment = production
tier != frontend
基于集合的不隻是包含等于和不等于兩種規則,還可以包含 in 和notin的方式來篩選。
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
下面來看看kubernetes 1.3的deployments是如何用模闆檔案定義的 這是一個官網的3的deployments是如何用模闆檔案定義的例子,我在1.3的環境下試着用指令建立了1個deployment
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
kubectl create -f /root/cxq/jsonxml/nginx-deployment.yaml
deployment "nginx-deployment" created
root@qa-control-master2-cluster-21:~/cxq/jsonxml# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 0 12s
這個時候查詢目前的rs,發現多了一個名字跟deployment有點關聯性的rs
root@qa-control-master2-cluster-21:~/cxq/jsonxml# kubectl get rs
NAME DESIRED CURRENT AGE
nginx-deployment-1159050644 3 3 8m
在後面随機加了一串數字。 檢查rs的json說明檔案,看下跟之前的rc有什麼差別【重點在此,請注意】:
kubectl get rs -o json
{
"kind": "List",
"apiVersion": "v1",
"metadata": {},
"items": [
{
"kind": "ReplicaSet",
"apiVersion": "extensions/v1beta1",
"metadata": {
"name": "nginx-deployment-1159050644",
"namespace": "default",
"selfLink": "/apis/extensions/v1beta1/namespaces/default/replicasets/nginx-deployment-1159050644",
"uid": "57fd01cc-4f29-11e6-9cce-fa163ee959c4",
"resourceVersion": "179452",
"generation": 1,
"creationTimestamp": "2016-07-21T09:56:06Z",
"labels": {
"app": "nginx",
"pod-template-hash": "1159050644"
},
"annotations": {
"deployment.kubernetes.io/revision": "1"
}
},
"spec": {
"replicas": 3,
"selector": {
"matchLabels": {
"app": "nginx",
"pod-template-hash": "1159050644"
}
},
"template": {
"metadata": {
"creationTimestamp": null,
"labels": {
"app": "nginx",
"pod-template-hash": "1159050644"
}
},
"spec": {
"containers": [
{
...(此處省略)
}
}
},
}
]
}
可以看到labels的值不是隻有一條name:value的格式,而是有兩條。
"labels": {
"app": "nginx",
"pod-template-hash": "1159050644"
}
說明app=nginx或者包含nginx的都可以被篩選出來作為rs的pod 檢視pod,并且模拟selector的篩選方式實驗一下
目前系統有4個pod,其中前3個屬于建立的rs
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-1159050644-kg654 1/1 Running 0 4m 192.168.5.10 10.180.217.225
nginx-deployment-1159050644-x6wk8 1/1 Running 0 4m 192.168.5.8 10.180.217.225
nginx-deployment-1159050644-z2kqi 1/1 Running 0 3h 192.168.5.6 10.180.217.225
test-5-5tcql 1/1 Running 0 1d 192.168.5.2 10.180.217.225
使用過濾器equality-based方法篩選,可以準确的篩選出來3條app=nginx的pod
root@qa-control-master2-cluster-21:~/cxq/jsonxml# kubectl get pod -o wide -l app=nginx
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-1159050644-kg654 1/1 Running 0 5m 192.168.5.10 10.180.217.225
nginx-deployment-1159050644-x6wk8 1/1 Running 0 5m 192.168.5.8 10.180.217.225
nginx-deployment-1159050644-z2kqi 1/1 Running 0 3h 192.168.5.6 10.180.217.225
使用過濾器set-based方式篩選,看下能否篩選出來
使用in的規則篩選,則篩選出app中包含nginx的pod
root@qa-control-master2-cluster-21:~/cxq/jsonxml# kubectl get pod -o wide -l 'app in (nginx)'
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-1159050644-kg654 1/1 Running 0 6m 192.168.5.10 10.180.217.225
nginx-deployment-1159050644-x6wk8 1/1 Running 0 6m 192.168.5.8 10.180.217.225
nginx-deployment-1159050644-z2kqi 1/1 Running 0 3h 192.168.5.6 10.180.217.225
使用notin規則,篩選出來app不包含nginx的pod(剩餘的1條)
root@qa-control-master2-cluster-21:~/cxq/jsonxml# kubectl get pod -o wide -l 'app notin (nginx)'
NAME READY STATUS RESTARTS AGE IP NODE
test-5-5tcql 1/1 Running 0 1d 192.168.5.2 10.180.217.225
總結
簡單來說 rs的selector選擇器多了兩種除了相等和非相等之外的篩選模式,使得篩選和管理pod更為靈活。
本文來自網易雲社群,經作者崔曉晴授權釋出。
原文位址:kubernetes 1.3管中窺豹- RS(Replica Sets):the next-generation Replication Controller
更多網易研發、産品、營運經驗分享請通路網易雲社群。