作者介紹:簡歷上沒有一個精通的運維工程師。請點擊上方的藍色《運維小路》關注我,下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。
我們上一章介紹了Docker基本情況,目前在規模較大的容器集群基本都是Kubernetes,但是Kubernetes涉及的東西和概念確實是太多了,而且隨著版本迭代功能在還增加,筆者有些功能也確實沒用過,所以只能按照我自己的理解來講解。
我們上小節介紹了Node親和性(Affinity)和反親和性(Anti-affinity)本質上還是屬于Node和Pod的之間的調度規則。如果我們有一個需求要求同一個Deployment下的Pod不能調度到同一個節點,避免將同一個應用全部調度到某臺服務器。避免出現服務器宕機導致某一應用高可用失效的情況(雖然Kubernetes會在把Pod調度到其他節點,但是這個中間是有時間差的)。我在生產環境也是遇到過類似的故障。或者相反的要求一個控制器下的Pod必須和某個Pod在一起,則可以通過Pod親和性(Affinity)和反親和性(Anti-affinity)來解決。
Pod 親和性
Pod 親和性用于將新 Pod 安排到與現有 Pod 相近的位置,這些現有 Pod 可能是同一個應用的不同實例或者是相互協作的服務。以下是一個 Pod 親和性的示例:
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deployment
spec:replicas:?3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:affinity:podAffinity:# 強制性(硬性)親和性規則requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- myapptopologyKey:?"kubernetes.io/hostname"# 不強制性(軟性)親和性規則preferredDuringSchedulingIgnoredDuringExecution:- weight:?1podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- myapptopologyKey:?"kubernetes.io/hostname"containers:- name: myapp-containerimage: myapp-image:latest
強制親和性:要求必須匹配標簽:app:myapp的Pod,如果已經有一個帶有標簽?app: myapp
?的 Pod 調度到了節點 A,那么當前的 Deployment 中的 Pod 副本也會嘗試調度到節點 A。適合哪些強相關的應用,他們必須(盡量)要在一個節點,如果沒有合適的標簽Pod可能會導致導讀失敗。
Pod 反親和性
Pod 反親和性用于將新 Pod 安排到與具有特定標簽的現有 Pod 不同的節點上,這有助于實現高可用性和故障隔離。以下是一個 Pod 反親和性的示例:
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deployment
spec:replicas:?3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- myapptopologyKey:?"kubernetes.io/hostname"
首次調度:當第一個app=myapp Pod被調度時,由于沒有其他app=myapp Pod存在,它可以被自由地分配到任何節點上。
后續調度:當你嘗試創建第二個app=myapp Pod時,Kubernetes調度器會根據podAntiAffinity規則檢查各個節點。如果某個節點上已經存在一個app=myapp Pod,則新的Pod不會被調度到該節點上。相反,它會被調度到另一個沒有app=myapp Pod的節點上。從而就實現了一個Deployment被調度到不同的節點。
拓撲域:topologyKey
?代表 Kubernetes?集群中的拓撲域,如節點、機架、區域、可用區等。它通常是一個節點標簽的鍵,用于定義 Pod 親和性和反親和性規則的上下文,如果上面的拓撲域是Zone,則可以把Pod調度到不同的Zone,從而提供集群的可用性。
這里實際上一共有4個配置,我們可以根據自己的需求選擇其中一個或者多個進行組合配置,以滿足自己的特殊的需求。
Node的親和性主要滿足的是Pod和Node匹配關系,而Pod的親和性主要滿足的是Pod和Pod的之間的關系,雖然最后選擇的也是用來選擇Node。
到這里我們用了5個小節來講解調度相關的內容,這些都是Kubernetes默認的自帶的調度功能,如果不滿足要求還可以自帶定義調度器功能。
運維小路
一個不會開發的運維!一個要學開發的運維!一個學不會開發的運維!歡迎大家騷擾的運維!