K8s?Affinity親和力詳解(調(diào)度策略)
K8s Affinity親和力
提示:Kubernetes 官網(wǎng)Affinity說明文檔 https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/
kubernetes Affinity親和力是一種調(diào)度策略,用于確保Pod被調(diào)度到具有特定標簽(label)或字段的節(jié)點上。
親和力和反親和力:
- 親和力和反親和力可以用來控制 Pod 如何調(diào)度到節(jié)點上。
- 親和力表示 Pod 要求與特定的節(jié)點調(diào)度在一起,反親和力表示 Pod 不希望與特定的節(jié)點調(diào)度在一起。
Affinity親和力分為兩類:
- 節(jié)點親和力:NodeAffinity (包括節(jié)點親和力和節(jié)點反親和力)
- Pod親和力:PodAffinity/PodAntiAffinity(PodAffinity Pod親和力和PodAntiAffinity Pod反親和力)
親和力和反親和力有兩種性:
- requiredDuringSchedulingIgnoredDuringExecution(硬親和性):這種類型親和力是硬性,表示Pod必須被調(diào)度到滿足指定條件的節(jié)點上。如果不滿足條件,Pod將不會被調(diào)度。
- preferredDuringSchedulingIgnoredDuringExecution(軟親和性):這種類型親和力是軟性,表示Pod更傾向于被調(diào)度到滿足指定條件的節(jié)點上,但如果無法滿足,Pod仍會被調(diào)度到其他節(jié)點。
一、Affinity參數(shù)說明
提示:節(jié)點反親和力通過operator參數(shù)設置成Notln值實現(xiàn)
1、節(jié)點nodeAffinity(硬性)親和力
spec:
affinity: # 定義Affinity親和力配置
nodeAffinity: # 定義節(jié)點Affinity親和力配置
requiredDuringSchedulingIgnoredDuringExecution: # 定義硬性Affinity親和力配置
nodeSelectorTerms: # 定義節(jié)點選擇器配置
- matchExpressions: # 定義匹配節(jié)點標簽鍵值對key=value
- key: disktype # 設置節(jié)點標簽鍵名key
operator: In # 節(jié)點標簽匹配方式,In等于
values: # 設置節(jié)點標簽值value
- ssd
2、節(jié)點nodeAffinity(軟性)親和力
spec:
affinity: # 定義Affinity親和力配置
nodeAffinity: # 定義節(jié)點Affinity親和力配置
preferredDuringSchedulingIgnoredDuringExecution: # 定義軟性Affinity親和力配置
- weight: 10 # 軟親和力的權重,權重越高優(yōu)先級越大,范圍1-100
preference: # 軟親和力配置項
matchExpressions: # 定義匹配節(jié)點標簽鍵值對key=value
- key: disktype # 設置節(jié)點標簽鍵名key
operator: In # 節(jié)點標簽匹配方式,In等于
values: # 設置節(jié)點標簽值value
- ssd
3、Pod podAffinity(硬性)親和力
spec:
affinity: # 定義Affinity親和力配置
podAffinity: # 定義Pod Affinity親和力配置
requiredDuringSchedulingIgnoredDuringExecution: # 定義Affinity硬性親和力配置
- labelSelector: # 定義Pod選擇器配置
matchExpressions: # 定義匹配Pod標簽鍵值對key=value
- key: disktype i # 設置Pod標簽鍵名key
operator: In # Pod標簽規(guī)則匹配條件,In等于
values: # 設置Pod標簽值value
- ssd
topologkey: kubernetes.io/hostname # 定義親和力的范圍,匹配的拓撲域的key,也就是節(jié)點上label和key,key和value相同的為同一個域。topologyke拓撲域,主要針對宿主機,相當于對宿主機進行區(qū)域的劃分。用label進行判斷,不同的key和不同的value是屬于不同的拓撲域。kubernetes.io/hostname是K8s默認節(jié)點標簽
4、Pod podAffinity(軟性)親和力
spec:
affinity: # 定義Affinity親和力配置
podAffinity: # 定義Pod Affinity親和力配置
requiredDuringSchedulingIgnoredDuringExecution: # 定義Affinity硬性親和力配置
- labelSelector: # 定義Pod選擇器配置
matchExpressions: # 定義匹配Pod標簽鍵值對key=value
- key: disktype # 設置Pod標簽鍵名key
operator: In # Pod標簽規(guī)則匹配條件,In等于
values: # 設置Pod標簽值value
- ssd
topologkey: kubernetes.io/hostname # 定義親和力的范圍,匹配的拓撲域的key,也就是節(jié)點上label和key,key和value相同的為同一個域。topologyke拓撲域,主要針對宿主機,相當于對宿主機進行區(qū)域的劃分。用label進行判斷,不同的key和不同的value是屬于不同的拓撲域。kubernetes.io/hostname是K8s默認節(jié)點標簽
5、Pod podAffinity(硬性)反親和力
spec:
affinity: # 定義Affinity親和力配置
podAffinity: # 定義Pod Affinity親和力配置
requiredDuringSchedulingIgnoredDuringExecution: # 定義Affinity硬性親和力配置
- labelSelector: # 定義Pod選擇器配置
matchExpressions: # 定義匹配Pod標簽鍵值對key=value
- key: disktype # 設置Pod標簽鍵名key
operator: In # Pod標簽規(guī)則匹配條件,In等于
values: # 設置Pod標簽值value
- ssd
topologkey: kubernetes.io/hostname # 定義親和力的范圍,匹配的拓撲域的key,也就是節(jié)點上label和key,key和value相同的為同一個域。topologyke拓撲域,主要針對宿主機,相當于對宿主機進行區(qū)域的劃分。用label進行判斷,不同的key和不同的value是屬于不同的拓撲域。kubernetes.io/hostname是K8s默認節(jié)點標簽
6、Pod podAntAffinity(軟性)反親和力
spec:
affinity: # 定義Affinity親和力配置
podAntAffinity: # 定義Pod Affinity反親和力配置
preferredDuringSchedulingIgnoredDuringExecution: # 定義Affinity軟性反親和力配置
- weight: 10 # 反親和力的權重,權重越高反親和力越大,范圍1-100
podAffinityTerm: # Pod反親和力配置項
labelSelector: # 定義Pod選擇器配置
matchExpressions: # 定義匹配Pod標簽鍵值對key=value
- key: security # 設置Pod標簽鍵名key
operator: In # Pod標簽規(guī)則匹配條件,In等于
values: # 設置Pod標簽值value
- S2
topologyKey: failure-domain.beta.kubernetes.io/zone # 定義反親和力的范圍,匹配的拓撲域的key,也就是節(jié)點上label和key,key和value相同的為同一個域。topologyke拓撲域,主要針對宿主機,相當于對宿主機進行區(qū)域的劃分。用label進行判斷,不同的key和不同的value是屬于不同的拓撲域。
7、operator參數(shù)規(guī)則匹配條件
operator # 規(guī)則匹配條件 --- In # 相當于key=value的形式(等于) --- Notln # 相當于key!=value的形式(不等于) --- Exists # 節(jié)點存在label的key為指定的值即可,不能配置values字段 --- DoesNotExist # 節(jié)點不存在label的key為指定的值即可,不能配置values字段 --- Gt # 大于value指定的值 --- Lt # 小于value指定的值
二、示例1:節(jié)點Affinity(硬性)親和力(強制Pod部署到指定節(jié)點)
### 查看K8s集群節(jié)點是否有污點,如果有污點需要清除節(jié)點污點,為了不影響Affinity親和力參數(shù)
kubectl get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
### 選擇k8s-node01和k8s-node02節(jié)點打標簽
kubectl label node k8s-node01 k8s-node02 disktype=ssd
kubectl get nodes --show-labels -l disktype=ssd
### 創(chuàng)建Deployment
mkdir -p /data/yaml/affinity
cat > /data/yaml/affinity/deploy-nodeaffinity-hard.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deploy-nodeaffinity-hard
name: deploy-nodeaffinity-hard
namespace: default
spec:
replicas: 6
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.26
imagePullPolicy: IfNotPresent
EOF
kubectl create -f /data/yaml/affinity/deploy-nodeaffinity-hard.yaml
kubectl get deploy deploy-nodeaffinity-hard -n default -oyaml
### 查看Pod節(jié)點部署節(jié)點
kubectl get pods -n default -owide
### 刪除Deployment和節(jié)點標簽
kubectl delete -f /data/yaml/affinity/deploy-nodeaffinity-hard.yaml
kubectl label nodes k8s-node01 k8s-node02 disktype-
三、示例2:節(jié)點Affinity(軟性)親和力(盡可能Pod部署到指定節(jié)點)
### 查看K8s集群節(jié)點是否有污點,如果有污點需要清除節(jié)點污點,為了不影響Affinity親和力參數(shù)
kubectl get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
### 選擇k8s-node02節(jié)點打標簽
kubectl label node k8s-node02 node=erp
kubectl get nodes --show-labels -l node=erp
### 創(chuàng)建Deployment
mkdir -p /data/yaml/affinity
cat > /data/yaml/affinity/deploy-nodeaffinity-soft.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deploy-nodeaffinity-soft
name: deploy-nodeaffinity-soft
namespace: default
spec:
replicas: 10
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: node
operator: In
values:
- erp
containers:
- name: nginx
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.26
imagePullPolicy: IfNotPresent
EOF
kubectl create -f /data/yaml/affinity/deploy-nodeaffinity-soft.yaml
kubectl get deploy deploy-nodeaffinity-soft -n default -oyaml
### 查看Pod節(jié)點部署節(jié)點
kubectl get pods -n default -owide
### 刪除Deployment和節(jié)點標簽
kubectl delete -f /data/yaml/affinity/deploy-nodeaffinity-soft.yaml
kubectl label nodes k8s-node02 node-
四、示例3:Pod Affinity(硬性)反親和力(強制Pod部署到指定的不同的節(jié)點)
示例場景描述:假如k8s-node01是深圳機房,k8s-node02是北京機房,k8s-master03是杭州機房,每個不同的機房部署一個nginx容器,實現(xiàn)區(qū)域性均衡負載
提示:當Deployment定義啟動超過3個Pod數(shù)量,但節(jié)點只定義了3個key,當定義了3個key節(jié)點各自都只能運行一個Pod(不會運行兩個以上的Pod),那剩下的Pod會在其它節(jié)點上運行
### 查看K8s集群節(jié)點是否有污點,如果有污點需要清除節(jié)點污點,為了不影響Affinity親和力參數(shù)
kubectl get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
### 節(jié)點創(chuàng)建label中鍵名key要一樣,但value值不要一樣,topologyke拓撲域參數(shù)才能區(qū)分不同的區(qū)域
kubectl get nodes
kubectl label nodes k8s-master01 area=hangzhou
kubectl label nodes k8s-node01 area=shenzhen
kubectl label nodes k8s-node02 area=beijing
kubectl get nodes --show-labels | grep area
### 創(chuàng)建Deployment
mkdir -p /data/yaml/affinity
cat > /data/yaml/affinity/deploy-podantaffinity-area.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deploy-podantaffinity-area
name: deploy-podantaffinity-area
namespace: default
spec:
replicas: 3
selector:
matchLabels:
run: deploy-pod-area
template:
metadata:
labels:
run: deploy-pod-area
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: run
operator: In
values:
- deploy-pod-area
topologyKey: area
containers:
- name: nginx
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.26
imagePullPolicy: IfNotPresent
EOF
kubectl create -f /data/yaml/affinity/deploy-podantaffinity-area.yaml
kubectl get deploy deploy-podantaffinity-area -n default -oyaml
### 查看Pod節(jié)點部署節(jié)點
kubectl get pods -n default -owide
### 刪除Deployment和節(jié)點標簽
kubectl delete -f /data/yaml/affinity/deploy-podantaffinity-area.yaml
kubectl label nodes k8s-node01 k8s-node02 k8s-master01 area-
五、示例4:Pod Affinity(硬性)反親和力(強制Pod部署到K8s集群中每一個節(jié)點)
提示:Deployment設置的Pod副本數(shù)不能超過K8s節(jié)點數(shù),超過的Pod副本數(shù)啟動Pod會失敗,kubernetes.io/hostname是K8s內(nèi)置的默認標簽
### 查看K8s集群節(jié)點是否有污點,如果有污點需要清除節(jié)點污點,為了不影響Affinity親和力參數(shù)
kubectl get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
### 創(chuàng)建Deployment
mkdir -p /data/yaml/affinity
cat > /data/yaml/affinity/deploy-podantaffinity-hostname.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deploy-podantaffinity-hostname
name: deploy-podantaffinity-hostname
namespace: default
spec:
replicas: 5
selector:
matchLabels:
run: deploy-pod-hostname
template:
metadata:
labels:
run: deploy-pod-hostname
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: run
operator: In
values:
- deploy-pod-hostname
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.26
imagePullPolicy: IfNotPresent
EOF
kubectl create -f /data/yaml/affinity/deploy-podantaffinity-hostname.yaml
kubectl get deploy deploy-podantaffinity-hostname -n default -oyaml
### 查看Pod節(jié)點部署節(jié)點
kubectl get pods -n default -owide
### 刪除Deployment
kubectl delete -f /data/yaml/affinity/deploy-podantaffinity-hostname.yaml
六、示例5:節(jié)點Affinity(軟性)親和力(重要Pod盡可能部署在高性能節(jié)點)
測試場景描述: nginx容器不部署到master節(jié)點,nginx容器第一選擇部署到高存儲性能k8s-node01,如果k8s-node01節(jié)點出現(xiàn)故障,第二選擇部署到k8s-node02節(jié)點
### 查看K8s集群節(jié)點是否有污點,如果有污點需要清除節(jié)點污點,為了不影響Affinity親和力參數(shù)
kubectl get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
### 節(jié)點創(chuàng)建label
kubectl get nodes
kubectl label nodes k8s-master01 k8s-master02 k8s-master03 master=manager
kubectl label nodes k8s-node01 ssd=fastest
kubectl label nodes k8s-node02 sata=faster
kubectl get nodes --show-labels | grep master=manager
kubectl get nodes --show-labels | grep ssd
kubectl get nodes --show-labels | grep sata
### 創(chuàng)建Deployment
mkdir -p /data/yaml/affinity
cat > /data/yaml/affinity/nginx-deploy-select.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-select
name: nginx-deploy-select
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: ssd
operator: In
values:
- "fastest"
- key: master
operator: NotIn
values:
- "manager"
- weight: 50
preference:
matchExpressions:
- key: sata
operator: In
values:
- "faster"
containers:
- name: nginx
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.26
imagePullPolicy: IfNotPresent
EOF
kubectl create -f /data/yaml/affinity/nginx-deploy-select.yaml
kubectl get deploy nginx-deploy-select -n default -oyaml
### 查看Pod節(jié)點部署節(jié)點
kubectl get pods -n default -owide
### 刪除Deployment
kubectl delete -f /data/yaml/affinity/deploy-podantaffinity-hostname.yaml
### 刪除Deployment和節(jié)點標簽
kubectl delete -f /data/yaml/affinity/nginx-deploy-select.yaml
kubectl label nodes k8s-node01 k8s-master01 k8s-master02 k8s-master03 master-
kubectl label nodes k8s-node01 ssd-
kubectl label nodes k8s-node02 sata-
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
k8s?clientConfig和rawConfig區(qū)別解析
k8s clientConfig和rawConfig區(qū)別k8s.io/client-gov0.28.2基于kubeconfig可以創(chuàng)建clientConfig和rawConfig,兩者區(qū)別在于,clientConfig包含了訪問kube-apiserver的地址和認證鑒權信息,感興趣的朋友一起看看吧2025-03-03
Rainbond調(diào)用Vue?React項目的后端接口
這篇文章主要為大家介紹了Rainbond調(diào)用Vue?React項目的后端接口問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04

