pod學(xué)習(xí)3


node 節(jié)點選擇器


我們在創(chuàng)建 pod 資源的時候,pod 會根據(jù) schduler 進(jìn)行調(diào)度,那么默認(rèn)會調(diào)度到隨機(jī)的一個工

作節(jié)點,如果我們想要 pod 調(diào)度到指定節(jié)點或者調(diào)度到一些具有相同特點的 node 節(jié)點,怎么辦呢?

可以使用

pod 中的 nodeName 或者 nodeSelector 字段指定要調(diào)度到的 node 節(jié)點

1、nodeName:

指定

pod 節(jié)點運行在哪個具體 node


cat pod-node.yaml

apiVersion: v1? ?#pod屬于k8s核心組v1

kind: Pod? ? ? ? ?#創(chuàng)建的是一個pod資源? ?

metadata:? ? ? ? #元數(shù)據(jù)

? name: demo-pod1? #pod名字

? namespace: default? ?#pod所屬的名稱空間

? labels:? ? ?#標(biāo)簽

? ? app: myapp? ?#pod具有的標(biāo)簽

? ? env: dev? ? ? ? ? #pod具有的標(biāo)簽

spec:

? nodeName: god64

? containers:? ? ? ? ?#定義一個容器,容器是獨享列表

? - name: tomcat-pod-java? ?#容器名字

? ? ports:

? ? - containerPort: 8080? ? #容器內(nèi)部的port

?的? ? image: tomcat:8.5-jre8-alpine? #容器使用的景象

? ? imagePullPolicy: IfNotPresent? ? ? ?#容器拉取的策略

? - name: busybox

? ? image: busybox:latest

? ? command:? ? ? ?#command是一個列表,定義的時候下面的參數(shù)加橫線

? ? - "/bin/sh"

? ? - "-c"

? ? - "sleep 3600"

#kubectl apply -f?pod-node.yaml

#kubectl get pods -o wide 查看調(diào)度到哪里了

#優(yōu)雅刪除

kubectl delete -f pod-node.yaml

#強(qiáng)制刪除

kubectl delete -f pod-node.yaml --force --grace-period=0


2、nodeSelector:

指定?

pod?調(diào)度到具有哪些標(biāo)簽的?node?節(jié)點上

#給?node?節(jié)點打標(biāo)簽,打個具有?disk=ceph?的標(biāo)簽

kubectl label nodes god62 disk=ceph

kubectl get nodes god62 --show-labels

#定義?pod?的時候指定要調(diào)度到具有?disk=ceph?標(biāo)簽的?node?上

vim pod1.yaml

apiVersion: v1

kind: Pod

metadata:

? name: demo-pod-1

? namespace: default

? labels:

? ? app: myapp

? ? env: dev

spec:

? nodeSelector: ? ?##定義?pod?的時候指定要調(diào)度到具有?disk=ceph?標(biāo)簽的?node?上

? ? disk: ceph

? containers:

? - name: tomcat-pod-java

? ? ports:

? ? - containerPort: 8080

? ? image: tomcat:8.5-jre8-alpine

? ? imagePullPolicy: IfNotPresent

#更新,查看調(diào)度到哪里了

kubectl apply -f pod-1.yaml

kubectl get pods -o wide


# 查看kubectl describe pods demo-pod 詳細(xì)信息


3.污點和容忍度

node?節(jié)點親和性調(diào)度:nodeAffinity

kubectl explain pods.spec.affinity

FIELDS:

? nodeAffinity <Object>

? ? Describes node affinity scheduling rules for the pod.

? podAffinity? <Object>

? ? Describes pod affinity scheduling rules (e.g. co-locate this pod in the

? ? same node, zone, etc. as some other pod(s)).

? podAntiAffinity? ? ? <Object>

? ? Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod

? ? in the same node, zone, etc. as some other pod(s)).


#在查詢kubectl explain pods.spec.affinity.nodeAffinity

preferredDuringSchedulingIgnoredDuringExecution <[]Object>

prefered?表示有節(jié)點盡量滿足這個位置定義的親和性,這不是一個必須的條件,軟親和性?

requiredDuringSchedulingIgnoredDuringExecution <Object>

require?表示必須有節(jié)點滿足這個位置定義的親和性,這是個硬性條件,硬親和性

kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.no deSelectorTerms

FIELDS:

matchExpressions <[]Object> matchFields <[]Object>

matchExpressions:匹配表達(dá)式的?matchFields: 匹配字段的

? nodeSelectorTerms? ? <[]Object> -required- ? ? ? ? ?#required必須字段


kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.no deSelectorTerms.matchFields

VERSION: v1

RESOURCE: matchExpressions <[]Object>

DESCRIPTION:

FIELDS:

key <string> -required- operator <string> -required- values <[]string>

key:檢查?label

operator:做等值選則還是不等值選則?

values:給定值

使用?requiredDuringSchedulingIgnoredDuringExecution?硬親和性?#把?myapp-v1.tar.gz?上傳到 62?和 64?上,手動解壓:

docker load -i myapp-v1.tar.gz

vim pod-nodeaffinity-demo.yaml

apiVersion: v1

kind: Pod

metadata:

? ? ? ? name: pod-node-affinity-demo

? ? ? ? namespace: default

? ? ? ? labels:

? ? ? ? ? ? app: myapp

? ? ? ? ? ? tier: frontend

spec:

? ? containers:

? ? - name: myapp

? ? ? image: ikubernetes/myapp:v1

? ? affinity:

? ? ? ? nodeAffinity:

? ? ? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:

? ? ? ? ? ? ? ? ? nodeSelectorTerms:

? ? ? ? ? ? ? ? ? - matchExpressions:

? ? ? ? ? ? ? ? ? ? - key: zone

? ? ? ? ? ? ? ? ? ? ? operator: In

? ? ? ? ? ? ? ? ? ? ? values:

? ? ? ? ? ? ? ? ? ? ? - foo

? ? ? ? ? ? ? ? ? ? ? - bar

spec:我們檢查當(dāng)前節(jié)點中有任意一個節(jié)點擁有?zone?標(biāo)簽的值是?foo?或者?bar,就可以把?pod?調(diào)度到 這個?node?節(jié)點的?foo?或者?bar?標(biāo)簽上的節(jié)點上

? ? containers:

? ? - name: myapp

? ? ? image: ikubernetes/myapp:v1

? ? affinity:

? ? ? ? nodeAffinity:

? ? ? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:

? ? ? ? ? ? ? ? ? nodeSelectorTerms:

? ? ? ? ? ? ? ? ? - matchExpressions:

? ? ? ? ? ? ? ? ? ? - key: zone

? ? ? ? ? ? ? ? ? ? ? operator: In

? ? ? ? ? ? ? ? ? ? ? values:

? ? ? ? ? ? ? ? ? ? ? - foo

? ? ? ? ? ? ? ? ? ? ? - bar

kubectl apply -f pod-nodeaffinity-demo.yaml?

?kubectl get pods -o wide | grep pod-node


status?的狀態(tài)是?pending,上面說明沒有完成調(diào)度,因為沒有一個擁有?zone?的標(biāo)簽的值是?foo?或者?bar,而且使用的是硬親和性,必須滿足條件才能完成調(diào)度


kubectl label nodes god64 zone=foo

給這個 god64?節(jié)點打上標(biāo)簽?zone=foo,在查看


使用?preferredDuringSchedulingIgnoredDuringExecution?軟親和性

vi pod-nodeaffinity-demo-2.yaml

apiVersion: v1

kind: Pod

metadata:

? ? ? ? name: pod-node-affinity-demo-2

? ? ? ? namespace: default

? ? ? ? labels:

? ? ? ? ? ? app: myapp

? ? ? ? ? ? tier: frontend

spec:

? ? containers:

? ? - name: myapp

? ? ? image: ikubernetes/myapp:v1

? ? affinity:

? ? ? ? nodeAffinity:

? ? ? ? ? ? preferredDuringSchedulingIgnoredDuringExecution:

? ? ? ? ? ? - preference:

? ? ? ? ? ? ? matchExpressions:

? ? ? ? ? ? ? - key: zone1

? ? ? ? ? ? ? ? operator: In

? ? ? ? ? ? ? ? values:

? ? ? ? ? ? ? ? - foo1

? ? ? ? ? ? ? ? - bar1

? ? ? ? ? ? ? weight: 60

Pod?節(jié)點親和性

pod?自身的親和性調(diào)度有兩種表示形式

podaffinity:pod?和?pod?更傾向膩在一起,把相近的?pod?結(jié)合到相近的位置,如同一區(qū)域,同 一機(jī)架,這樣的話?pod?和?pod?之間更好通信,比方說有兩個機(jī)房,這兩個機(jī)房部署的集群有?1000?臺主機(jī),那么我們希望把?nginx?和?tomcat?都部署同一個地方的?node?節(jié)點上,可以提高 通信效率;

podunaffinity:pod?和?pod?更傾向不膩在一起,如果部署兩套程序,那么這兩套程序更傾向于 反親和性,這樣相互之間不會有影響。

第一個?pod?隨機(jī)選則一個節(jié)點,做為評判后續(xù)的?pod?能否到達(dá)這個?pod?所在的節(jié)點上的運行方 式,這就稱為?pod?親和性;我們怎么判定哪些節(jié)點是相同位置的,哪些節(jié)點是不同位置的;我們 在定義?pod?親和性時需要有一個前提,哪些?pod?在同一個位置,哪些?pod?不在同一個位置,這 個位置是怎么定義的,標(biāo)準(zhǔn)是什么?以節(jié)點名稱為標(biāo)準(zhǔn),這個節(jié)點名稱相同的表示是同一個位置, 節(jié)點名稱不相同的表示不是一個位置。

kubectl explain pods.spec.affinity.podAffinity

podAffinity ?親和性

podAntiAffinity 反親和性

requiredDuringSchedulingIgnoredDuringExecution: 硬親和性?preferredDuringSchedulingIgnoredDuringExecution:軟親和性

topologyKey: 位置拓?fù)涞逆I,這個是必須字段 怎么判斷是不是同一個位置:?rack=rack1

row=row1

使用?rack?的鍵是同一個位置

使用 row?的鍵是同一個位置

labelSelector:

我們要判斷 pod?跟別的?pod?親和,跟哪個?pod?親和,需要靠?labelSelector,通過?labelSelector?選則一組能作為親和對象的?pod?資源

namespace:

labelSelector?需要選則一組資源,那么這組資源是在哪個名稱空間中呢,通過?namespace?指 定,如果不指定?namespaces,那么就是當(dāng)前創(chuàng)建?pod?的名稱空間

定義兩個?pod,第一個?pod?做為基準(zhǔn),第二個?pod?跟著它走 cat pod-required-affinity-demo.yaml


apiVersion: v1

kind: Pod

metadata:

? name: pod-first

? labels:

? ? app: myapp

? ? tier: frontend

spec:

? ? containers:

? ? - name: myapp

? ? ? image: ikubernetes/myapp:v1

---

apiVersion: v1

kind: Pod

metadata:

? name: pod-second

? labels:

? ? app: backend

? ? tier: db

spec:

? ? containers:

? ? - name: busybox

? ? ? image: busybox:latest

? ? ? imagePullPolicy: IfNotPresent

? ? ? command: ["sh","-c","sleep 3600"]

? ? affinity:

? ? ? podAffinity:

? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:

? ? ? ? - labelSelector:

? ? ? ? ? ? ? matchExpressions:

? ? ? ? ? ? ? - {key: app, operator: In, values: ["myapp"]}

? ? ? ? ? topologyKey: kubernetes.io/hostname


#? ? ? ? ? ? ? - {key: app, operator: In, values: ["myapp"]}. ?key里面的app引用的是之前pod的labels的app

operator 的ln代表等值關(guān)系,values: ["myapp]對應(yīng)app的 myapp ,靠第一個pod的標(biāo)簽對應(yīng)親和性,第二個標(biāo)簽會找標(biāo)簽app: myapp的標(biāo)簽

#更新看親和性

kubectl apply -f pod-required-affinity-demo.yaml

kubectl get pods -o wide

看到pod-second跟pod-first在同一個節(jié)點

上面說明第一個?pod?調(diào)度到哪,第二個?pod?也調(diào)度到哪,這就是?pod?節(jié)點親和性

kubectl delete -f pod-required-affinity-demo.yaml

pod?節(jié)點反親和性

定義兩個?

pod,第一個?pod?做為基準(zhǔn),第二個?pod?跟它調(diào)度節(jié)點相反

?cat pod-required-anti-affinity-demo.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod-first labels:

app: myapp

tier: frontend spec:

---

containers:

- name: myapp

image: ikubernetes/myapp:v1

apiVersion: v1 kind: Pod metadata:

name: pod-second labels:

app: backend

tier: db spec:

containers:

- name: busybox

image: busybox:latest

imagePullPolicy: IfNotPresent

command: ["sh","-c","sleep 3600"] affinity:

podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector:

matchExpressions:

- {key: app, operator: In, values: ["myapp"]} topologyKey: kubernetes.io/hostname

?kubectl apply -f pod-required-anti-affinity-demo.yaml?

?kubectl get pods -o wide?顯示兩個?pod?不在一個?node?節(jié)點上,這 就是?pod?節(jié)點反親和性

pod-first running god64

pod-second running ?god62

kubectl delete -f pod-required-anti-affinity-demo.yaml

換一個?topologykey

kubectl label nodes god62 zone=foo

kubectl label nodes god64 zone=foo

cat pod-required-anti-affinity-demo-1.yaml

apiVersion: v1

kind: Pod

metadata:

? name: pod-first

? labels:

? ? app: myapp

? ? tier: frontend

spec:

? ? containers:

? ? - name: myapp

? ? ? image: ikubernetes/myapp:v1

---

apiVersion: v1

kind: Pod

metadata:

? name: pod-second

? labels:

? ? app: backend

? ? tier: db

spec:

? ? containers:

? ? - name: busybox

? ? ? image: busybox:latest

? ? ? imagePullPolicy: IfNotPresent

? ? ? command: ["sh","-c","sleep 3600"]

? ? affinity:

? ? ? podAffinity:

? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:

? ? ? ? - labelSelector:

? ? ? ? ? ? ? matchExpressions:

? ? ? ? ? ? ? - {key: app, operator: In, values: ["myapp"]}

? ? ? ? ? topologyKey: zone

kubectl apply -f pod-required-anti-affinity-demo.yaml?

kubectl get pods -o wide?顯示如下:

pod-first running god64

pod-second pending

第二個節(jié)點現(xiàn)是?pending,因為兩個節(jié)點是同一個位置,現(xiàn)在沒有不是同一個位置的了,而且我 們要求反親和性,所以就會處于?pending?狀態(tài),如果在反親和性這個位置把?required?改成?preferred,那么也會運行。

podaffinity:pod?節(jié)點親和性,pod?傾向于哪個?pod

nodeaffinity:node?節(jié)點親和性,pod?傾向于哪個?node


tolerationSeconds參數(shù)含義:

假如說你原來node1節(jié)點沒有污點,上面會有很多pod在運行,現(xiàn)在你把node1節(jié)點打個污點,排斥等級是NoExecute,這樣你node1上的pod就會被驅(qū)逐走,那多長時間被攆走,取決于tolerationSeconds,這個參數(shù)知識在定義排斥等級是NoExecute的時候才會用到


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容