k8s中应用NodeSelector调度
为了将新的命名空间仅调度到特定的节点(如 node3),而不调度到其他节点(如 node1 和 node2),你可以使用 Kubernetes 的。假设你已经创建了一个新的命名空间 my-namespace,并且你想让所有这个命名空间中的 Pod 只调度到 node3。通过这些方法,你可以确保新的命名空间中的 Pod 仅调度到 node3,而不调度到 node1 和 node2。通过给 node1
为了将新的命名空间仅调度到特定的节点(如 node3),而不调度到其他节点(如 node1 和 node2),你可以使用 Kubernetes 的 nodeSelector、nodeAffinity
或 taints
和 tolerations
功能。
方法 1: 使用 nodeSelector
你可以在 Pod 或 Deployment 的 YAML 文件中指定 nodeSelector,将其调度到特定节点。
步骤:
1.为 node3 添加一个标签(假设你已经有 node3 运行在你的集群中)。
kubectl label nodes node3 disktype=ssd
#查看标签
kubectl get nodes --show-labels
1.在你的 Pod 或 Deployment YAML 文件中,添加 nodeSelector。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: your-namespace
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
disktype: ssd
方法 2: 使用 nodeAffinity
nodeAffinity 提供了更灵活的方式来选择节点。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: your-namespace
spec:
containers:
- name: my-container
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
方法 3: 使用 taints
和 tolerations
通过给 node1 和 node2 添加 taints,使其不能调度新的 Pod,除非 Pod 有相应的 tolerations
。
步骤:
1.给 node1 和 node2 添加 taints。
kubectl taint nodes node1 key=value:NoSchedule
kubectl taint nodes node2 key=value:NoSchedule
#查看节点的taint
kubectl describe nodes node1 | grep Taints
kubectl describe nodes node2 | grep Taints
# 输出如下表示节点被打上taint
Taints: key=value:NoSchedule
# 要取消 node1 和 node2 上的 taint,可以运行以下命令:
kubectl taint nodes node1 key=value:NoSchedule-
kubectl taint nodes node2 key=value:NoSchedule-
2.在你的 Pod 或 Deployment YAML 文件中,不添加 tolerations
,使其不会调度到有 taints 的节点上。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: your-namespace
spec:
containers:
- name: my-container
image: nginx
例子:使用 nodeSelector 和 Namespace
假设你已经创建了一个新的命名空间 my-namespace,并且你想让所有这个命名空间中的 Pod 只调度到 node3。
1.创建一个新的命名空间。
kubectl create namespace my-namespace
1.为 node3 添加标签。
kubectl label nodes node3 disktype=ssd
1.创建一个 Pod 或 Deployment,在 my-namespace 命名空间中,使用 nodeSelector。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
namespace: my-namespace
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
disktype: ssd
应用这个 YAML 文件:
kubectl apply -f my-deployment.yaml
通过这些方法,你可以确保新的命名空间中的 Pod 仅调度到 node3,而不调度到 node1 和 node2。
关于标签
标签的值可以是任何字符串,具体取决于您的需求。标签(包括键和值)只是用于标识节点的属性和特征,并且可以根据您的实际情况进行设置。例如,您可以使用 disktype=hdd、environment=production、region=us-west等等。
以下是一些可能的标签示例:
环境相关:
- environment=production
- environment=staging
- environment=development
地理位置:
- region=us-west
- region=us-east
- region=eu-central
硬件特性:
- disktype=ssd
- disktype=hdd
- cpu=high
其他自定义属性:
- purpose=web-server
- team=backend
- owner=devops
示例命令
假设您要给 node3 节点添加一个标签,表示这个节点是用于生产环境的,并且磁盘类型为 HDD。您可以运行以下命令:
kubectl label nodes node3 environment=production
kubectl label nodes node3 disktype=hdd
这样,node3 节点将具有 environment=production
和 disktype=hdd
这两个标签。
使用标签的 Pod 示例
假设您希望您的 Pod 仅调度到具有 environment=production
和 disktype=hdd
标签的节点上,您可以在 Pod 定义文件中使用以下 nodeSelector:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
environment: production
disktype: hdd
当您应用这个 Pod 定义文件时,Kubernetes 调度器会将 my-pod 调度到具有 environment=production 和 disktype=hdd 标签的节点上。
更多推荐
所有评论(0)