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

👨‍🎓博主简介

🏅CSDN博客专家

🏅云计算领域优质创作者

🏅华为云开发者社区专家博主

🏅阿里云开发者社区专家博主

💊交流社区: 运维交流社区 欢迎大家的加入!

🐋 希望大家多多支持,我们一起进步!😄

🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 前言
  • 一、指定节点的几种方法
  • 二、nodeName
    • [2.1 写法](#2.1 写法)
    • [2.2 实现](#2.2 实现)
      • [2.2.1 编辑 deployment 配置文件](#2.2.1 编辑 deployment 配置文件)
      • [2.2.2 运行创建pod进行测试](#2.2.2 运行创建pod进行测试)
      • [2.2.3 验证](#2.2.3 验证)
  • 三、nodeSelector
    • [3.1 写法](#3.1 写法)
    • [3.2 支持的标签类型](#3.2 支持的标签类型)
    • [3.3 实例](#3.3 实例)
      • [3.3.1 根据主机名标签来指定节点](#3.3.1 根据主机名标签来指定节点)
      • [3.3.2 根据自定义标签来指定节点](#3.3.2 根据自定义标签来指定节点)
  • 四、总结

前言

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

一、指定节点的几种方法

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

方法说明

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

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

二、nodeName

2.1 写法

yaml 复制代码
nodeName: k8s-node2

需在部署的yaml文件中,containers上面,spec下面添加指定节点名称;

需注意格式,yaml对格式较严格;

2.2 实现

2.2.1 编辑 deployment 配置文件

yaml 复制代码
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进行测试

bash 复制代码
kubectl apply -f nginx-deployment.yaml

2.2.3 验证

bash 复制代码
kubectl get pods -n nginx -o wide

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

三、nodeSelector

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

3.1 写法

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

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

yaml 复制代码
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 的标签规范(如长度限制、字符限制等)。

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

bash 复制代码
# 二选一即可
kubectl describe nodes k8s-node1 | grep -iA10 labels
kubectl get nodes k8s-node2 --show-labels

3.3 实例

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

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

  • 编辑 deployment 配置文件
yaml 复制代码
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进行测试
bash 复制代码
kubectl apply -f nginx-deployment.yaml
  • 验证
bash 复制代码
kubectl get pods -n nginx -o wide

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

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

  • 首先,我们需要对想部署的节点打个标签(例如,k8s-node1、k8s-node2节点)
bash 复制代码
kubectl label nodes k8s-node1 k8s-node2 type=nginx-cluster
  • 确认标签是否生效
bash 复制代码
# 查看node1、node2节点是否多了一个type类型的标签
kubectl get nodes --show-labels
# 或者查询有type=nginx-cluster标签的节点
kubectl get nodes -l type=nginx-cluster
  • 成功生效之后,开始修改配置文件
  • 开3个副本,方便观察pod的节点指向
  • 使用自定义标签来指定节点
bash 复制代码
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进行测试
bash 复制代码
kubectl apply -f nginx-deployment.yaml
  • 验证
bash 复制代码
kubectl get pods -n nginx -o wide

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

四、总结

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

相关推荐
AI云原生3 小时前
《开箱即用的高性能:openEuler 默认配置下的 Web 服务性能评测》
运维·前端·docker·云原生·开源·开源软件·开源协议
草莓熊Lotso3 小时前
哈希表的两种灵魂:深入探索开放定址与链地址法的核心机密
linux·运维·数据结构·c++·人工智能·算法·哈希算法
汪碧康3 小时前
【k8s-1.34.2安装部署】一.系统初始化及k8s集群规划
云原生·容器·kubernetes
路边草随风3 小时前
java实现发布flink k8s application模式作业
java·大数据·flink·kubernetes
漏洞文库-Web安全3 小时前
渗透测试中的方法论
linux·运维·学习·安全·web安全·网络安全·逆向
jiayong233 小时前
Linux ps 命令深度解析与实战技巧
linux·运维·服务器
wanhengidc3 小时前
防火墙是如何保障网络安全
运维·服务器·科技·安全·web安全·云计算·php
weixin_307779133 小时前
Jenkins Pipeline Graph View插件:可视化流水线的核心工具
运维·开发语言·架构·jenkins
未知原色3 小时前
NODE.JSB快速下载及安装
linux·运维·node.js