kubernetes簡介
成都創(chuàng)新互聯(lián)專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,四川移動機房托管,四川移動機房托管,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。kubernetes,簡稱K8s,是用8代替8個字符“ubernete”而成的縮寫。是一個開源的,用于管理云平臺中多個主機上的容器化的應(yīng)用,Kubernetes的目標是讓部署容器化的應(yīng)用簡單并且高效(powerful),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護的一種機制。
Pod簡介
Pod是Kubernetes創(chuàng)建或部署的最小/最簡單的基本單位,一個Pod代表集群上正在運行的一個進程。
一個Pod封裝一個應(yīng)用容器(也可以有多個容器),存儲資源、一個獨立的網(wǎng)絡(luò)IP以及管理控制容器運行方式的策略選項。Pod代表部署的一個單位:Kubernetes中單個應(yīng)用的實例,它可能由單個容器或多個容器共享組成的資源。
通常情況下,使用的都是k8s默認的調(diào)度調(diào)度方式,但是在有些情況下,我們需要將pod運行在具有特點的標簽的node上才能都運行,這個時候,pod的調(diào)度策略就不能使用k8s默認的調(diào)度策略了,這個時候,就需要指定調(diào)度策略,告訴k8s需要將pod調(diào)度到那些node(節(jié)點)上。
nodeSelector
常規(guī)情況下,會直接使用nodeSelector這種調(diào)度策略。labels(標簽) 是k8s里面用來編標記資源的一種常用的方式,我們可以給node標記特殊的標簽,然后nodeSelector會將pod調(diào)度到帶有指定labels的node上的。
下面看個示例:
首先,查看node的label信息,通過下面的命令查看的 node 的 label:
$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 147d v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,node-role.kubernetes.io/master=
node02 Ready <none> 67d v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,course=k8s,kubernetes.io/hostname=node02
node03 Ready <none> 127d v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,jnlp=haimaxy,kubernetes.io/hostname=node03
然后,可以給node02節(jié)點新增一個label:
$ kubectl label nodes node02 com=yijiadashuju
node "node02" labeled
然后通過上面的--show-labels參數(shù)可以查看上述標簽是否生效。當 node 被打上了相關(guān)標簽后,在調(diào)度的時候就可以使用這些標簽了,只需要在 Pod 的spec字段中添加nodeSelector字段,里面是我們需要被調(diào)度的節(jié)點的 label 即可。比如,要將 Pod 我們要強制調(diào)度到 node02 這個節(jié)點上去,可以使用 nodeSelector 來表示了:(pod-selector-demo.yaml)
apiVersion: v1
kind: Pod
metadata:
labels:
app: busybox-pod
name: test-busybox
spec:
containers:
- command:
- sleep
- "3600"
image: busybox
imagePullPolicy: Always
name: test-busybox
nodeSelector:
com: yijiadashuju
然后,執(zhí)行pod-selector-demo.yaml文件后,可以通過下面的命令查看pod運行的節(jié)點信息
kubectl get pod -o wide -n default
也可以使用description命令查看pod被調(diào)度到哪個節(jié)點上:
$ kubectl create -f pod-selector-demo.yaml
pod "test-busybox" created
$ kubectl describe pod test-busybox
Name: test-busybox
Namespace: default
Node: node02/10.151.30.63
......
QoS Class: BestEffort
Node-Selectors: com=youdianzhishi
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulMountVolume 55s kubelet, node02 MountVolume.SetUp succeeded for volume "default-token-n9w2d"
Normal Scheduled 54s default-scheduler Successfully assigned test-busybox to node02
Normal Pulling 54s kubelet, node02 pulling image "busybox"
Normal Pulled 40s kubelet, node02 Successfully pulled image "busybox"
Normal Created 40s kubelet, node02 Created container
Normal Started 40s kubelet, node02 Started container
從上面的執(zhí)行結(jié)果可以看出,pod 通過默認的 default-scheduler 調(diào)度器到了node02節(jié)點上。不過,這種調(diào)度方式屬于強制性的。如果node02上的資源不足,那么pod的狀態(tài)將會一直是pending狀態(tài)。這就是nodeselector的用法了。
通過上面的介紹,可以看出nodeselector使用起來非常方便,但是還有很多的不足,那就是不夠靈活,控制粒度偏大,在實際使用中還是有許多的不便。接下來一起看先親和性和反親和性調(diào)度。
k8s的默認調(diào)度流程實際上是經(jīng)過了兩個階段:predicates 和 priorities 。使用默認的調(diào)度流程的話,k8s會將pod調(diào)度到資源充裕的節(jié)點上,使用nodeselector的調(diào)度方法,又會將pod調(diào)度具有指定標簽的pod上。然后在實際生產(chǎn)環(huán)ongoing境中,我們需要將pod調(diào)度到具有默些label的一組node才能滿足實際需求,這個時候就需要nodeAffinity(節(jié)點親和性)、podAffinity(pod 親和性) 以及 podAntiAffinity(pod 反親和性)。
親和性可以分為具體可以細分為硬和軟兩種親和性,
軟親和性:如果調(diào)度的時候,沒有滿足要求,也可以繼續(xù)調(diào)度,即能滿足最好,不能也無所謂
硬親和性:是指調(diào)度的時候必須滿足特定的要求,如果不滿足,那么pod將不會被調(diào)度到當前node
規(guī)則可以設(shè)置:
軟策略: preferredDuringSchedulingIgnoredDuringExecution
硬策略: requiredDuringSchedulingIgnoredDuringExecution
nodeAffinity 節(jié)點親和性
節(jié)點親和性主要是用來控制 pod 能部署在哪些節(jié)點上,以及不能部署在哪些節(jié)點上的。它可以進行一些簡單的邏輯組合了,不只是簡單的相等匹配。
接下來看一個示例,使用 Deployment 來管理3個 pod 副本,使用nodeAffinity控制 pod 的調(diào)度,如下例子:(node-affinity-demo.yaml)
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: affinity
labels:
app: affinity
spec:
replicas: 3
revisionHistoryLimit: 15
template:
metadata:
labels:
app: affinity
role: test
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: nginxweb
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 硬策略
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- node03
preferredDuringSchedulingIgnoredDuringExecution: # 軟策略
- weight: 1
preference:
matchExpressions:
- key: com
operator: In
values:
- yijiadashuju
這個pod調(diào)度的時候,首先要求不能運行在node03節(jié)點上,但是如果有節(jié)點滿足labels為com:yijiadashuju 的話,就會優(yōu)先調(diào)度到這個節(jié)點上。
接下來看下節(jié)點信息:
$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 154d v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,node-role.kubernetes.io/master=
node02 Ready <none> 74d v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,com=yijiadashuju,course=k8s,kubernetes.io/hostname=node02
node03 Ready <none> 134d v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,jnlp=haimaxy,kubernetes.io/hostname=node03
可以看到 node02 節(jié)點有com=yijiadashuju的 label,按要求會優(yōu)先調(diào)度到這個節(jié)點,接下來創(chuàng)建 pod,然后使用descirbe命令查看調(diào)度情況。
$ kubectl create -f node-affinity-demo.yaml
deployment.apps "affinity" created
$ kubectl get pods -l app=affinity -o wide
NAME READY STATUS RESTARTS AGE IP NODE
affinity-7b4c946854-5gfln 1/1 Running 0 47s 10.244.4.214 node02
affinity-7b4c946854-l8b47 1/1 Running 0 47s 10.244.4.215 node02
affinity-7b4c946854-r86p5 1/1 Running 0 47s 10.244.4.213 node02
從結(jié)果可以看到 pod 均被部署到了 node02節(jié)點。
現(xiàn)在Kubernetes提供的操作符有下面的幾種
In:label 的值在某個標簽中
NotIn:label 的值不在某個標簽中
Gt:label 的值大于某個值
Lt:label 的值小于某個值
Exists:某個 label 存在
DoesNotExist:某個 label 不存在
如果nodeSelectorTerms下面有多個選項的話,滿足任何一個條件就可以了;如果matchExpressions有多個選項的話,則必須同時滿足這些條件才能正常調(diào)度 POD。
pod的親和性主要用來解決pod可以和哪些pod部署在同一個集群里面,即拓撲域(由node組成的集群)里面;而pod的反親和性是為了解決pod不能和哪些pod部署在一起的問題,二者都是為了解決pod之間部署問題。需要注意的是,Pod 間親和與反親和需要大量的處理,這可能會顯著減慢大規(guī)模集群中的調(diào)度,不建議在具有幾百個節(jié)點的集群中使用,而且Pod 反親和需要對節(jié)點進行一致的標記,即集群中的每個節(jié)點必須具有適當?shù)臉撕災(zāi)軌蚱ヅ?nbsp;topologyKey。如果某些或所有節(jié)點缺少指定的 topologyKey 標簽,可能會導致意外行為。
下面是pod間親和的示例:
pods/pod-with-pod-affinity.yaml:
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: failure-domain.beta.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: k8s.gcr.io/pause:2.0
下面是一個pod反親和yaml文件示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
app: store
replicas: 3
template:
metadata:
labels:
app: store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章標題:kubernetes中pod資源的調(diào)度-創(chuàng)新互聯(lián)
瀏覽路徑:http://www.rwnh.cn/article34/dpegse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、品牌網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、標簽優(yōu)化、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)