k8s指定节点部署

在一些业务场景中,会需要将一些pod部署到指定node,按照默认的调度规则,pod会优先分配到负载较小的node中,难免会出现多个pod资源竞争的情况。
k8s有两种常用的方法可以实现将指定pod分配到指定node中。

  • nodeName

    在部署的yaml文件中,对xxx.spec.nodeName指定节点名称,则该pod将只会在该node上进行部署:

$ vim websvr.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: websvr1-deployment
spec:selector:matchLabels:app: websvr1replicas: 3template:metadata:labels:app: websvr1spec:nodeName: k8s-node1     #指定节点名称containers:- name: websvr1image: websvr:v1ports:- containerPort: 3000---apiVersion: v1
kind: Service
metadata:name: websvr1-service
spec:selector:app: websvr1ports:- protocol: TCPport: 3000targetPort: 3000
$ kubectl apply -f websvr1.yamlNAME                                  READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
websvr1-deployment-54cffcc8b4-jw9fl   1/1     Running   0          15s   10.244.36.90   k8s-node1   <none>           <none>
websvr1-deployment-54cffcc8b4-s97ln   1/1     Running   0          15s   10.244.36.92   k8s-node1   <none>           <none>
websvr1-deployment-54cffcc8b4-wglpb   1/1     Running   0          15s   10.244.36.91   k8s-node1   <none>           <none>

可以看到websvr只部署在了k8s-node1上,那么如果现在有三个node,一个pod需要部署在其中两个不同node中,是不是要指定两个node的名称呢,其实这种场景可以使用第二种指定分配的方法:

  • nodeSelector

    和nodeName不同,nodeSelector是可以指定某一种类型的node进行分配,这种类型在k8s里被称为标签(label)

#查看当前node
$ kubectl get node -o wideNAME                STATUS   ROLES                  AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                 CONTAINER-RUNTIME
k8s-elasticsearch   Ready    <none>                 16h   v1.21.0   172.16.66.167   <none>        CentOS Linux 8   4.18.0-305.19.1.el8_4.x86_64   docker://20.10.9
k8s-master          Ready    control-plane,master   43h   v1.21.0   172.16.66.169   <none>        CentOS Linux 8   4.18.0-305.19.1.el8_4.x86_64   docker://20.10.9
k8s-node1           Ready    <none>                 43h   v1.21.0   172.16.66.168   <none>        CentOS Linux 8   4.18.0-305.19.1.el8_4.x86_64   docker://20.10.9
k8s-node2           Ready    <none>                 43h   v1.21.0   172.16.66.170   <none>        CentOS Linux 8   4.18.0-305.19.1.el8_4.x86_64   docker://20.10.9#给k8s-node1 k8s-node2打上标签websvr
$ kubectl label nodes k8s-node1 k8s-node2 type=websvr#查看type=websvr标签的node
$ kubectl get node -l type=websvrNAME        STATUS   ROLES    AGE   VERSION
k8s-node1   Ready    <none>   43h   v1.21.0
k8s-node2   Ready    <none>   43h   v1.21.0#以下附带标签的其他操作:
#修改标签
$ kubectl label nodes k8s-node1 k8s-node2 type=webtest --overwrite#查看node标签
$ kubectl get nodes k8s-node1 k8s-node2 --show-labels#删除标签
$ kubectl label nodes k8s-node1 k8s-node2 type-

修改部署yaml

$ vim websvr1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: websvr1-deployment
spec:selector:matchLabels:app: websvr1replicas: 3template:metadata:labels:app: websvr1spec:nodeSelector:                 #选择标签为type:websvr的node部署type: websvrcontainers:- name: websvr1image: websvr:v1ports:- containerPort: 3000---apiVersion: v1
kind: Service
metadata:name: websvr1-service
spec:selector:app: websvr1ports:- protocol: TCPport: 3000targetPort: 3000

同理修改websvr2.yaml

$ vim websvr2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: websvr2-deployment
spec:selector:matchLabels:app: websvr2replicas: 3template:metadata:labels:app: websvr2spec:nodeSelector:                    #选择标签为type:websvr的node部署type: websvrcontainers:- name: websvr2image: websvr:v2ports:- containerPort: 3001---apiVersion: v1
kind: Service
metadata:name: websvr2-service
spec:selector:app: websvr2ports:- protocol: TCPport: 3001targetPort: 3001
$ kubectl apply -f websvr1.yaml$ kubectl apply -f websvr2.yaml$ kubectl get pods -o wideNAME                                  READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
websvr1-deployment-67fd6cf9d4-cfstc   1/1     Running   0          2m22s   10.244.36.93     k8s-node1   <none>           <none>
websvr1-deployment-67fd6cf9d4-lx6tr   1/1     Running   0          2m22s   10.244.169.151   k8s-node2   <none>           <none>
websvr1-deployment-67fd6cf9d4-zxznp   1/1     Running   0          2m22s   10.244.169.152   k8s-node2   <none>           <none>
websvr2-deployment-67dfc4f674-dz44b   1/1     Running   0          2m10s   10.244.36.95     k8s-node1   <none>           <none>
websvr2-deployment-67dfc4f674-wjg5x   1/1     Running   0          2m10s   10.244.169.153   k8s-node2   <none>           <none>
websvr2-deployment-67dfc4f674-xdk9m   1/1     Running   0          2m10s   10.244.36.94     k8s-node1   <none>           <none>

可以看到此时两个websvr deployment已经部署在指定的node节点上

若有不正确,欢迎指出

k8s 部署pod到指定node相关推荐

  1. Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration

    1.指定pod到指定的node上 #1.1查看节点的lebel kubectl get nodes --show-labels#1.2获取到该节点的label信息 ip-10-100-2-80 Rea ...

  2. Sentinel云原生K8S部署实

    部署的流程图 部署的详细过程 编译Docker镜像 Sentinel源码下载 https://gitee.com/pingfanrenbiji/Sentinel.git Sentinel-dashbo ...

  3. k8s 部署 TCP node应用

    k8s 部署 TCP node应用 之前我们已经成功的将node的http应用部署到k8s集群内,但某些业务不仅仅需要http应用还需要TCP长连接应用,本文将对部署tcp应用的步骤及问题进行总结 本 ...

  4. 【好文收藏】k8s中Pod 无法正常解析域名:部署 DNS 调试工具排查

    k8s 中 Pod 无法正常解析域名:部署 DNS 调试工具排查 问题描述 最近将 Kubernetes 升级到 1.18.1 版本,不过升级完后,查看工作节点的部分 Pod 无法启动,查看消息全是 ...

  5. 关于K8s中Pod调度[选择器,指定节点,主机亲和性]方式和节点[coedon,drain,taint]标记的Demo

    写在前面 嗯,整理K8s中pod调度相关笔记,这里分享给小伙伴 博文内容涉及: kube-scheduler组件的简述 Pod的调度(选择器.指定节点.主机亲和性)方式 节点的coedon与drain ...

  6. 手动安装K8s第六节:node节点部署-kubelet

    部署kubelet 1.准备二进制包 [root@k8smaster ~]# cd /usr/local/src/kubernetes/server/bin/ [root@k8smaster bin] ...

  7. k8s利用deployment部署pod,以及应用更新和回滚操作

    deployment部署pod,也是通过yaml文件的方式部署.deployment通过yaml文件定义需要deploy名称,需要几个pod协助运行,拉取的镜像版本等内容.一般来说一个deployme ...

  8. k8s查看容器日志---查看运行中指定pod以及指定pod中容器的日志

    1.查看指定pod的日志 kubectl logs <pod_name> kubectl logs -f <pod_name> #类似tail -f的方式查看(tail -f ...

  9. k8s查看pod的yaml文件_K8S系列学习,Pod实战那些事儿,有必要知道知道

    Kubernetes学习路上的那些事儿,很有必要分享出来 什么是Pod 要弄清楚这个概念,我们还是先上官网瞧瞧,https://kubernetes.io/zh/docs/concepts/workl ...

最新文章

  1. Authentication Error errorcode: 230 uid: -1 appid -1 msg: APP Scode码校验失败
  2. 一本介绍Javascript 的很好的书【基础期间全局了解】
  3. android 6.0权限
  4. Effective Java~34. 用enum 代替 int 常量
  5. 无法打开Win11系统小组件怎么办
  6. Linux用户:您上一次使用Windows已有多长时间了?
  7. 二分查找(binary_search)
  8. 酷比魔方iwork8刷机shell_酷比魔方iwork8超级版双系统刷机教程,remix+Windows10,序列号i1开头数字结尾...
  9. ArrayList LinkedList
  10. ubuntu 安装万能五笔
  11. 介绍ping中的TTL是什么意思
  12. 【已解决】ModuleNotFoundError: No module named ‘snmp_cmds‘ 缺少snmp-cmds包
  13. 微信公众号消息text换行问题
  14. 2018最佳计算机配置,2018年主流的组装电脑配置是什么样的?
  15. Jmeter压力测试简单教程(包括服务器状态监控)-----转载自lsoqvle 的博客(https://blog.csdn.net/cbzcbzcbzcbz/article/details/780)
  16. 用python输出国际象棋棋盘_python输出国际象棋棋盘的实例分享
  17. 《崔庆才Python3网络爬虫开发实战教程》学习笔记(3):抓取猫眼电影榜单TOP100电影,并存入Excel表格
  18. WVP-PRO+ZLMediaKit搭建GB28181视频平台(linux详细教学)
  19. 手机端移动端的前端原生js裁剪图片上传
  20. micosoft project professional 2010

热门文章

  1. 优麒麟mysql_ubuntu 优麒麟下mysql5.7root密码的重置
  2. 关于GR/IR—业务流程篇
  3. 11GR2 中的常见 RMAN 问题
  4. python计算任意多边形面积
  5. Legendre多项式
  6. 简单胜过复杂的汽车人机界面HMI
  7. MATLAB表白玫瑰花绘制——旋转玫瑰、蓝色玫瑰
  8. git FreshMan指南,五分钟上手(图解)
  9. (九)隐私计算--安全多方计算
  10. Apple M1芯片版Mac系统重装教程