介绍
在 Kubernetes 中,节点亲和性(node affinity)用于将 Pod 调度到符合特定条件的节点上。这可以确保 Pod 被调度到特定类型的节点上,或者在节点之间平衡工作负载。在本实验中,我们将学习如何使用节点亲和性将 Pod 调度到特定节点上。
在 Kubernetes 中,节点亲和性(node affinity)用于将 Pod 调度到符合特定条件的节点上。这可以确保 Pod 被调度到特定类型的节点上,或者在节点之间平衡工作负载。在本实验中,我们将学习如何使用节点亲和性将 Pod 调度到特定节点上。
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project
启动 Minikube:
启动 Minikube 以初始化一个 Kubernetes 集群:
minikube start
验证 Minikube 是否正在运行:
检查 Minikube 集群的状态:
minikube status
kubelet
和 apiserver
等组件是否显示为 Running
。minikube start
。如果启动 Minikube 时遇到问题,可以使用 minikube delete
来重置环境(如有需要)。
在这一步骤中,我们将创建一个带有标签的节点,该标签将用于调度 Pod。
/home/labex
目录下创建一个名为 node-with-label.yaml
的文件,内容如下:apiVersion: v1
kind: Node
metadata:
name: minikube
labels:
type: web
kubectl apply -f node-with-label.yaml
kubectl get nodes --show-labels
在这一步骤中,我们将创建一个带有节点亲和性规则的 Pod,以确保它被调度到具有特定标签的节点上。
/home/labex
目录下创建一个名为 pod-with-node-affinity.yaml
的文件,内容如下:apiVersion: v1
kind: Pod
metadata:
name: pod-with-node-affinity
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- web
kubectl apply -f pod-with-node-affinity.yaml
type=web
标签的节点上:kubectl get pod pod-with-node-affinity -o wide
在这一步骤中,我们将创建一个带有节点反亲和性规则的 Pod,以确保它不会被调度到具有特定标签的节点上。
/home/labex
目录下创建一个名为 pod-with-node-anti-affinity.yaml
的文件,内容如下:apiVersion: v1
kind: Pod
metadata:
name: pod-with-node-anti-affinity
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: NotIn
values:
- web
kubectl apply -f pod-with-node-anti-affinity.yaml
type=db
标签的节点上:kubectl get pod pod-with-node-anti-affinity -o wide
在这一步骤中,我们将创建一个同时包含节点亲和性规则和节点选择器的 Pod,以确保它被调度到具有特定标签的节点上。
/home/labex
目录下创建一个名为 pod-with-node-affinity-and-selector.yaml
的文件,内容如下:apiVersion: v1
kind: Pod
metadata:
name: pod-with-node-affinity-and-selector
spec:
containers:
- name: nginx
image: nginx:latest
nodeSelector:
type: web
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- db
kubectl apply -f pod-with-node-affinity-and-selector.yaml
type=web
标签的节点上:kubectl get pod pod-with-node-affinity-and-selector -o wide
在这一步骤中,我们将创建一个带有多个节点亲和性规则的 Pod,以确保它被调度到符合所有规则的标签的节点上。
/home/labex
目录下创建一个名为 pod-with-multiple-node-affinity.yaml
的文件,内容如下:apiVersion: v1
kind: Pod
metadata:
name: pod-with-multiple-node-affinity
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- web
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
kubectl apply -f pod-with-multiple-node-affinity.yaml
type=web
和 disktype=ssd
标签的节点上:kubectl get pod pod-with-multiple-node-affinity -o wide
在本实验中,我们学习了如何使用节点亲和性将 Pod 调度到特定节点上。我们创建了一个带有标签的节点,然后创建了带有节点亲和性规则的 Pod,以确保它们被调度到具有特定标签的节点上。我们还创建了一个带有节点反亲和性规则的 Pod,以确保它不会被调度到具有特定标签的节点上。最后,我们创建了一个带有多个节点亲和性规则的 Pod,以确保它被调度到符合所有规则的标签的节点上。