一 Kubernetes 调度简介

除了让 kubernetes 集群调度器自动为 pod 资源选择某个节点(默认调度考虑的是资源足够,并且 load 尽量平均),有些情况我们希望能更多地控制 pod 应该如何调度。比如,集群中有些机器的配置更好( SSD,更好的内存等),我们希望比较核心的服务(比如说数据库)运行在上面;或者某两个服务的网络传输很频繁,我们希望它们最好在同一台机器上,或者同一个机房。有一些特殊的应用,我们就希望它们能运行在我们指定的节点上,还有些情况下,我们希望某个应用在所有的节点上都能运行一份。

针对不同的应用场景,kubernetes内置了多种调度方式可供选择。包括标签选择器,daemonsets,节点亲和性,pod亲和性,污点与容忍等。

二 标签选择器

这种方式其实就是我们最常用的使用label的方式,给某一个node打上特定的标签,然后在启动pod的时候,通过nodeSelector指定要调度到的node节点的标签。

2.1  nodeSelector打标签

[root@docker-server1 ingress]# kubectl get nodes

NAME              STATUS   ROLES    AGE     VERSION
192.168.132.131 Ready master 3d18h v1.17.0
192.168.132.132 Ready <none> 3d18h v1.17.0
192.168.132.133 Ready <none> 3d18h v1.17.0

root@docker-server1 ingress]# kubectl get pods  -n ingress-nginx -o wide

NAME                                        READY   STATUS    RESTARTS   AGE   IP                NODE              NOMINATED NODE   READINESS GATES
nginx-ingress-controller-5c6985f9cc-wkngv 1/1 Running 0 22h 192.168.132.132 192.168.132.132 <none> <none>

[root@docker-server1 ingress]# kubectl get nodes --show-labels

NAME              STATUS   ROLES    AGE     VERSION   LABELS
192.168.132.131 Ready master 3d18h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.132.131,kubernetes.io/os=linux,node-role.kubernetes.io/master=
192.168.132.132 Ready <none> 3d18h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.132.132,kubernetes.io/os=linux
192.168.132.133 Ready <none> 3d18h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.132.133,kubernetes.io/os=linux

默认为节点打的标签:系统版本,节点名称,系统架构

[root@docker-server1 ingress]# vi nginx-controller.yaml

nodeSelector:
kubernetes.io/os: linux

这个标签对于目前的条件,没有任何意义

2.2 重新添加一个唯一标签

nodeSelector:
kubernetes.io/os: linux
kubernetes.io/hostname: 192.168.132.133 #这是一个危矣标签

标签是可以是多个,而且是逻辑与的关系,即当所有的标签都满足,才能成立,如果都不满足,就会pengding

[root@docker-server1 ingress]# kubectl apply -f nginx-controller.yaml

namespace/ingress-nginx unchanged
configmap/nginx-configuration unchanged
configmap/tcp-services unchanged
configmap/udp-services unchanged
serviceaccount/nginx-ingress-serviceaccount unchanged
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole unchanged
role.rbac.authorization.k8s.io/nginx-ingress-role unchanged
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding unchanged
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding unchanged
deployment.apps/nginx-ingress-controller configured
limitrange/ingress-nginx configured

[root@docker-server1 ingress]# kubectl get pods  -n ingress-nginx -o wide

NAME                                        READY   STATUS              RESTARTS   AGE   IP                NODE              NOMINATED NODE   READINESS GATES
nginx-ingress-controller-5c6985f9cc-wkngv 1/1 Running 0 22h 192.168.132.132 192.168.132.132 <none> <none>
nginx-ingress-controller-5cffd956bf-dm9qf 0/1 ContainerCreating 0 4s 192.168.132.133 192.168.132.133 <none> <none>

[root@docker-server1 ingress]# kubectl get pods  -n ingress-nginx -o wide

NAME                                        READY   STATUS    RESTARTS   AGE    IP                NODE              NOMINATED NODE   READINESS GATES
nginx-ingress-controller-5cffd956bf-dm9qf 1/1 Running 0 4m3s 192.168.132.133 192.168.132.133 <none> <none>

然后就运行在了192.168.132.133上

2.3 无满足标签

apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 1
selector:
matchLabels:
name: busybox
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 10%
maxUnavailable: 0
template:
metadata:
labels:
name: busybox
spec:
nodeSelector:
aaa: bbb
containers:
- name: busybox
image: busybox
command:
- /bin/sh
- -c
- "sleep 3600"

[root@docker-server1 deployment]# kubectl apply -f busybox-deployment.yaml

deployment.apps/busybox configured

[root@docker-server1 deployment]# kubectl get pods

busybox-546555c84-2psbb             1/1     Running   13         24h
busybox-674bd96f74-m4fst 0/1 Pending 0 13s

[root@docker-server1 deployment]# kubectl describe pods busybox-674bd96f74-m4fst

Type     Reason            Age        From               Message
---- ------ ---- ---- -------
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.

一直pengding状态,是因为没有匹配的标签

2.4 为节点打标签

[root@docker-server1 deployment]# kubectl label node 192.168.132.132 aaa=bbb

node/192.168.132.132 labeled

[root@docker-server1 deployment]# kubectl get pods

NAME                                READY   STATUS              RESTARTS   AGE
busybox-546555c84-2psbb 1/1 Running 13 24h
busybox-674bd96f74-m4fst 0/1 ContainerCreating 0 7m26s

[root@docker-server1 deployment]# kubectl describe pods busybox-674bd96f74-m4fst

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
Normal Scheduled <unknown> default-scheduler Successfully assigned default/busybox-674bd96f74-m4fst to 192.168.132.132
Normal Pulling 38s kubelet, 192.168.132.132 Pulling image "busybox"
Normal Pulled 34s kubelet, 192.168.132.132 Successfully pulled image "busybox"
Normal Created 34s kubelet, 192.168.132.132 Created container busybox
Normal Started 33s kubelet, 192.168.132.132 Started container busybox

2.5 删除标签

[root@docker-server1 deployment]# kubectl label node 192.168.132.132  aaa-

删除标签后,已经运行的pod会继续运行

[root@docker-server1 deployment]# kubectl get pods -o wide

NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
busybox-674bd96f74-m4fst 1/1 Running 0 12m 10.244.1.29 192.168.132.132 <none> <none>
goproxy 1/1 Running 1 3d11h 10.244.1.21 192.168.132.132 <none> <none>

2.6 删除pods

[root@docker-server1 deployment]# kubectl delete pods busybox-674bd96f74-m4fst

pod "busybox-674bd96f74-m4fst" deleted

root@docker-server1 deployment]# kubectl get pods -o wide

NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
busybox-674bd96f74-8d7ml 0/1 Pending 0 65s <none> <none> <none> <none>

一直不能启动,是因为没有匹配的标签

2.7 自定义标签

为192.168.132.132 打自定义标签

[root@docker-server1 deployment]# kubectl label node 192.168.132.132  ingress=enable

node/192.168.132.132 labeled

[root@docker-server1 deployment]# vim /yamls/ingress/nginx-controller.yaml

nodeSelector:
ingress: enable

[root@docker-server1 deployment]# kubectl apply -f /yamls/ingress/nginx-controller.yaml

namespace/ingress-nginx unchanged
configmap/nginx-configuration unchanged
configmap/tcp-services unchanged
configmap/udp-services unchanged
serviceaccount/nginx-ingress-serviceaccount unchanged
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole unchanged
role.rbac.authorization.k8s.io/nginx-ingress-role unchanged
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding unchanged
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding unchanged
deployment.apps/nginx-ingress-controller configured
limitrange/ingress-nginx configured

[root@docker-server1 deployment]# kubectl get pods -n ingress-nginx -o wide

NAME                                        READY   STATUS        RESTARTS   AGE   IP                NODE              NOMINATED NODE   READINESS GATES
nginx-ingress-controller-5cffd956bf-dm9qf 1/1 Terminating 0 32m 192.168.132.133 192.168.132.133 <none> <none>
nginx-ingress-controller-79669b846b-nlrxl 1/1 Running 0 16s 192.168.132.132 192.168.132.132 <none> <none>

[root@docker-server1 deployment]# kubectl get pods -n ingress-nginx -o wide

NAME                                        READY   STATUS    RESTARTS   AGE   IP                NODE              NOMINATED NODE   READINESS GATES
nginx-ingress-controller-79669b846b-nlrxl 1/1 Running 0 95s 192.168.132.132 192.168.132.132 <none> <none>

另一种,是直接使用nodeName:指定节点IP

[root@docker-server1 deployment]# vim /yamls/ingress/nginx-controller.yaml

hostNetwork: true
nodeName: "192.168.132.133"

[root@docker-server1 deployment]# kubectl get nodes

NAME              STATUS   ROLES    AGE     VERSION
192.168.132.131 Ready master 3d19h v1.17.0
192.168.132.132 Ready <none> 3d19h v1.17.0
192.168.132.133 Ready <none> 3d19h v1.17.0

尽量不要指定nodeName,因为当这个节点断掉之后,必须修改新的nodeName,但是使用标签选择器,直接打标签就可以了

可以这么操作,运行节点的副本设为2,然后给其中两个节点打上相同的标签,在使用标签选择器选择标签,这样就可以让ingress运行在固定的节点上


博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!

008.kubernets的调度系统之标签选择器的更多相关文章

  1. 009.kubernets的调度系统之污点和容忍

    Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...

  2. 010.kubernets的调度系统之daemonset

    daemonset简单操作使用 Deployment 是 Kubernetes 中用于处理无状态服务的资源,而 StatefulSet 是用于支持有状态服务的资源,这两种不同的资源从状态的角度对服务进 ...

  3. K8S调度之标签选择器

    Kubernetes 调度简介 除了让 kubernetes 集群调度器自动为 pod 资源选择某个节点(默认调度考虑的是资源足够,并且 load 尽量平均),有些情况我们希望能更多地控制 pod 应 ...

  4. 容器编排系统之K8s资源标签、标签选择器、资源注解

    前文我们聊到了使用k8s资源配置清单定义资源的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14132890.html:今天我们来聊下资源标签,标签选 ...

  5. 极客技术专题【008期】:CSS3核心技术:选择器

    日期:2013-8-19  来源:GBin1.com 技术专题介绍 技术专题:CSS3核心技术:选择器 专题演讲稿:CSS3选择器 分享人:知名前端技术博客 - w3cplus.com 博主 - 大漠 ...

  6. 4.NFC前台调度系统

    使用目的:当前Activity能直接响应NFC标签,而不需要用户在choose所有能处理的Activity. 使用步骤: 第一步:在onCreate()方法中,创建一个PendingIntent对象 ...

  7. 资源管理与调度系统-YARN的资源调度器

    资源管理与调度系统-YARN的资源调度器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 资源调度器是Hadoop YARN中最核心的组件之一,它是ResourceManager中的 ...

  8. iOS个人中心渐变动画、微信对话框、标签选择器、自定义导航栏、短信验证输入框等源码

    iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 程序员取悦女票的正确姿势---Tip1(iOS美容篇) iOS 前台重启应用和清除角标的问题 微信原生提醒对话框3.0 JHLikeBu ...

  9. 最火的分布式调度系统 XXL-JOB 安装和简单使用

    唉,在谈文章之前先说一下自己的情况.原计划是在上周六写完这篇文章的,然而周六的时候打开电脑的,按照平常"惯例",先补一些 "黑色五叶草"/"进巨&qu ...

随机推荐

  1. 201871030134-余宝鹏 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming) 2.掌握GitHub协作开发程 ...

  2. 动态语言 VS 静态语言

    静态语言 VS 动态语言 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.通俗点说就是在运行时代码可以根据某些条件改变自 ...

  3. Lucas(卢卡斯)定理

    Lucas(卢卡斯)定理 定义 若 \(p\) 为质数,且\(a\ge b\ge1\),则有: \[C_{a}^{b}\equiv C_{a/p}^{b/p}\cdot C_{a (mod\,p)}^ ...

  4. SpringCloud LoadBalancer灰度策略实现

    如何使用 Spring Cloud 2020 中重磅推荐的负载均衡器 Spring Cloud LoadBalancer (下文简称 SCL),如何扩展负载均衡策略? 你将从本文中获取到答案 快速上手 ...

  5. 【CTF】WDCTF-2017 3-1 writeup

    题目来源:WDCTF-2017 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1& ...

  6. (十三)Docker容器进入的4种方式

    简介 在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见 ...

  7. MinIO分布式集群的扩展方案及实现

    目录 一.命令行方式扩展 1. MinIO扩展集群支持的命令语法 2. 扩容示例 二.etcd扩展方案 1. 环境变量 2. 运行多个集群 3. 示例 相关链接 MinIO 支持两种扩展方式: 通过修 ...

  8. Java获取多线程执行结果方式的归纳与总结

    在日常的项目开发中,我们会经常遇到通过多线程执行程序并需要返回执行结果的场景,下面我们就对获取多线程返回结果的几种方式进行一下归纳,并进行简要的分析与总结. 一.Thread.join 在一些简单的应 ...

  9. java语言写一个建议的五子棋

    经过16天的java学习,也学得了不少关于Java方面的知识,我想分享一下我用java写的一个简单的五子棋. 游戏规则: (1)对局双方各执一色棋子.(2)空棋盘开局.(3)白先.黑后,交替下子,每次 ...

  10. 【责任链模式】责任链模式结合Spring实战Demo

    备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...