【云原生】Kubernetes 指定节点部署 Pod

👨‍🎓博主简介

  🏅优快云博客专家
  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


前言

在 Kubernetes 集群中,Pod 的调度默认是根据一定的规则自动分配到各个节点上。然而,在一些特定的业务场景下,我们可能需要将 Pod 部署到指定的节点上,以满足特定的资源需求或部署策略。本文将介绍如何绑定pod到指定的节点上部署及使用方法;

一、指定节点的几种方法

方法名称原理适用场景注意事项
nodeName直接在 Pod 配置中指定节点名称,Pod 将被调度到该节点上。- 单节点部署
- 快速测试
- 只能指定一个节点
- 节点不存在时 Pod 无法启动
nodeSelector通过节点的标签选择目标节点,Pod 将被调度到匹配标签的节点上。- 多节点部署
- 根据节点特性(如主机、自定义标签)部署
- 标签必须预先添加到节点上
- 无匹配节点时 Pod 等待调度

方法说明

  1. nodeName:最简单直接的方法,但灵活性较差,硬亲和,在使用节点隔离时不受影响
  2. nodeSelector:可通过标签选择节点,适用于多节点部署,软亲和,在使用节点隔离时会受影响

根据实际需求选择合适的方法,可以灵活地实现 Pod 的调度策略。

二、nodeName

2.1 写法

nodeName: k8s-node2

需在部署的yaml文件中,containers上面,spec下面添加指定节点名称;
需注意格式,yaml对格式较严格;

2.2 实现

2.2.1 编辑 deployment 配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # 指定运行的节点
      nodeName: k8s-node2
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
        resources:         
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"

2.2.2 运行创建pod进行测试

kubectl apply -f nginx-deployment.yaml

2.2.3 验证

kubectl get pods -n nginx -o wide


可以看到nginx服务已经在k8s-node2上启动了,证明成功了;

三、nodeSelector

nodeSelectornodeName 不同,nodeSelector 是通过节点的标签(label)来选择目标节点的。这种方法更加灵活,可以将 Pod 部署到具有特定标签的单个或多个节点上。

3.1 写法

  • 根据主机名标签来指定节点
nodeSelector:
  kubernetes.io/hostname: k8s-node1
  • 根据自定义标签来指定节点

自定义标签需先手动加入labels

nodeSelector:
  type: nginx-cluster

需在部署的yaml文件中,containers上面,spec下面添加指定节点名称;
需注意格式,yaml对格式较严格;

3.2 支持的标签类型

  1. 自定义标签:可以根据自己需求为任意节点添加任意的自定义标签。

    • 示例:custom-label: custom-value
  2. 内置标签:Kubernetes 自带了一些内置的标签,这些标签通常用于描述节点的属性。

    • kubernetes.io/hostname:节点的主机名(最常用)。
    • kubernetes.io/os:节点的操作系统类型(如 linuxwindows)。
    • kubernetes.io/arch:节点的架构类型(如 amd64arm64)。
    • topology.kubernetes.io/region:节点所在的区域。
    • topology.kubernetes.io/zone:节点所在的可用区。
    • node.kubernetes.io/instance-type:节点的实例类型(如云服务提供商的实例类型)。
  3. 其他常见标签

    • disktype:节点的磁盘类型(如 ssdhdd)。
    • environment:节点的环境类型(如 productionstaging)。
    • role:节点的角色(如 workermaster)。

  • 注意事项

1、标签必须预先存在:在使用 nodeSelector 之前,必须确保目标节点上已经添加了相应的标签。否则,Pod 无法被调度到任何节点上。
2、标签的唯一性:虽然 nodeSelector 允许使用多个键值对,但每个键只能有一个值。如果需要更复杂的匹配逻辑,可以使用 nodeAffinity
3、兼容性:确保标签的键和值符合 Kubernetes 的标签规范(如长度限制、字符限制等)。

查看标签是否存在,可使用如下命令查看:

# 二选一即可
kubectl describe nodes k8s-node1 | grep -iA10 labels
kubectl get nodes k8s-node2 --show-labels

3.3 实例

3.3.1 根据主机名标签来指定节点

为了和上面的演示区分,这里我改成k8s-node1节点;

  • 编辑 deployment 配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # 指定运行的节点
      nodeSelector:
         kubernetes.io/hostname: k8s-node1
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
        resources:         
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"
  • 运行创建pod进行测试
kubectl apply -f nginx-deployment.yaml
  • 验证
kubectl get pods -n nginx -o wide

可以看到nginx服务已经在k8s-node1上启动了,证明成功了;

3.3.2 根据自定义标签来指定节点

  • 首先,我们需要对想部署的节点打个标签(例如,k8s-node1、k8s-node2节点)
kubectl label nodes k8s-node1 k8s-node2 type=nginx-cluster
  • 确认标签是否生效
# 查看node1、node2节点是否多了一个type类型的标签
kubectl get nodes --show-labels
# 或者查询有type=nginx-cluster标签的节点
kubectl get nodes -l type=nginx-cluster

  • 成功生效之后,开始修改配置文件
  • 开3个副本,方便观察pod的节点指向
  • 使用自定义标签来指定节点
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx
  labels:
    app: nginx
spec:
  # 副本数可以多开几个
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # 根据type=nginx-cluster标签来自定义随机节点
      nodeSelector:
         type: nginx-cluster
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
        resources:         
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"
  • 运行创建pod进行测试
kubectl apply -f nginx-deployment.yaml
  • 验证
kubectl get pods -n nginx -o wide

这样根据自定义标签(多台node),就会随机到任意一台节点上;

四、总结

在 Kubernetes 中,根据实际需求选择合适的 Pod 调度方法非常重要。nodeName 方法简单直接,适用于将 Pod 部署到单个指定节点的场景;而 nodeSelector 方法则更加灵活,可以通过标签匹配将 Pod 部署到多个符合条件的节点上。在实际使用中,可以根据业务需求和集群的配置情况,选择最适合的方法来实现 Pod 的指定节点部署。

评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A-刘晨阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值