小碗汤 · 2019年11月27日

备战CKA每日一题——第6天 | kube-scheduler调度器高级调度:亲和性反亲和性调度,Deployment升级回滚

本活动在微信公众号【我的小碗汤】上举行,有送书活动!这里参与答题不能参与到送书活动哦!

昨日考题

通过命令行,创建两个deployment。

    • 需要集群中有2个节点 ;
    • 第1个deployment名称为cka-1122-01,使用nginx镜像,有2个pod,并配置该deployment自身的pod之间在节点级别反亲和;
    • 第2个deployment名称为cka-1122-02,使用nginx镜像,有2个pod,并配置该deployment的pod与第1个deployment的pod在节点级别亲和;

    最好提交最精简的deployment yaml,如果评论被限制,请提交反亲和性配置块yaml,也可多次评论提交

    昨日答案

    第一个deployment:cka-1122-01

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: cka-1122-01
      name: cka-1122-01
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: cka-1122-01
      template:
        metadata:
          labels:
            app: cka-1122-01
        spec:
          containers:
          - image: nginx
            name: cka-1122-01  
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - cka-1122-01
                  topologyKey: "kubernetes.io/hostname"

    第二个deployment:cka-1122-02

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: cka-1122-02
      name: cka-1122-02
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: cka-1122-02
      template:
        metadata:
          labels:
            app: cka-1122-02
        spec:
          containers:
          - image: nginx
            name: cka-1122-02
          affinity:
            podAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - cka-1122-01
                topologyKey: "kubernetes.io/hostname"

    最终调度结果:

    NAME                           READY     STATUS    RESTARTS   AGE       IP           NODE
    cka-1122-01-5df9bdf8c9-qwd2v    1/1         Running      0       8m     10.192.4.2     node-1
    cka-1122-01-5df9bdf8c9-r4rhs    1/1      Running      0       8m     10.192.4.3     node-2  
    cka-1122-02-749cd4b846-bjhzq     1/1      Running      0       10m    10.192.4.4    node-1
    cka-1122-02-749cd4b846-rkgpo     1/1      Running      0       10m    10.192.4.5    node-2  

    昨日解析

    考点:k8s中的高级调度及用法。
    亲和性和反亲和性调度官方文档:
    https://kubernetes.io/docs/co...

    将 Pod 调度到特定的 Node 上:nodeSelector

    nodeSelector是节点选择约束的最简单推荐形式。 nodeSelector是PodSpec下的一个字段。它指定键值对的映射。为了使Pod可以在节点上运行,该节点必须具有每个指定的键值对作为label。
    在这里插入图片描述

    语法格式:map[string]string 作用:
    – 匹配node.labels
    – 排除不包含nodeSelector中指定label的所有node
    – 匹配机制 —— 完全匹配

    nodeSelector 升级版:nodeAffinity

    节点亲和性在概念上类似于nodeSelector,它可以根据节点上的标签来限制Pod可以被调度在哪些节点上。
    在这里插入图片描述
    红色框为硬性过滤:排除不具备指定label的node;在预选阶段起作用;

    绿色框为软性评分:不具备指定label的node打低分, 降低node被选中的几率;在优选阶段起作用;

    与nodeSelector关键差异

    – 引入运算符:In,NotIn (labelselector语法)
    – 支持枚举label可能的取值,如 zone in [az1, az2, az3...]
    – 支持硬性过滤和软性评分
    – 硬性过滤规则支持指定多条件之间的逻辑或运算
    – 软性评分规则支持 设置条件权重值

    让某些 Pod 分布在同一组 Node 上:podAffinity

    Pod亲和性和反亲和性可以基于已经在节点上运行的Pod上的标签而不是基于节点上的标签,来限制Pod调度的节点。

    规则的格式为:

    如果该X已经在运行一个或多个满足规则Y的Pod,则该Pod应该(或者在反亲和性的情况下不应该)在X中运行。

    Y表示为LabelSelector。X是一个拓扑域,例如节点,机架,云提供者区域,云提供者区域等。
    在这里插入图片描述
    红框硬性过滤: 排除不具备指定pod的node组;在预选阶段起作用;

    绿框软性评分: 不具备指定pod的node组打低分, 降低该组node被选中的几率;在优选阶段起作用;

    与nodeAffinity的关键差异

    – 定义在PodSpec中,亲和与反亲和规则具有对称性
    – labelSelector的匹配对象为Pod
    – 对node分组,依据label-key=topologyKey,每个labelvalue取值为一组
    – 硬性过滤规则,条件间只有逻辑与运算

    避免某些 Pod 分布在同一组 Node 上:podAntiAffinity

    在这里插入图片描述

    与podAffinity的差异

    – 匹配过程相同
    – 最终处理调度结果时取反

    – podAffinity中可调度节点,在podAntiAffinity中为不可调度
    – podAffinity中高分节点,在podAntiAffinity中为低分

    今日考题

    通过命令行,创建1个deployment,副本数为3,镜像为nginx:latest。然后滚动升 级到nginx:1.9.1,再回滚到原来的版本
    要求:Deployment的名称为cka-1125,贴出用到的相关命令。
    最好附带创建的Deployment完整yaml,以及和升级回滚有关的命令。

    作者简介

    作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写linux、golang、docker、kubernetes等知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源(注明:来源于公众号:我的小碗汤, 作者:小碗汤)

    作者简洁

    作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写go语言、docker、kubernetes、java等开发、运维知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源(注明:来源于公众号:我的小碗汤,作者:小碗汤)
    推荐阅读
    关注数
    1
    文章数
    116
    微信公众号【我的小碗汤】博主,分享技术文章和记录编程中遇到的问题及解决方案,工作中提高效率的工具,推送原创文章及优秀文章等
    目录
    极术微信服务号
    关注极术微信号
    实时接收点赞提醒和评论通知
    安谋科技学堂公众号
    关注安谋科技学堂
    实时获取安谋科技及 Arm 教学资源
    安谋科技招聘公众号
    关注安谋科技招聘
    实时获取安谋科技中国职位信息