在Kubernetes中,你可以使用節點親和性(Node Affinity)來控制Pod部署在哪些節點上,通過配置節點親和性,你可以指定一些規則,以確保多個服務不會被調度到同一個節點上,
兩種策略
-
requiredDuringSchedulingIgnoredDuringExecution:通過
requiredDuringSchedulingIgnoredDuringExecution,可以定義在調度期間必須滿足的 Affinity 規則,這意味著規則在調度期間必須滿足,但如果在運行時不滿足,則不會強制執行, -
preferredDuringSchedulingIgnoredDuringExecution:使用
preferredDuringSchedulingIgnoredDuringExecution,可以定義首選的 Affinity 規則,這意味著規則是首選的,但不是強制的,如果無法滿足則可以繼續調度,
節點親和性實作
以下是一些在部署Deployment時避免多個服務部署到同一節點的常用方法:
- 使用節點親和性標簽(Node Affinity):你可以給每個服務定義一個獨特的節點親和性標簽,然后通過
affinity欄位將這些標簽添加到對應的PodSpec中,例如,給服務A定義service=a的標簽,給服務B定義service=b的標簽,然后,在Deployment的PodSpec中使用nodeAffinity欄位來指定節點親和性規則,確保兩個服務不會調度到同一個節點上,
- 使用requiredDuringSchedulingIgnoredDuringExecution強制策略,如果不滿足,你的pod將不能被調度
- 節點A上添加標簽type=product,service-a將被調度到這個節點
- 節點B上添加標簽type=order,service-b將被調度到這個節點
- service-a.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-a
spec:
replicas: 1
selector:
matchLabels:
app: service-a
template:
metadata:
labels:
app: service-a
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- product
containers:
- name: service-a
image: nginx:stable-alpine
- service-b.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-b
spec:
replicas: 1
selector:
matchLabels:
app: service-b
template:
metadata:
labels:
app: service-b
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- order
containers:
- name: service-b
image: nginx:stable-alpine
上面使用正則運算式matchExpressions來確定目標,也可以使用標簽matchLabels的方式,更簡潔,如下:
# 親和性
affinity:
# Pod親和性規則
podAffinity:
# 強制性的調度規則, 但不會影響已在節點上運行的Pod
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
# 標簽選擇器
labelSelector:
matchLabels:
app: service-a
- 使用非強制策略,配置weight權重一起使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-a-order
spec:
# Pod副本數量
replicas: 4
selector:
matchLabels:
app: service-a-order
# Pod模板
template:
metadata:
# 標簽資訊: 應用的后端服務
labels:
app: service-a-order
spec:
# 親和性
affinity:
# Pod親和性規則
podAntiAffinity:
# 強制性的調度規則, 但不會影響已在節點上運行的Pod
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
# 標簽選擇器
labelSelector:
matchExpressions: # 也需要matchLabels
- key: app
operator: In
values:
- service-a-order
# 容器資訊
containers:
- name: service-a-order
image: nginx:stable-alpine
擴展閱讀
app.kubernetes.io/instance Kubernetes的應用標識
在Kubernetes中,app.kubernetes.io/instance是一個標簽(Label),用于標識應用程式實體的實體ID或名稱,
標簽是鍵值對的形式,用于為資源物件(如Pod、Deployment、Service等)添加元資料資訊,app.kubernetes.io/instance是一個預定義的標簽鍵,用于表示應用程式實體的唯一識別符號,
通常,當您使用Kubernetes部署多個相同型別的應用程式實體時,每個實體都會被分配一個唯一的實體ID或名稱,您可以使用app.kubernetes.io/instance標簽來標識和區分這些應用程式實體,
例如,假設您使用Kubernetes部署了一個名為"my-app"的應用程式,并在該應用程式的多個副本之間進行了擴展,每個副本都會被分配一個唯一的實體ID或名稱,通過為每個副本設定app.kubernetes.io/instance標簽,您可以區分和識別每個應用程式實體,
標簽可以通過Kubernetes API或命令列工具(如kubectl)進行管理和查詢,您可以使用kubectl get pods --show-labels命令來查看資源物件的標簽資訊,包括app.kubernetes.io/instance標簽和對應的實體ID或名稱值,
kubernetes.io/hostname 節點的主機名
在Kubernetes中,kubernetes.io/hostname是一個節點標簽(Node Label),用于標識節點的主機名(Hostname),
節點標簽是一種鍵值對的形式,用于為節點添加自定義的元資料資訊,通過為節點添加標簽,您可以根據標簽進行節點選擇和調度,kubernetes.io/hostname是一個預定義的標簽鍵,用于表示節點的主機名,
節點的主機名是節點所在主機的唯一識別符號,Kubernetes使用主機名來識別和管理節點,并在集群中唯一標識每個節點,kubernetes.io/hostname標簽的值將設定為節點的實際主機名,
例如,假設您在Kubernetes集群中有多個節點,并且每個節點都有不同的主機名,通過查看節點的kubernetes.io/hostname標簽,您可以了解到每個節點的實際主機名,并在進行節點選擇或調度時使用這些資訊,
節點標簽可以通過Kubernetes API或命令列工具(如kubectl)進行管理和查詢,您可以使用kubectl get nodes --show-labels命令來查看節點標簽資訊,包括kubernetes.io/hostname標簽和對應的主機名值,
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/557034.html
標籤:其他
上一篇:2023年最具威脅的25種安全漏洞(CWE TOP 25)
下一篇:返回列表
