在Kubernetes中,你可以使用節(jié)點(diǎn)親和性(Node Affinity)來控制Pod部署在哪些節(jié)點(diǎn)上。通過配置節(jié)點(diǎn)親和性,你可以指定一些規(guī)則,以確保多個(gè)服務(wù)不會(huì)被調(diào)度到同一個(gè)節(jié)點(diǎn)上。
兩種策略
-
requiredDuringSchedulingIgnoredDuringExecution:通過
requiredDuringSchedulingIgnoredDuringExecution
,可以定義在調(diào)度期間必須滿足的 Affinity 規(guī)則。這意味著規(guī)則在調(diào)度期間必須滿足,但如果在運(yùn)行時(shí)不滿足,則不會(huì)強(qiáng)制執(zhí)行。 -
preferredDuringSchedulingIgnoredDuringExecution:使用
preferredDuringSchedulingIgnoredDuringExecution
,可以定義首選的 Affinity 規(guī)則。這意味著規(guī)則是首選的,但不是強(qiáng)制的,如果無法滿足則可以繼續(xù)調(diào)度。
節(jié)點(diǎn)親和性實(shí)現(xiàn)
以下是一些在部署Deployment時(shí)避免多個(gè)服務(wù)部署到同一節(jié)點(diǎn)的常用方法:
- 使用節(jié)點(diǎn)親和性標(biāo)簽(Node Affinity):你可以給每個(gè)服務(wù)定義一個(gè)獨(dú)特的節(jié)點(diǎn)親和性標(biāo)簽,然后通過
affinity
字段將這些標(biāo)簽添加到對(duì)應(yīng)的PodSpec中。例如,給服務(wù)A定義service=a
的標(biāo)簽,給服務(wù)B定義service=b
的標(biāo)簽。然后,在Deployment的PodSpec中使用nodeAffinity
字段來指定節(jié)點(diǎn)親和性規(guī)則,確保兩個(gè)服務(wù)不會(huì)調(diào)度到同一個(gè)節(jié)點(diǎn)上。
- 使用requiredDuringSchedulingIgnoredDuringExecution強(qiáng)制策略,如果不滿足,你的pod將不能被調(diào)度
- 節(jié)點(diǎn)A上添加標(biāo)簽type=product,service-a將被調(diào)度到這個(gè)節(jié)點(diǎn)
- 節(jié)點(diǎn)B上添加標(biāo)簽type=order,service-b將被調(diào)度到這個(gè)節(jié)點(diǎn)
- 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
上面使用正則表達(dá)式matchExpressions來確定目標(biāo),也可以使用標(biāo)簽matchLabels的方式,更簡(jiǎn)潔,如下:
# 親和性
affinity:
# Pod親和性規(guī)則
podAffinity:
# 強(qiáng)制性的調(diào)度規(guī)則, 但不會(huì)影響已在節(jié)點(diǎn)上運(yùn)行的Pod
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
# 標(biāo)簽選擇器
labelSelector:
matchLabels:
app: service-a
- 使用非強(qiáng)制策略,配置weight權(quán)重一起使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-a-order
spec:
# Pod副本數(shù)量
replicas: 4
selector:
matchLabels:
app: service-a-order
# Pod模板
template:
metadata:
# 標(biāo)簽信息: 應(yīng)用的后端服務(wù)
labels:
app: service-a-order
spec:
# 親和性
affinity:
# Pod親和性規(guī)則
podAntiAffinity:
# 強(qiáng)制性的調(diào)度規(guī)則, 但不會(huì)影響已在節(jié)點(diǎn)上運(yùn)行的Pod
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
# 標(biāo)簽選擇器
labelSelector:
matchExpressions: # 也需要matchLabels
- key: app
operator: In
values:
- service-a-order
# 容器信息
containers:
- name: service-a-order
image: nginx:stable-alpine
擴(kuò)展閱讀
app.kubernetes.io/instance Kubernetes的應(yīng)用標(biāo)識(shí)
在Kubernetes中,app.kubernetes.io/instance
是一個(gè)標(biāo)簽(Label),用于標(biāo)識(shí)應(yīng)用程序?qū)嵗膶?shí)例ID或名稱。
標(biāo)簽是鍵值對(duì)的形式,用于為資源對(duì)象(如Pod、Deployment、Service等)添加元數(shù)據(jù)信息。app.kubernetes.io/instance
是一個(gè)預(yù)定義的標(biāo)簽鍵,用于表示應(yīng)用程序?qū)嵗奈ㄒ粯?biāo)識(shí)符。
通常,當(dāng)您使用Kubernetes部署多個(gè)相同類型的應(yīng)用程序?qū)嵗龝r(shí),每個(gè)實(shí)例都會(huì)被分配一個(gè)唯一的實(shí)例ID或名稱。您可以使用app.kubernetes.io/instance
標(biāo)簽來標(biāo)識(shí)和區(qū)分這些應(yīng)用程序?qū)嵗?/p>
例如,假設(shè)您使用Kubernetes部署了一個(gè)名為"my-app"的應(yīng)用程序,并在該應(yīng)用程序的多個(gè)副本之間進(jìn)行了擴(kuò)展。每個(gè)副本都會(huì)被分配一個(gè)唯一的實(shí)例ID或名稱。通過為每個(gè)副本設(shè)置app.kubernetes.io/instance
標(biāo)簽,您可以區(qū)分和識(shí)別每個(gè)應(yīng)用程序?qū)嵗?/p>
標(biāo)簽可以通過Kubernetes API或命令行工具(如kubectl)進(jìn)行管理和查詢。您可以使用kubectl get pods --show-labels
命令來查看資源對(duì)象的標(biāo)簽信息,包括app.kubernetes.io/instance
標(biāo)簽和對(duì)應(yīng)的實(shí)例ID或名稱值。
kubernetes.io/hostname 節(jié)點(diǎn)的主機(jī)名
在Kubernetes中,kubernetes.io/hostname
是一個(gè)節(jié)點(diǎn)標(biāo)簽(Node Label),用于標(biāo)識(shí)節(jié)點(diǎn)的主機(jī)名(Hostname)。
節(jié)點(diǎn)標(biāo)簽是一種鍵值對(duì)的形式,用于為節(jié)點(diǎn)添加自定義的元數(shù)據(jù)信息。通過為節(jié)點(diǎn)添加標(biāo)簽,您可以根據(jù)標(biāo)簽進(jìn)行節(jié)點(diǎn)選擇和調(diào)度。kubernetes.io/hostname
是一個(gè)預(yù)定義的標(biāo)簽鍵,用于表示節(jié)點(diǎn)的主機(jī)名。
節(jié)點(diǎn)的主機(jī)名是節(jié)點(diǎn)所在主機(jī)的唯一標(biāo)識(shí)符。Kubernetes使用主機(jī)名來識(shí)別和管理節(jié)點(diǎn),并在集群中唯一標(biāo)識(shí)每個(gè)節(jié)點(diǎn)。kubernetes.io/hostname
標(biāo)簽的值將設(shè)置為節(jié)點(diǎn)的實(shí)際主機(jī)名。
例如,假設(shè)您在Kubernetes集群中有多個(gè)節(jié)點(diǎn),并且每個(gè)節(jié)點(diǎn)都有不同的主機(jī)名。通過查看節(jié)點(diǎn)的kubernetes.io/hostname
標(biāo)簽,您可以了解到每個(gè)節(jié)點(diǎn)的實(shí)際主機(jī)名,并在進(jìn)行節(jié)點(diǎn)選擇或調(diào)度時(shí)使用這些信息。文章來源:http://www.zghlxwxcb.cn/news/detail-545325.html
節(jié)點(diǎn)標(biāo)簽可以通過Kubernetes API或命令行工具(如kubectl)進(jìn)行管理和查詢。您可以使用kubectl get nodes --show-labels
命令來查看節(jié)點(diǎn)標(biāo)簽信息,包括kubernetes.io/hostname
標(biāo)簽和對(duì)應(yīng)的主機(jī)名值。文章來源地址http://www.zghlxwxcb.cn/news/detail-545325.html
到了這里,關(guān)于k8s~節(jié)點(diǎn)的親和性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!