使用节点亲和性进行调度

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在 Kubernetes 中,节点亲和性(node affinity)用于将 Pod 调度到符合特定条件的节点上。这可以确保 Pod 被调度到特定类型的节点上,或者在节点之间平衡工作负载。在本实验中,我们将学习如何使用节点亲和性将 Pod 调度到特定节点上。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/ConfigurationandVersioningGroup(["`Configuration and Versioning`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("`Label`") subgraph Lab Skills kubernetes/initialization -.-> lab-18468{{"`使用节点亲和性进行调度`"}} kubernetes/get -.-> lab-18468{{"`使用节点亲和性进行调度`"}} kubernetes/create -.-> lab-18468{{"`使用节点亲和性进行调度`"}} kubernetes/apply -.-> lab-18468{{"`使用节点亲和性进行调度`"}} kubernetes/label -.-> lab-18468{{"`使用节点亲和性进行调度`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。

创建带有标签的节点

在这一步骤中,我们将创建一个带有标签的节点,该标签将用于调度 Pod。

  1. /home/labex 目录下创建一个名为 node-with-label.yaml 的文件,内容如下:
apiVersion: v1
kind: Node
metadata:
  name: minikube
  labels:
    type: web
  1. 应用更改:
kubectl apply -f node-with-label.yaml
  1. 验证节点是否已创建并标记:
kubectl get nodes --show-labels

创建带有节点亲和性的 Pod

在这一步骤中,我们将创建一个带有节点亲和性规则的 Pod,以确保它被调度到具有特定标签的节点上。

  1. /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
  1. 应用更改:
kubectl apply -f pod-with-node-affinity.yaml
  1. 验证 Pod 是否被调度到带有 type=web 标签的节点上:
kubectl get pod pod-with-node-affinity -o wide

创建带有节点反亲和性的 Pod

在这一步骤中,我们将创建一个带有节点反亲和性规则的 Pod,以确保它不会被调度到具有特定标签的节点上。

  1. /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
  1. 应用更改:
kubectl apply -f pod-with-node-anti-affinity.yaml
  1. 验证 Pod 是否未被调度到带有 type=db 标签的节点上:
kubectl get pod pod-with-node-anti-affinity -o wide

创建带有节点亲和性和节点选择器的 Pod

在这一步骤中,我们将创建一个同时包含节点亲和性规则和节点选择器的 Pod,以确保它被调度到具有特定标签的节点上。

  1. /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
  1. 应用更改:
kubectl apply -f pod-with-node-affinity-and-selector.yaml
  1. 验证 Pod 是否未被调度到带有 type=web 标签的节点上:
kubectl get pod pod-with-node-affinity-and-selector -o wide

创建带有多个节点亲和性规则的 Pod

在这一步骤中,我们将创建一个带有多个节点亲和性规则的 Pod,以确保它被调度到符合所有规则的标签的节点上。

  1. /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
  1. 应用更改:
kubectl apply -f pod-with-multiple-node-affinity.yaml
  1. 验证 Pod 是否被调度到带有 type=webdisktype=ssd 标签的节点上:
kubectl get pod pod-with-multiple-node-affinity -o wide

总结

在本实验中,我们学习了如何使用节点亲和性将 Pod 调度到特定节点上。我们创建了一个带有标签的节点,然后创建了带有节点亲和性规则的 Pod,以确保它们被调度到具有特定标签的节点上。我们还创建了一个带有节点反亲和性规则的 Pod,以确保它不会被调度到具有特定标签的节点上。最后,我们创建了一个带有多个节点亲和性规则的 Pod,以确保它被调度到符合所有规则的标签的节点上。

您可能感兴趣的其他 Kubernetes 教程