Рубрики
Uncategorized

LFS258 [10/15]: Планирование

TL; DR KUBE-Планировщик: เป็น Процесс หลัก ใน การ ทำ เรื่อง Расписание โดย มี หลัก การ ทำ งาน 2 ขั้นตอ … Тег с Куберанетами, дежоптом.

  • Kube-планировщик : เป็น Процесс หลัก ใน การ ทำ เรื่อง Расписание โดย มี หลัก การ ทำ งาน 2 ขั้นตอน คือ Фильтрация คือ Узлы фильтра ที่ ไม่ เหมาะสม ออก ไป และ Забил เป็น การ ให้ คะแนน Узел ที่ ผ่าน การ การ การ การ หา หา ที่ ้ เหมาะสม กับ pod มาก ที่ สุด
  • Предикаты и приоритеты : เป็น Политика расписания ตัว Устойчивые ของ Kubernetes
  • Удлинительные точки и плагины : เป็น Политика расписания ตัว ใหม่ ของ Kubernetes ที่ เพิ่ง เป็น Beta ใน v1.18
  • Спецификация стручка : เรา สามารถ กำหนด ความ สามารถ พิเศษ และ ความ ต้องการ ของ สามารถ พิเศษ และ ความ ต้องการ ของ Pod ใน Спецификация POD เพื่อ ชี้ นำ การ Расписание POD ไป ยัง Узел ที่ เหมาะสม ของ Kubernetes ได้
  • Указание удовольствия : เป็น การ ระบุ hostname ของ Узел ที่ เรา ต้องการ ให้ POD ไป อยู้
  • Указание Nodeselector : เป็น การ ระบุ Этикетки ของ Узел ที่ POD ต้องการ ให้ Планировщик ส่ง POD ไป Run
  • Правила аффинности подвода : เป็น การ ระบุ ให้ POD ชุด หนึ่ง อยู่ ใน Расположение เดียว กับ
  • Узел аффинности правил : เหมือน Nodeselector แต่ เพิ่ม ความ ยืดหยุ่น ของ аффинность เข้า มา
  • Taints : เป็น การ ระบุ ข้อ จำกัด ของ ของ ของ เช่น เช่น เฉพาะ กลุ่ม หรือ มี оборудование พิเศษ ติดตั้ง อยู่
  • Терпение : เป็น การ ระบุ ความ ทนทาน ต่อ Taints ของ Pods โดย ถ้า POD มี Толерация ต่อ Taints ของ Узел จะ สามารถ ถูก Расписание ไป Запустить ใน Узел นั้น ได้.
  • Пользовательский планировщик : ถ้า планировщик ที่ เป็น по умолчанию ไม่ ถูกใจ เรา สามารถ запустить ตัว планировщик นี้ ขึ้น ขึ้น มา ตัว โดย ที่ ที่ ขึ้น ตาม ตาม ความ ต้องการ เรา เพื่อ เป็น вторичный планировщик ได้ หรือ เขียน ใหม่ เอง หมด ก็ ยัง ได้ แต่ ใน ใน ใน ต้อง ต้อง ระบุ имя планировщика ที่ ต้องการ ต้องการ ต้องการ ใช้ ด้วย ไม่ งั้น จะ จะ ใช้ планировщик по умолчанию

Kube-планировщик ทำ หน้าที่ ใน การ หา หา Узел рабочего ที่ เหมาะสม ให้ POD ไป Run โดย ใช้ Algorithm ที่ ชื่อ ว่า «Осознание топологии» ผู้ ใช้ สามารถ ตั้ง Приоритет ของ POD ได้ โดย POD ไหน มี Приоритет มาก กว่า จะ สามารถ แซงคิว POD ที่ มี Приоритет น้อย กว่า ใน การ Планирование ที่ มี

ใน การ Расписание POD ไป Run นั้น Kube-планировщик จะ ทำ 2 шага คือ.

  1. Фильтрация : ทำ การ Фильтр ให้ เหลือ แค่ Узел คุณสมบัติ ที่ เหมาะสม กับ POD
  2. Забил : ทำ ให้ คิด คะแนน (Рейтинг) ด้วย Algorithm ต่าง ๆ เพือ หา Узел ที่ เหมาะสม ที่ สุด ที่ จะ นำ POD ไป бегать

ซึ่ง Политика расписания ที่ เลือก ใช้ ได้ มี 2 แบบ

  1. Предикаты และ Приоритеты : Предикаты เป็น การ Фильтрация โดย พิจารณา สถานะ และ พฤติกรรม ส่วน Приоритет เป็น การ ใช้ Функция มา คำนวณ คะแนน เพื่อ หา Узел ที่ เหมาะสม ที่ สุด
  2. Усилительные точки และ Плагины : เป็น การ ใช้ Профиль ที่ เกิด จาก การ นำ Состояние หรือ เป็น มา การ เรียน ว่า «Усилительные точки» มา รวม กัน เช่น Queuesort , Фильтр , Оценка , Bind , Резерв , Разрешить , เป็น ต้น มา รวม กัน เพื่อ หา หา หา ที่ ที่ ที่ สุด

เรา สามารถ ชี้ นำ การ ตัดสินใจ ของ Kube-планировщик ได้ ด้วย การ ระบุคุณสมบัติ พิเศษ พิเศษ ( Этикетки ) หรือ ข้ออ จำกัด ( Taints ) ให้ กับ узлы หรือ pods ที่ มี อยู่ ก่อน และ ระบุ ระบุ สามารถ ที่ สอดคล้องกัน ให้ กับ กับ ที่ ที่ ที่ สอดคล้องกัน ให้ กับ กับ กับ ที่ ที่ เรา จะ расписание โดย ตัวอย่าง การ ชี้น ของ планировщик по умолчанию มี ดัง นี้

  • аффинность : ระบุ ว่า Pods นี้ ต้อง Run ใน Узел ที Pods ที่ มี Этикетки นี้ Run อยู่ ก่อน แล้ว
  • Антифнология : ระบุ ว่า Pods นี้ Run ใน Узел ที ไม่ มี Pods ที่ มี Этикетки นี้ Run อยู่
  • Taint : เป็น ข้อ จำกัด ของ узлы ที่ เรา ระบุ เข้า ไป ไป
  • Толерация : เป็น Недвижимость ของ POD ที่ ทน ต่อ Taints ที่ Узел มี ได้ (ทน ได้ ก็ คือ Расписание PODS ไป Run ได้)

นอก จาก นี้ เรา ยัง สามารถ เขียน программа ของ ของ เรา เรา มา มา เป็น เป็น เป็น пользовательский планировщик ใน Kubernetes Cluster ก็

ราย ละเอียด เพิ่มเติม ดู ได้ ใน หัวข้อ ด้าน ล่าง เลย 😁 😁 😁 😁 😁

  • Предикаты (Поднесено в V1.18)

    เป็น ชุด ของ filter ที่ ใช้ ใน การ ตรวจสอบ ความ พร้อม ของ ของ โดย ถ้า ถ้า ความ พร้อม ของ ของ ของ ถ้า ถ้า ถ้า ถ้า ถ้า ไหน ไหน ไหน ถ้า ถ้า ผ่าน ก็ จะ ถูก filter ทิ้ง ไป โดย Список ของ предикаты มี ดัง นี้

    • CheckNodeConditredPred
    • CheckNodeunschedulablePred
    • Генерал
    • HostnamePred
    • Подфитшостпортно
    • MatchNodeselpred
    • Подфитрсурспрессия
    • Odiskconflictpred
    • Подтолератноделирование
    • ПодтолератеноДеноденоекэктуация
    • Checknodelabelpresencepred
    • CheckserviceAFhinityPred
    • Maxebsvolumecountpred
    • Maxgcepdvolumecountpred
    • Maxcsivolumecoundpred
    • Maxazurediskvolumecountpred
    • Maxcindervolumecountpred
    • CheckVolumebindingPred
    • NovolumeZoneConFlictpred
    • ChecknodeMemoryPrepressred
    • CheckNoDePIdressurepred
    • CheckNodedEncePruredred
    • Даже
    • MatchinterPodaffinityPred

    เพิ่มเติม.

  • Приоритеты (Поднесено в V1.18)

    เป็น การ จัด ลำดับ ความ สำคัญ ของ Resources ถ้า POD และ Узел Affinity ไม่ ได้ Настройка ไว้ ว่า เป็น SelectorSpreadPriority (จัด ลำดับ ตาม จำนวน Pods ที่ Run อยู่ ใน Узел) Kube-планировщик จะ เลือก Узел ที่ มี จำนวน POD ถูก Расписание ไป น้อย ที่ สุด Список ของ Приоритеты มี ดัง นี้

    • Равноправность
    • MOSTREQUEDPRIORIONITY
    • Запрос одобрения
    • SelectorSPreadPriority.
    • ServicesPreadingPriority.
    • Интерподафсинтуальность
    • Как минимум
    • BalancedResourceallocation
    • NodePreferavoidPodsPriority.
    • Приоритет Nodeafity
    • TaintTolerationPriority.
    • ImagelocaltyPriority.
    • ResourceLimitsPriority.
    • Dearpodsspreadpriority.

    เพิ่มเติม.

  • Планирование политики

    เรา สามารถ Пользовательские предикаты และ Приоритеты เพื่อ สร้าง เป็น Пользовательский планировщик ได้ โดย สร้าง Файл ดัง นี้

    และ Запуск планировщика ขึ้น มา อีก ตัว โดย แก้ опция --Policy-Config-файл = <Файл> , --use-Legacy-Policy-Config = True และ - scheduler-name = <Имя> จาก นั้น запустить POD โดย ระบุ имя планировщика ดัง นี้

เป็น Функция ใหม่ ใน v1.18 เลย แต่ ยัง เป็น Beta อยู่

เป็น Профиль планирования ที่ เกิด จาก การ รวม Усилительные точки เข้า ด้วย กัน เรา สามารถ ระบุ Профиль ด้วย การ เพิ่ม опция ให้ Kube-планировщик ดัง นี้ Kube-Scheduler --config <имя файла>

สามารถ ระ บุหลาย Профиль และ ให้ Pods เรียก ใช้ โดย การ บ้างอิง Название планировщика ใน Спецификация POD

  • Точки расширения
    • Queuesort : เป็น การ Сортировать стручки ที่ อยู่ ใน очередь планирования
    • Префильтр : เป็น การ Предварительный процесс หรือ Проверьте pod และ кластер ก่อน ทำ การ фильтр
    • Фильтрация : เหมือน предикаты เป็น การ фильтр เอา узлы ที่ มี คุณสมบัติ ไม่ ผ่าน ออก ไป ไป
    • Prescore : เป็น การ ทำ предварительно оценка
    • Оценка : ให้ คะแนน แต่ละ Узел และ เลือก Узел ที่ มี คะแนน มาก ที่ สุด
    • Резерв : เป็น этап ที่ Уведомить плагин ว่า Ресурс กำลัง ถูก Reserve ให้ กับ POD
    • Разрешить : สามารถ ป้องกัน (предотвращение) หรือ น่วง เวลา (задержка) การ Привязка POD ไป ยัง Узел
    • Пребингинд : ทำ งาน ต่าง ๆ ๆ ๆ ก่อน ที่ จะ связывание POD
    • Bind : ทำ การ Привязка POD ไป ยัง Узел ที่ Резервный ресурс ไว้.
    • Postbind : เป็น Этап หลัง หลัง Bind Pod ไป ยัง Узел เรียบร้อย
    • Нерассудят : เป็น Этап ที่ POD ถูก Отклонить หลัง จาก ทำ การ Резервное копирование ресурсов ไม่ สำเร็จ POD จะ กลับ ไป อยู่ Этап Разрешить อีก ครั้ง.
  • Планирование плагинов
    • Включить โดย по умолчанию
      • DefaultTopogySPread (Prescore, Оценка): กระจาย PODS ไป ยัง Узел ตาม Услуги, реплизет และ Установка состояния ของ มัน
      • ImageLocality (Оценка): กระจาย posd ไม่ ยัง Узел ที่ มี Изображение ของ POD นั้น อยู่ แล้ว
      • TaintTolation (Filter, Prescore, Оценка): กระจาย ตาม หลัก Taint и Tainwory
      • NodeName (Фильтр): แจก POD ไป ยัง Узел ที มี Название узла ตรง กับ ที่ ระบุ ไว้ ใน Спецификация POD
      • NodePorts (Prefilter, Filter): แจก POD ไป ยัง Узел ที่ มี Port ที่ ต้องการ ใช้ ว่าง อยู้
      • NodePreferavoidPods (Оценка): ให้ คะแนน Узел ตาม Аннотация strulener.alpha.kubernetes.io/preferavoidPods.
      • Ideaffinity (Фильтр, оценка): แจก POD ตาม Nodeselector и ideaffinity.
      • ПодтопологическийИслой (Фильтр, прескор, оценка): แจก POD ตาม POD топология
      • Nodeunschedulable (Фильтр): Узел фильтра ที่ มี .spec.unschedulable = True ออก ไป.
      • Noderesourcesfit (Prefilter, Filter): Узел фильтра ที่ มี Ресурс ไม่ พอ ตาม ที่ POD Project ออก ไป
      • NoderesourcesballangedSlocation (Оценка): เลือก Узел ที่ ถ้า Расписание POD ไป จะ ทำ ให้ Ресурс ใน แต่ละ Узел ใน Баланс кластера ขึ้น
      • NoderesourcesLeastallocated (Оценка): เลือก Узел ที่ มี Ресурс เหลือ เยอะ ที่ สุด
      • ОбъемБиндинг (Фильтр): เลือก Узел ที่ มี Volume ที่ POD ต้องการ Привязка อยู่
      • Воломмерики (Фильтр): เลือก Узел ที่ มี Объем ที่ POD ต้องการ Привязка อยู่ และ POD มี สิทธิ์ ใช้
      • Томзон (Фильтр): เลือก Узел ที่ มี Объем ที่ อยู่ ใน Зона ที่ POD ต้องการ
      • NODEVOLUMELIMITS (Фильтр): เลือก узел ที่ удовлетворять ограничения объема CSI
      • EBSlimits (Фильтр): เลือก Узел ที่ удовлетворять тому AWS EBS пределы
      • GCEPDLICTLITS (Фильтр): เลือก Узел ที่ Удовлетворяйте ограничения объема GCP-PD
      • Azudedisklimits (Фильтр): เลือก Узел ที่ Удовлетворяйте пределы объема диска Azure
      • Интерподавление (Prefilter, Filter, Prescore, Оценка): แจก POD ตาม Межпод-Сродская аффинность и анти-аффинность
      • Приоритетсорщик (Квинсухорт): เลือก Узел ตาม Приоритетная сортировка на основе แบบ по умолчанию
      • DefaultBinder (Привязка): เลือก Узел ตาม Механизм привязки แบบ по умолчанию
    • ต้อง Руководство Включить เอง ผ่าน API
      • NoderesourcesStallocated (Оценка): เลือก Узел ที่ มี Ресурс เหลือ น้อย ที่ สุด
      • ЗапросtocapacityRatio (Оценка): เลือก Узел ตาม Функция ของ Ресурс ที่ выделить
      • Noderesourcelimits (Пресскор, Оценка): เลือก Узел ที่ มี Ресурс พอ ตาม ที่ POD запрос
      • Cindervolume (Фильтр): เลือก Узел ที่ удовлетворять ограничения объема OpenStack Cinder
      • Nodelabel (Фильтр, оценка): фильтр และ ให้ คะแนน Узел ตาม Этикетки ที่ Настройка ไว้.
      • СЕРВИСИЧНОСТЬ (Prefilter, Filter, Score): กระจาย PODS ที่ อยู่ ใน Сервис เดียว กัน ไป ยัง แต่ละ Узел ไม่ ซ้ำ กัน

ใน การ Расписание POD ไป Run ใน Узел ที่ เหมาะสมนอก จาก ความ พร้อม ของ Узел แล้ว อีก ปัจจัย ที่ สำคัญ คือ Спецификация POD โดย параметр ที่ มี ผล ต่อ การ расписание เช่น

  • NodeName : ใช้ ระบุ ชื่อ Узел ที่ ต้องการ ให้ Планировщик นำ POD ไป бегать
  • Nodeselector : ใช้ ระบุ метка ของ узлы ที่ เหมาะสม กับ POD ตัว นั้น ๆ
  • аффинность : มี ทั้ง аффинность ซึ่ง บอก ว่า POD นี้ ต้อง อยู่ ร่วม กับ POD ใด และ Anti-Affinity คือ ไม่ อยู่ ร่วม กับ POD ใด
  • Расписание пользователя : ระบุ ชื่อ ของ планировщик ที่ ใช้ ใน การ расписание POD ถ้า ไม่ ระบุ ระบุ ใช้ планировщик по умолчанию
  • терпение : บอก ว่า POD นี้ ทน ต่อ ข้อ จำกัด (Taints) อะไร ของ Узел ได้ บ้าง

เป็น การ ระบุ ที่ ง่าย ที่ สุด ที่ ไม่ แนะนำ ซึ่ง มา ด้วย ข้อ จำกัด หลาย อย่าง เช่น เช่น

  • ถ้า Название узла ที่ เรา ระบุ ไป ไม่ มี อยู่ จริง pod ก็ จะ ไม่ ถูก запустить
  • ถ้า Имя узла ที่ เรา ระบุ ไว้ มี Ресурс ไม่ เพียงพอ POD ก็ จะ ไม่ ถูก Run เช่น กัน
  • ใน облачная среда เรา ไม่ สามารถ คาดเดา имя узла ได้ ทำ ให้ เรา ต้อง แก้ไข configure ของ เรา ทุก ครั้ง ที่ ย้าย кластер หรือ Узел ที่ เรา ระบุ ตาย ไป ไป

ตัวอย่าง ของ Спецификация POD ที่ ใช้ odname.

$ kubectl get nodes
NAME                  STATUS   ROLES    AGE   VERSION
kube-0001.novalocal   Ready    master   88d   v1.17.1
kube-0002.novalocal   Ready       88d   v1.17.1
kube-0003.novalocal   Ready       88d   v1.17.1
$ cat > nodename.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kube-0003.novalocal
EOF
$ kubectl get pods -o wide 
NAME    READY   STATUS    RESTARTS   AGE   IP              NODE                  NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          3m    192.168.32.60   kube-0003.novalocal              

เป็น การ ระบุ ที่ ง่าย ที่ สุด ที่ แนะนำ เนื่อง จาก เรา สามารถ สร้าง наклеивает เดียว กัน ที่ หลาย Узел ทำ ให้ ถ้า Узел ก ใด Узел หนึ่ง ตาย ไป หรือ ไม่ พร้อม ด้วย สาเหตุ ใด ก็ ตาม ก็ มี มี อื่น ให้ Расписание ไป

โดย เรา ต้อง ทำ การ การ NoDe ก่อน ดัง นี้ นี้

$ kubectl label nodes kube-0003.novalocal disktype=ssd

จาก นั้น Создать POD ด้วย Спецификация ดัง นี้

$ kubectl get nodes --show-labels
NAME                  STATUS   ROLES    AGE   VERSION   LABELS
kube-0001.novalocal   Ready    master   88d   v1.17.1   (...),node-role.kubernetes.io/master=
kube-0002.novalocal   Ready       88d   v1.17.1   (...)
kube-0003.novalocal   Ready       88d   v1.17.1   (...)
$ kubectl label nodes kube-0003.novalocal disktype=ssd
node/kube-0003.novalocal labeled
$ kubectl get nodes --show-labels
NAME                  STATUS   ROLES    AGE   VERSION   LABELS
kube-0001.novalocal   Ready    master   88d   v1.17.1   (...),node-role.kubernetes.io/master=
kube-0002.novalocal   Ready       88d   v1.17.1   (...)
kube-0003.novalocal   Ready       88d   v1.17.1   (...),disktype=ssd,(...)
$ cat > nodeselector.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd
EOF
$ kubectl create -f nodeselector
pod/nginx created
$ kubectl get pods -o wide 
NAME    READY   STATUS    RESTARTS   AGE   IP              NODE                  NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          19s   192.168.32.61   kube-0003.novalocal              

โดย POD จะ ถูก Расписание ไป ยัง Узел ที่ มี ทุก метка ที่ เรา กำหนด ไว้ ใน Спецификация POD ถ้า หา ไม่ มี Узел ไหน ตรง กับ Спецификация POD นั้น จะ มี สถานะ เป็น В ожидании

เรา สามารถ ใช้ ideaffinity แทน nodeselector ก็ ได้

Узел ใน Kubernetes Cluster โดย ปกติ จะ มี Встроенные этикетки ที่ เรา นำ มา ใช้ ได้ โดย ที่ เรา ไม่ ต้อง กำหนด เอง แก่ แก่ แก่ แก่ แก่ แก่

  • kubernetes.io/hostname
  • failure-domain.beta.kubernetes.io/zone
  • failure-domain.beta.kubernetes.io/region
  • topology.kubernetes.io/zone
  • topology.kubernetes.io/region
  • beta.kubernetes.io/instance-type
  • node.kubernetes.io/instance-type
  • kubernetes.io/os
  • kubernetes.io/arch

Сходство POD เป็น การ Расписание POD ตาม POD ที่ มี อยู่ ก่อน หน้า เนื่อง จาก จาก จาก อยู่ ก่อน หน้า เนื่อง จาก จาก จาก ต้อง เข้า เข้า ตรวจสอบ ทุก ทุก ทุก ดัง ใน ใน ใน ทุก ใหญ่ ที่ มี ใน หลัก หลัก ร้อย узлы การ ใช้ วิธี นี้ จะ มี ผล ต่อ производительность ของ кластер

โดย Правила аффинности มี 2 แบบ คือ.

  • Аффинность คือ PODS เหล่า นี้ ต้อง อยู่ ใน Местоположение เดียว กัน (совместное место) มัก จะ เป็น POD ที่ Соблюдайте данные กัน เป็น จำนวน มาก
  • Анти-аффинность คือ Pods เหล่า นี้ ต้อง อยู่ คน ละ Местоположение กัน เหมาะ กับ Pods ที่ ต้องการ Допуск неисправностей

Операции ที่ สามารถ ใช้ ใน การ ระบุ Этикетки เช่น

  • В : เลือก POD ที่ มี Этикетки ที่ มี ค่า ตาม ที่ ระบุ ไว้ ไว้ ไว้
  • Ничего : เลือก POD ที่ ไม่ มี Этикетки ที่ มี ค่า ตาม ที่ ระบุ ไว้ ไว้
  • Существует : เลือก POD ที่ มี Этикетки ที่ ระบุ
  • Неотекст : เลือก POD ที่ ไม่ มี Этикетки ที่ ระบุ

นอก จาก นี้ ยัง มี การ ระบุ ราย ละเอียด การ การ расписание Pods ลง ไป อีก 2 параметра คือ

  • ОбязательноеedUringschedulingignoreddurgeExecution : ต้อง มี Этикетки ตาม Условия ที่ กำหนด เท่า นั้น ถ้า ไม่ มี ไม่ Расписание (жесткое аффинность)
  • ПредпочтениеDuringschedulingignoreddurgeExecution : ถ้า ไม่ มี Этикетки ตาม Условия ที่ กำหนด ก็ ไม่ เป็น ไร แต่ ถ้า มี ก็ จะ Расписание ตาม Условия ที่ กำหนด กำหนด (Мягкая сродство)

มาก ไป กว่า นั้น เรา ยัง สามารถ ใช้ ร่วม กับ Топология ได้ อีก ด้วย ดัง นี้ นี้

  • ถ้า ระบุ Аффинность พร้อม กับ Анти-аффинность ที่ เป็น ОбязательноеДеренообразноеedUlingignoreddurgeExecution ต้อง ระบุ Топология
  • ถ้า ระบุ Анти-аффинность ที่ เป็น ОбязательноеedUringschedulingignoreddurgeExecution เท่า นั้น. Топология ต้อง เป็น Kubernetes.io/hostname.
  • ถ้า ระบุ Анти-аффинность ที่ เป็น ПредпочтениеDuringschedulingignoreddurgeExecution เท่า นั้น. Топология ต้อง ระบุ Топология
  • นอก เหนือ จาก ข้าง บน Топология เป็น ค่า อะไร ก็ ได้ ใน встроенные этикетки

ตัวอย่าง

  • หาก เรา ต้องการ Развертывание ของ redis Cluster ที่ มี 3 реплики ซึ่ง แต่ละ Реплика อยู่ คน ละ Узел กัน เพื่อ เพิ่ม Развертывание неисправности เพิ่ม จะ เป็น ดัง นี้

    แต่ละ Pods ใน Развертывание มี Этикетки เป็น Приложение: Магазин และ ใน. Подантиаффективность ว่า ไม่ ให้ อยู่ ร่วม กับ กับ pods ที่ มี метка Приложение: Магазин นั้น หมาย ความ ว่า ห้าม POD Redis นี้ อยู่ ร่วม กัน

  • หาก เรา ต้องการ Развертывание Frontend ของ Web Ecommerce ที Frestend และ Redis ต้อง อยู่ Узел เดียว กัน โดย แต่ละ คู่ ต้อง อยู่ คน ละ ละ ละ узел กัน เพื่อ เพิ่ม Развертывание неисправности เพิ่ม จะ เป็น ดัง นี้

    เรา ให้ pod ของ foreend มี метка เป็น Приложение: веб-магазин โดย.

    • ระบุ Подантиаффективность ด้วย этикетка Приложение: веб-магазин ซึ่ง หมาย ความ ว่า ห้าม frontend อยู่ ร่วม узел กัน.
    • ระบุ Корманье ด้วย этикетка Приложение: Магазин ซึ่ง หมาย ความ ว่า frontend ต้อง อยู่ ร่วม ใน ใน Узел เดียว กับ Backend

เหมือน กับ Nodeselector แต่ เพิ่มเติม ความ สามารถ ของ Affinity เช่น Операторы ( В , Ничего , Существует , Неотекст ) และ ОбязательноеedUringschedulingignoreddurgeExecution / ПредпочтениеDuringschedulingignoreddurgeExecution เข้า มา.

พร้อม กัน นั้น ก็ มี แผน ที่ จะ ทำ ОбязательноеedUringschedulingignoreddurgeExecution เพิ่ม ด้วย ซึ่ง ถ้า มี การ เปลี่ยน เปลี่ยน เปลี่ยน ของ ของ ของ Узлы จะ มี ผล กับ POD ที่ Run อยู่ ด้วย

ตัวอย่าง.

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - e2e-az1
            - e2e-az2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: k8s.gcr.io/pause:2.0

ถ้า มี Узел ที่ มี Label ДРУГОЙ-УЗДА-ЛИКТ-КЛЮЧ-КИМА: ДРУГОЙ-УСТОЙКА - ЗНАЧЕНИЕ МЕТАЛЕЙ POD นี้ จะ ถูก Расписание ไป ยัง Узел นั้น แต่ ถ้า ไม่ มี จะ ไป ดู Узел ที่ มี Этикетки Kubernetes.io/e2e-az-Name: E2E-AZ1 หรือ. Kubernetes.io/e2e-az-name: E2E-AZ2.

$ kubectl label nodes kube-0002.novalocal kubernetes.io/e2e-az-name=e2e-az2
node/kube-0002.novalocal labeled
$ kubectl get nodes --show-labels
NAME                  STATUS   ROLES    AGE   VERSION   LABELS
kube-0001.novalocal   Ready    master   88d   v1.17.1   (...)
kube-0002.novalocal   Ready       88d   v1.17.1   (...),kubernetes.io/e2e-az-name=e2e-az2,(...)
kube-0003.novalocal   Ready       88d   v1.17.1   (...)
$ cat > node-affinity.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - e2e-az1
            - e2e-az2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: k8s.gcr.io/pause:2.0
EOF
$ kubectl create -f node-affinity.yaml 
pod/with-node-affinity created
$ kubectl get pods -o wide
NAME                 READY   STATUS    RESTARTS   AGE   IP              NODE                  NOMINATED NODE   READINESS GATES
with-node-affinity   1/1     Running   0          23s   192.168.52.69   kube-0002.novalocal              

Taints คือ ความ สามารถ ของ ของ ใน ใน การ ที่ จะ ไม่ ให้ ให้ ให้ ที่ ที่ ที่ จะ มา ให้ ให้ ที่ ที่ ที่ ได้ โดย pod ที่ ไม่ มี Толерация ต่อ Taints ของ Узел จะ ไม่ สามารถ Расписание POD มา Run ที่ Узел นั้น ได้.

Taints จะ มี ลักษณะ แบบ นี้ ключ = значение: эффект โดย ключ กับ ценность เป็น ค่า ใด ๆ ก็ ได้ ที่ กำหนด โดย adistrator และ эффект มี ให้ เลือก 3 แบบ คือ

  • Noschedule : ห้าม Расписание POD มา ยัง Узел โดย POD ที่ Run อยู่ ก่อน Назначить Taints จะ ไม่ ได้ รับ ผล กระทบ
  • Предпочтение предпочтению : ถ้า หา Узел ที่ เหมาะสม ไม่ ได้ แล้ว จริง ๆ ก็ Расписание POD มา ยัง Узел นี้ ได้
  • Noexecute : POD ใหม่ ก็ ห้าม Расписание มา POD เก่า ก็ ต้อง อพยบ ไป ที่ อื่น โดย ถ้า pod มี Толераниямиконд กำหนด อยู่ มัน จะ รอ จน กว่า จะ ครบ Толераниямиконд ถึง จะ. อบยพ ออก ไป

ถ้า Узел มี หลาย Taints Pods ที่ มี Толерации ทุก Taints ถึง จะ มา Run ใน Узел นั้น ๆ ได้

# วิธีการเพิ่ม taints ให้กับ node
$ kubectl taint nodes node1 key=value:NoSchedule

# วิธีการลบ taints ออกจาก node
$ kubectl taint nodes node1 key:NoSchedule-

เป็น การ ใส่ ความ สามารถ ให้ POD ทน ต่อ Taints ของ Узел ได้ โดย ต้อง Соответствие ทั้ง Ключ, значение และ Эффект

ซึ่ง Ключ และ Значение เรา สามารถ กำหนด Толерации ได้ ด้วย 2 операторы คือ

  • Существует : ถ้า Толерации ที่ เรา กำหนด มี Ключ ตรง กับ Taints ของ Узел ก็ ถือ ว่า Match แล้ว

  • Равный : ต้อง ตรง ทั้ง Ключ และ Значение ถึง จะ ถือ ว่า Match (оператор по умолчанию)

ถ้า ไม่ ระบุ Effect ถือ ว่า ทน (толерация) ได้ ทุก Effect ดัง นั้น เรา สามารถ สามารถ ระบุ Уровень толерации 999 ที่ ทนทาน ได้ แทน ทุก Taint ดัง นี้

  • ระบุ แค่ Оператор: существует -> ทน ได้ ทุก Taints

  • ระบุ แค่ Оператор: существует และ Ключ: «Ключ» -> ทน ได้ ทุก Taints ที่ มี มี มี ตรง ตรง กัน

ถ้า Узел มี หลาย Taints Pods ที่ จะ Расписание ได้ ต้อง มี Толерации ครบ ทุก Taints ถ้า ไม่ ครบ Pods จะ ถูก ปฏิบัติ ด้วย Effect ของ Taints ที่ มี ความ แรง ที่ สุด ที่ ไม่ ไม่ соответствовать

Используйте случаи ของ Taints และ Толерация เช่น

  • Выделенные узлы ที่ เรา จะ Reserve ไว้ ให้ แค่ บาง กลุ่ม ของ ของ ของ ใช้ งาน งาน
  • Узлы со специальным оборудованием

ถ้า Сродство, Taints และ Политики ยัง ไม่ พอ ดับ ความ ต้องการ ของ เรา เรา เรา สามารถ สร้าง планировщик ของ เรา เอง ได้ โดย สามารถ สามารถ ไป ดู ได้ ที่ Гадость

เพื่อ ใช้ планировщик ใหม่ ของ เรา เรา ต้อง ระบุ имя планировщика เข้า ไป ใน Спецификация POD ด้วย ถ้า ไม่ ระบุ จะ ใช้ планировщик по умолчанию แต่ ถ้า เรา ระบุ планировщик ผิด pod ของ เรา จะ อยู่ ใน สถานะ สถานะ В ожидании

เรา สามารถ ดู ข้อมูล ของ Планировщик และ Информация อื่น ๆ ได้ ด้วย Kubectl Получить события

$ kubectl get events
LAST SEEN   TYPE     REASON      OBJECT      MESSAGE
41s         Normal   Killing     pod/nginx   Stopping container nginx
2s          Normal   Scheduled   pod/nginx   Successfully assigned default/nginx to kube-0003.novalocal
1s          Normal   Pulled      pod/nginx   Container image "nginx" already present on machine
1s          Normal   Created     pod/nginx   Created container nginx
1s          Normal   Started     pod/nginx   Started container nginx

Оригинал: «https://dev.to/peepeepopapapeepeepo/lfs258-10-15-scheduling-419n»