k8s学习记录(三):Pod基础-Node选择

一、前言

在上一篇文章中我们学习了Pod的一些基本的知识,今天我们将继续学习Pod。

二、K8S如何选择节点来运行Pod

我们知道在一个K8S集群中,会有多个工作节点(Worker Node),那么k8s会选择那个node呢?接下来我们将学习一下k8s是如何选择适合的node来运行我们所需要的Pod。

1、NodeName

首先我们可以通过指定Node名称来让k8s将pod调度到指定的Node,目前笔者的环境里有1个Master和2个Worker节点,如下图。

1、不指定NodeName

首先我们先什么都不指定,让k8s自动为我们调度,看看会将Pod分配到那个Node上。我们编写一个yaml

yaml 复制代码
apiVersion: v2
kind: Pod
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
   containers:
   - name: my-nginx
     image: nginx
     ports:
     - containerPort: 80

执行命令

shell 复制代码
 kubectl apply -f nginx.yaml

(这里先不用考虑STATUS 为 ImagePullBackOff 这个是因为笔者的网络出了点小问题,导致拉取镜像失败),可以看到我们的Nginx被k8s调度到了node3 节点,那如果我们想指定pod调度到node2节点呢,接下来我们继续实验。

2、指定NodeName

1、我们先删除之前创建的pod,使用命令

shell 复制代码
 kubectl delete pod my-nginx

2、修改之前的yaml资源清单

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
   containers:
   - name: my-nginx
     image: nginx
     ports:
     - containerPort: 80
   nodeName: node2

3、执行命令

shell 复制代码
 kubectl apply -f nginx.yaml

4、创建完成后我们查看Pod使用命令

shell 复制代码
kubectl get pods -o wide

可以看到nginx这个pod已经被调度到了node2节点。

3、小结

使用NodeName可以手动指定Pod调度到那个Node上,那么这种操作适用于什么场景呢?

复制代码
- 部署基础设施Pod,一些k8s的基础设施需要在指定节点运行,例如监控代理或者日志收集器等,这些Pod的部署和调度必须稳定和可靠,不能被k8s自动调度,这种情况下我们可以指定Node
- 管理节点资源:例如我们要维护某个节点,此时我们可以将当前节点的pod部署到其他我们指定的节点上,从而避免k8s自动分配到当前Node

2、nodeSelector

除了使用NameNode我们还可以使用nodeSelector来指定调度的Node。我们下看下NodeSelector的介绍,使用命令

shell 复制代码
kubectl explain pod.spec.nodeSelector

可以看到nodeSelector是一个Map结构,官网文档地址https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector nodeSelector用于将Pod调度到包含指定label(标签)的Node上

实验步骤:

1、给两个node添加上标签,给node1打上标签 cpu=high (CPU为高性能),给node2打上标签cpu=low(CPU为低性能)

shell 复制代码
 kubectl label nodes node2 cpu=hgih
 kubectl label nodes node3 cpu=low

2、查看一下这个标签

shell 复制代码
kubectl get nodes -L cpu

3、删除刚才的pod

shell 复制代码
 kubectl delete pod my-nginx

4、编写yaml

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
   containers:
   - name: my-nginx
     image: nginx
     ports:
     - containerPort: 80
   nodeSelector:
      cpu: high

5、执行创建命令

我们预期该pod会被创建在node1上,因为我们这里匹配的标签的是cpu high,我们直接运行命令看一下结果。

shell 复制代码
kubectl apply -f nginx.yaml

但是预期的现象并没有发生,pod一直处于pending状态,仔细看一下yaml和标签,结果发现是单词拼错了。node标签是 cpu=high 而我们清单上写的high导致匹配不到node,此时会一直pending住。直到有能匹配上的node。所以现在有两种方案,改资源清单或者改node上的标签,我们选择后者。

shell 复制代码
kubectl label nodes node2 cpu=high --overwrite=true

再次查看node上的标签

接着查看pod

至此Pod已经完成了调度

三、总结

今天我们学习了如何手动控制K8S调度Pod,分别可以通过NodeName和NodeSelector来指定,前者通过名称来指定Node而后者是通过标签来指定。接下来的文章我们会继续学习Pod其他知识希望对你有所帮助。

四、未完待续

相关推荐
学Linux的语莫38 分钟前
kubekey离线搭建k8s高版本>23安装,cri-dockerd通信
云原生·容器·kubernetes
知识分享小能手4 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
茯苓gao7 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾7 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT8 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa8 小时前
HTML和CSS学习
前端·css·学习·html
Ribou9 小时前
Ubuntu 24.04.2安装k8s 1.33.4 配置cilium
linux·ubuntu·kubernetes
慕容晓开9 小时前
docker,本地目录挂载
docker
看海天一色听风起雨落9 小时前
Python学习之装饰器
开发语言·python·学习
speop10 小时前
llm的一点学习笔记
笔记·学习