k8s中应用NodeSelector调度

为了将新的命名空间仅调度到特定的节点(如 node3),而不调度到其他节点(如 node1 和 node2),你可以使用 Kubernetes 的 nodeSelector、nodeAffinitytaintstolerations 功能。
方法 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: 使用 taintstolerations
通过给 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=productiondisktype=hdd 这两个标签。
使用标签的 Pod 示例
假设您希望您的 Pod 仅调度到具有 environment=productiondisktype=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 标签的节点上。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值