简介
在 Kubernetes 中,节点亲和性(node affinity)用于将 Pod 调度到符合特定条件的节点上。这可以确保 Pod 被调度到特定类型的节点上,或者用于在节点间平衡工作负载。在本实验中,我们将学习如何使用节点亲和性将 Pod 调度到指定的节点上。
启动 Minikube 集群
在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个在本地机器上运行的轻量级 Kubernetes 环境。
导航到工作目录:
打开终端并导航到默认的项目文件夹:
cd /home/labex/project启动 Minikube:
启动 Minikube 以初始化 Kubernetes 集群:
minikube start- 此命令会在你的本地机器上设置一个单节点的 Kubernetes 集群。
- 根据系统性能,Minikube 可能需要几分钟时间启动。
验证 Minikube 是否正在运行:
检查 Minikube 集群的状态:
minikube status- 查看
kubelet和apiserver等组件是否显示为Running。 - 如果集群未运行,请重新执行
minikube start。
- 查看
如果启动 Minikube 时遇到问题,必要时可以使用 minikube delete 重置环境。
请在 /home/labex/project 目录下执行本实验的后续步骤,以确保 YAML 文件保持在同一个工作目录中。
创建带有标签的节点
在此步骤中,我们将创建一个带有标签的节点,该标签将用于调度 Pod。
- 在
/home/labex/project目录下创建一个名为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
在此步骤中,我们将创建一个带有节点亲和性规则的 Pod,以确保它被调度到具有特定标签的节点上。
- 在
/home/labex/project目录下创建一个名为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
- 验证 Pod 是否被调度到带有
type=web标签的节点上:
kubectl get pod pod-with-node-affinity -o wide
创建带有节点反亲和性的 Pod
在此步骤中,我们将创建一个带有节点反亲和性(node anti-affinity)规则的 Pod,以确保它不会被调度到具有特定标签的节点上。
- 在
/home/labex/project目录下创建一个名为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
- 验证 Pod 是否未被调度到带有
type=db标签的节点上(注意:由于当前集群只有一个节点且该节点标签为web,此 Pod 可能会处于 Pending 状态):
kubectl get pod pod-with-node-anti-affinity -o wide
创建同时使用节点亲和性和节点选择器的 Pod
在此步骤中,我们将创建一个同时包含节点亲和性规则和节点选择器(node selector)的 Pod,以确保它被调度到具有特定标签的节点上。
- 在
/home/labex/project目录下创建一个名为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
- 验证 Pod 是否未被调度到带有
type=web标签的节点上(因为亲和性规则要求type=db):
kubectl get pod pod-with-node-affinity-and-selector -o wide
创建带有多个节点亲和性规则的 Pod
在此步骤中,我们将创建一个带有多个节点亲和性规则的 Pod,以确保它被调度到标签同时满足所有规则的节点上。
- 在
/home/labex/project目录下创建一个名为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
- 验证 Pod 是否被调度到同时具有
type=web和disktype=ssd标签的节点上:
kubectl get pod pod-with-multiple-node-affinity -o wide
总结
在本实验中,我们学习了如何使用节点亲和性将 Pod 调度到特定节点上。我们创建了一个带有标签的节点,并创建了带有节点亲和性规则的 Pod,确保它们被调度到具有特定标签的节点上。我们还创建了一个带有节点反亲和性规则的 Pod,确保它不会被调度到具有特定标签的节点上。最后,我们创建了一个带有多个节点亲和性规则的 Pod,确保它被调度到同时满足所有规则的节点上。


