k8s的集群调度---下

这篇具有很好参考价值的文章主要介绍了k8s的集群调度---下。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前情回顾

预算策略:过滤出合适的节点

优选策略:选择部署的节点

nodeName:硬匹配,不走调度策略。node01.

nodeSelector:根据节点的标签选择,会走调度算法。

只要是走调度算法,在不满足预算策略的情况下,所有pod都是pending。

node节点的亲和性:硬策略和软策略

硬策略:必须一定。匹配原则:根据节点的标签

软策略:尽量满足你的要求。

pod的亲和性和反亲和性

调度策略 匹配标签 操作符 拓展域 调度目标
node亲和性 主机标签 In,NotIn,Exists,DoesExists,Gt,Lt 不支持 指定主机
pod亲和性 pod的标签 In(在),NotIn(不在),Exists(存在),DoesExists(不存在) 支持 pod和指定标签的pod部署在同一个拓扑域
pod反亲和性 pod的标签 In,NotIn,Exists,DoesExists 支持 pod和指定标签的pod部署在同一个拓扑域

拓扑域:k8s集群节点当中的一个组织结构,可以根据节点的物理关系或者逻辑关系进行划分。

可以用来表示节点之间的空间关系,网络关系或者其他类型的关系。

pod内的拓扑域也就是  --->  标签

pod亲和性演示操作

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - image: nginx:1.22
        name: nginx1
      affinity:
        podAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx1
            topologyKey: test1
#toplogyKey指定拓扑域的关键字段,表示正在使用test1作为拓扑域的关键字。test1一般都是节点标签,表示希望把pod调度到包含有app标签的Pod,值为nginx1的在test1的拓扑域上的节点。

k8s的集群调度---下,K8s,kubernetes,容器,云原生

k8s的集群调度---下,K8s,kubernetes,容器,云原生

k8s的集群调度---下,K8s,kubernetes,容器,云原生

部署pod时候会遇到pending的情况,是因为指定条件没有一个可以满足!!!!

pod亲和性的软策略展示

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - image: nginx:1.22
        name: nginx1
      affinity:
        podAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: DoesNotExist
              topologyKey: test3

k8s的集群调度---下,K8s,kubernetes,容器,云原生

k8s的集群调度---下,K8s,kubernetes,容器,云原生

pod的反亲和性


apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - image: nginx:1.22
        name: nginx1
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx1
              topologyKey: test3

k8s的集群调度---下,K8s,kubernetes,容器,云原生

k8s的集群调度---下,K8s,kubernetes,容器,云原生

总结:反亲和性顾名思义和亲和性相反,相当于NotIn

注意点:

1.pod的亲和性策略,在配置时,必须要加上拓扑域的关键字

2.pod亲和性的策略也分为硬策略和软策略

3.pod亲和性的notin可以替代反亲和性

4.pod亲和性主要是为了把相关联的pod部署在同一个节点。

k8s中污点和容忍可以配合node的亲和性一块使用

污点与容忍的概念


节点亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 Pod。

污点(Taint) 和 容忍(Toleration) 相互配合,可以用来避免 Pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 Pod,是不会被该节点接受的。如果将 toleration 应用于 Pod 上,则表示这些 Pod 可以(但不一定)被调度到具有匹配 taint 的节点上。

当前 taint effect 支持如下三个选项:

●NoSchedule:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上

●PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上

●NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去
 

注意点:节点服务器肯定是需要维护的,服务器关机,此时节点上的pod将会失效。在工作中我们主要部署pod的方式控制器部署。尤其是deployment用的最多。一旦节点使用的是驱逐。控制器创建的pod会在其他节点重新部署。所以驱逐的应用场景:资源迁移。

1.所有的pod都会被驱逐,和命名空间无关(包括flannel等),kube-proxy是节点组件,所以他还存在。

2.不论你的创建方式是什么,都会被驱逐

k8s的集群调度---下,K8s,kubernetes,容器,云原生

污点的基本操作

格式:kubectl describe nodes <节点名称> | grep Taints 
或者是kubectl describe nodes <节点名称> | grep -i taints
eg:查看master01的污点
kubectl describe nodes master01 |grep -i taints

k8s的集群调度---下,K8s,kubernetes,容器,云原生

如何设置污点

kubectl taint node node01 key=1:NoSchedule

kubectl taint node node名称 名称

k8s的集群调度---下,K8s,kubernetes,容器,云原生

污点的容忍机制

容忍:即使集群上设置了污点,有了容忍机制,依然可以在设置为污点的节点上部署pod。

k8s的集群调度---下,K8s,kubernetes,容器,云原生

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx2
  name: nginx2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      tolerations:
      - key: key
        operator: Equal
        value: "1"
        effect: NoSchedule
容忍策略:容忍节点上的标签key,对应的标签值是1,effect就是对应的污点的类型

其他都是NoSchedule,所以无法匹配,就是pending。

k8s的集群调度---下,K8s,kubernetes,容器,云原生

k8s的集群调度---下,K8s,kubernetes,容器,云原生

污点---NoExcute

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx2
  name: nginx2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      tolerations:
      - key: key
        operator: Equal
        value: "2"
        effect: NoExecute
        tolerationSeconds: 10

k8s的集群调度---下,K8s,kubernetes,容器,云原生

k8s的集群调度---下,K8s,kubernetes,容器,云原生

到时间就会销毁,反复循环

k8s的集群调度---下,K8s,kubernetes,容器,云原生

特殊情况:NotExecute依然可以部署pod,但是有生命周期,时间一到,pod会被销毁,生命周期结束之后会驱逐一部分pod到其他节点

  tolerations:
      - key: key
        operator: Exists
        effect: NoSchedule


指定key的值(节点的标签值),但是不指定污点的类型,所有节点上只要包含了指定的标签名,可以容忍所有的污点

      tolerations:
      - operator: Exists
        effect: NoSchedule
没有key,不匹配节点的标签,容忍所有污点,但是类型是指定的类型(只要是effect指定的,我都能容忍)

总结:

多个master节点:

kubelet taint node master节点名称 node-role.kubernetes.io/master=PreferNoSchedule

尽量不往master节点上部署pod,但是不是一定的,防止资源浪费。自定义一个标签。

业务维护: node02需要维护两个小时,但是这个业务上还有pod在运行,此时就需要将这个节点的污点设置成NoExecute。

我们部署pod一般都使用deployment部署,会在其他的节点重新部署,并不是被杀死

自主式的pod会被杀死。

一旦节点恢复,一定要把污点驱逐

cordon和drain

cordon:可以直接把节点标记为不可用的状态。

kubectl get node
kubectl cordon master01
kkubectl get node
kubectl uncordon master01

k8s的集群调度---下,K8s,kubernetes,容器,云原生

drain

排水,把该节点下的节点全部转移到其他的node节点上运行。

1.一旦执行drain,被执行的节点会变成不可调度状态。

2.会驱逐该节点上的所有pod。文章来源地址https://www.toymoban.com/news/detail-825260.html

kubectl drain node02 --ignore-daemonsets --delete-local-data --force


drain:排水,标记node节点为不可调度,然后驱逐pod
--ignore-daemonsets:无视daemonsets部署的pod,daemonsets部署的pod还在节点
--delete-local-data:有本地挂载卷的pod会被强制杀死
--force:强制释放不是控制器管理的pod。
还是如何管理和部署pod

到了这里,关于k8s的集群调度---下的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生Kubernetes:K8S集群各组件服务重启

    目录 一、理论 1.各组件服务重启命令 (1)Master节点+Node节点共同服务 (2)Master节点独有服务 (3)Node节点独有服务

    2024年02月03日
    浏览(46)
  • 云原生Kubernetes:阿里云托管k8s集群ACK创建和使用

    目录   一、理论 1.容器服务Kubernetes版 2.ACK Pro版集群概述 3.ACK版本说明 二、实验 1.创建专有版Kubernetes集群 三、问题 1.依赖检查未通过   (1)概念 阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Kubernetes一致性认证的服务平

    2024年02月13日
    浏览(72)
  • 【云原生 | Kubernetes 系列】—K8S部署RocketMQ集群(双主双从+同步模式)

    rocketMQ高可用有很多种方式,比如:单机部署,多主集群,双主双从同步部署,双主双从异步部署,以及多主多从部署。部署集群可按照自己公司的实际情况进行部署。 单机部署:只启动一个rocketMQ实例就可以了,一般常用来本机测试使用。原因:一旦rocketMQ因某些原因挂掉,

    2024年02月04日
    浏览(55)
  • 云原生|kubernetes|kubernetes集群部署神器kubekey安装部署高可用k8s集群(半离线形式)

    前面利用kubekey部署了一个简单的非高可用,etcd单实例的kubernetes集群,经过研究,发现部署过程可以简化,省去了一部分下载过程(主要是下载kubernetes组件的过程)只是kubernetes版本会固定在1.22.16版本,etcd集群可以部署成生产用的外部集群,并且apiserver等等组件也是高可用,

    2024年02月15日
    浏览(48)
  • 云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)

    目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验  1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 (1)概念 搭建K8S集群的方式有很多种,比如二进制,kubeadm,RKE(Rancher)等,K8S集群升级方式也各有千秋,目前准备使用kubeadm方式搭建的k8s集群

    2024年02月07日
    浏览(48)
  • 云原生Kubernetes:K8S集群版本升级(v1.20.15 - v1.22.14)

    目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群(v1.21.14) 4.验证集群(v1.21.14) 5.升级集群(v1.22.14) 6.验证集群  (v1.22.14) 二、实验  1.升级集群(v1.21.14) 2.验证集群(v1.21.14)  3.升级集群(v1.22.14) 4.验证集群(v1.22.14) (1)概念 搭建K8S集群的方式有很多种,比如二

    2024年02月07日
    浏览(43)
  • 云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行

    Kubernetes是一个开源的, 用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用能简单并且高效的使用, 提供了应用部署,规划,更新,维护的一种机制 。其核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着,管理员可

    2024年02月08日
    浏览(82)
  • 【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据 II 将pod数据传递给容器

    在上一篇文章中,我们学习了针对容器设置启动时要执行的命令和参数、定义相互依赖的环境变量、为容器设置环境变量,三种设置方式,本篇文章,我们将继续学习数据的传递。 有两种方式可以将 Pod 和 Container 字段传递给运行中的容器: 环境变量 卷文件 这两种呈现 Pod

    2024年01月25日
    浏览(124)
  • 云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

    基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。 Note: 由于是测试环境,以下创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。 共用到了三台

    2024年02月19日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包