Заметки Kubernetes (18) — продвинутые стратегии планирования

задняя часть Kubernetes
Заметки Kubernetes (18) — продвинутые стратегии планирования

Это 21-й день моего участия в Gengwen Challenge, смотрите подробности мероприятия:Обновить вызов

18 расширенных настроек расписания

Селектор узлов: nodeselector, nodeName

Планирование сходства узлов: nodeAffinity

18.1 Селекторы узлов

  • Используйте селектор узлов, чтобы сузить диапазон предварительного выбора, узлы, не выбранные селектором узлов, будут исключены на этапе предварительного выбора.
apiVersion: v1
kind: Pod
metadata:
  name: pod-schedule-demo
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  nodeSelector:
    gpu: ok
  • В это время, если ни один узел не имеет метки GPU, планирование этого POD будет приостановлено и будет находиться в состоянии Pending до тех пор, пока не будут выполнены условия.
kubectl label nodes node2 gpu=ok --overwrite
  • Просмотрите узел, на котором запланирован POD, POD запланирован на узел node2.
kubectl get pods -o wide

18.2 Привязка к узлам

Для определения сходства см.: kubectl, объяснение pods.spec.affinity.nodeAffinity.

  • Определение POD сходства узлов
nodeAffinity             <Object>                                # POD 对 node 节点的亲和性
  preferredDuringSchedulingIgnoredDuringExecution  <[]Object>    # 软亲和性要求,尽量满足亲和性
    preference           <Object>                                # 亲和的节点对象
      matchExpressions   <[]Object>                              # 查找表达式
        key              <string>                                # 标签
        operator         <string>                                # 操作:比较
        values           <[]string>                              # 值
      matchFields        <[]Object>                              # 查找字段
        key              <string>                                # 标签
        operator         <string>                                # 操作:比较
        values           <[]string>                              # 值
    weight               <integer>                               # 权重 1 - 100
  requiredDuringSchedulingIgnoredDuringExecution   <Object>      # 硬亲和性要求,不满足则 Pending
    nodeSelectorTerms    <[]Object>                              # 选择器对象列表
      matchExpressions   <[]Object>                              # 选择器对象列表
        key              <string>                                # 标签
        operator         <string>                                # 操作:比较
        values           <[]string>                              # 值
      matchFields        <[]Object>                              # 查找字段
        key              <string>                                # 标签
        operator         <string>                                # 操作:比较
        values           <[]string>                              # 值
  • Пример конфигурации
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeaffinity1-demo
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:        # 硬亲和性要求,不满足就 Pending
        nodeSelectorTerms:
        - matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeaffinity2-demo
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:     # 软亲和性要求,不满足也可以对凑
      - preference:
          matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar
        weight: 50
  • Чтобы увидеть результаты, kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
pod-nodeaffinity1-demo   0/1     Pending   0          6m16s  # 硬亲和性要求,没有就等待
pod-nodeaffinity2-demo   1/1     Running   0          7s     # 软亲和性要求,没有合适主机也可以凑和

18.3 Привязка к POD

POD и POD необходимы для эффективной связи, поэтому POD и POD должны быть организованы на одной машине, в одном и том же компьютерном зале.Например, было бы лучше, если бы LNMT мог работать на одном хосте.

  1. Если вы хотите запустить группу POD вместе, вы можете использовать сходство узлов для достижения этого.Для достижения этого нам необходимо: тщательно расположить метки узлов и использовать один и тот же набор селекторов меток для выбора узлов для POD, которые хотят Этот подход требует управления метками узлов и привязкой POD.

  2. Если мы хотим запустить группу POD вместе и использовать привязку POD, мы можем установить привязку POD к POD, например: LNMT, тогда MySQL и Tomcat могут быть настроены на большее сходство с хостом или кабинетом, где находится Ngninx. расположен, поэтому должна быть предпосылка, что POD и POD являются ближайшими, что является стандартом, то есть, что такое же расположение, как мы можем знать, что узел и узел находятся в одном и том же шкафу.

    Поэтому узловые узлы одного и того же шкафа могут быть отмечены одной и той же меткой.

  3. MySQL и Tomcat не должны работать с Nginx, это антиаффинити.

  • О сходстве POD с другими POD см.: kubectl, объяснение pods.spec.affinity.podAffinity.
podAffinity                <Object>                              # POD 对其他 POD 的亲和性
  preferredDuringSchedulingIgnoredDuringExecution  <[]Object>    # 软性亲和性,尽量满足亲和性
    podAffinityTerm        <Object>                              # 亲和的 POD 对象
      labelSelector        <Object>                              # 标签选择器对象列表
        matchExpressions   <[]Object>                            # 标签选择器对象,选 POD 标签
          key              <string>                              # 标签
          operator         <string>                              # 操作:比较
          values           <[]string>                            # 值
        matchLabels        <map[string]string>                   # 集合标签选择器
      namespaces           <[]string>                            # 名称空间的列表
      topologyKey	       <string>                              # 亲和判断条件
    weight                 <integer>                             # 权重 1 - 100
  requiredDuringSchedulingIgnoredDuringExecution   <[]Object>    # 硬性亲和性,不满足则 Pending
    labelSelector          <Object>                              # 标签选择器对象列表
      matchExpressions   <[]Object>                              # 标签选择器对象,选 POD 标签
        key              <string>                                # 标签
        operator         <string>                                # 操作:比较
        values           <[]string>                              # 值
      matchLabels        <map[string]string>                     # 集合标签选择器
    namespaces             <[]string>                            # 名称空间的列表
    topologyKey            <string>                              # 亲和判断条件
  • Пример конфигурации
apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1

---
apiVersion: v1
kind: Pod
metadata:
  name: pod2
  namespace: default
  labels:
    app: db
    tier: db
spec:
  containers:
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command:
    - "sh"
    - "-c"
    - "sleep 3600"
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:   # 硬亲和性要求,不满足的 Pending
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - myapp
        topologyKey: kubernetes.io/hostname             # 亲和性的依据为同一个主机名则亲和
  • Чтобы увидеть результаты, kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          3m33s   10.244.2.4   node3   <none>           <none>
pod2   1/1     Running   0          3m33s   10.244.2.5   node3   <none>           <none>

18.4 Антиаффинность к POD

  • Чтобы узнать об антиаффинности POD к другим POD, см.: kubectl, объясните pods.spec.affinity.podAntiAffinity.
podAntiAffinity              <Object>                            # POD 对其他 POD 的反亲和性
  preferredDuringSchedulingIgnoredDuringExecution  <[]Object>    # 软性反亲和性,尽量满足亲和性
    podAffinityTerm        <Object>                              # 反亲和的 POD 对象
      labelSelector        <Object>                              # 标签选择器对象列表
        matchExpressions   <[]Object>                            # 标签选择器对象,选 POD 标签
          key              <string>                              # 标签
          operator         <string>                              # 操作:比较
          values           <[]string>                            # 值
        matchLabels        <map[string]string>                   # 集合标签选择器
      namespaces           <[]string>                            # 名称空间的列表
      topologyKey	       <string>                              # 亲和判断条件
    weight                 <integer>                             # 权重 1 - 100
  requiredDuringSchedulingIgnoredDuringExecution   <[]Object>    # 硬性反亲和性,不满足则 Pending
    labelSelector          <Object>                              # 标签选择器对象列表
      matchExpressions   <[]Object>                              # 标签选择器对象,选 POD 标签
        key              <string>                                # 标签
        operator         <string>                                # 操作:比较
        values           <[]string>                              # 值
      matchLabels        <map[string]string>                     # 集合标签选择器
    namespaces             <[]string>                            # 名称空间的列表
    topologyKey            <string>                              # 亲和判断条件
  • список конфигурации
apiVersion: v1
kind: Pod
metadata:
  name: pod3
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1

---
apiVersion: v1
kind: Pod
metadata:
  name: pod4
  namespace: default
  labels:
    app: db
    tier: db
spec:
  containers:
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command:
    - "sh"
    - "-c"
    - "sleep 3600"
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:   # 硬亲和性要求,不满足的 Pending
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - myapp
        topologyKey: kubernetes.io/hostname             # 反亲和性的依据为同一个主机名

18.5 Заражение узлов

Taints используются только для атрибутов ключ-значение (nodes.spec.taints) на узлах, и их функция состоит в том, чтобы отклонить POD, которые не могут допустить запуска этих taints, поэтому допуски (pods.spec.tolerations) должны быть определены для POD, которые также являются данными «ключ-значение», которые представляют собой список, представляющий список испорченных данных, которые может допускать POD.

Может ли POD работать на узле, зависит от того, включены ли данные в nodes.spec.taints в список pods.spec.tolerations.

  • Формат списка узлов, см.: kubectl, объяснение узла.spec.taints
taints          <[]Object>     # 污点对象列表
  effect        <string>       # 当 POD 不能容忍这个污点的时候,要采取的行为,也就是排斥不容忍污点的 POD
    NoSchedule                 # 影响调度过程,但是已经调度完成 POD 无影响
    PreferNoSchedule           # 影响调度过程,尝试驱逐调度已经完成的但不容忍新污点的 POD
    NoExecute                  # 新增的污点,影响新的调度过程,且强力驱逐调度已经完成的但不容忍新污点的 POD
  key           <string>       # 键
  timeAdded     <string>       # 
  value         <string>       # 值
  • испортить узел, ключ относится к типу узла, а значение — производственное, действие по испорчению
kubectl taint node node2 node-type=production:NoSchedule
  • удалить пятно на узле
kubectl taint node node2 node-type-
  • список тестов
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
        - name: myapp
          image: ikubernetes/myapp:v2
          ports:
            - name: http
              containerPort: 80
  • Проверьте результат, kubectl get pods -o wide, потому что POD не допускает заражения node2.
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-675558bfc5-4x5cf   1/1     Running   0          9s    10.244.2.13   node3   <none>           <none>
myapp-deploy-675558bfc5-58f2s   1/1     Running   0          9s    10.244.2.10   node3   <none>           <none>
myapp-deploy-675558bfc5-gz4kv   1/1     Running   0          9s    10.244.2.12   node3   <none>           <none>
myapp-deploy-675558bfc5-hlxdd   1/1     Running   0          9s    10.244.2.11   node3   <none>           <none>
  • В это время узел 3 также окрашивается, а исходный POD удаляется.
kubectl taint node node3 node-type=dev:NoExecute
  • Просмотрите результаты, kubectl get pods -o wide, потому что новое заражение node3 удаляет POD, который не может допустить заражение, поэтому POD приостанавливается.
NAME                            READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
myapp-deploy-675558bfc5-22wpj   0/1     Pending   0          10s   <none>   <none>   <none>           <none>
myapp-deploy-675558bfc5-lctv5   0/1     Pending   0          14s   <none>   <none>   <none>           <none>
myapp-deploy-675558bfc5-m5qdh   0/1     Pending   0          15s   <none>   <none>   <none>           <none>
myapp-deploy-675558bfc5-z8c4q   0/1     Pending   0          14s   <none>   <none>   <none>           <none>

18.6 Устойчивость к заражению POD

  • Информацию о допуске к POD см. в разделе kubectl, объяснить pods.spec.tolerations.
tolerations            <[]Object>    # 容忍度对象
  effect               <string>      # 能否容忍 node 上的污点驱逐策略,为空表示容忍任何驱逐策略
    NoSchedule                       # 能容忍 node 污点的 NoSchedule
    PreferNoSchedule                 # 能容忍 node 污点的 PreferNoSchedule
    NoExecute                        # 能容忍 node 污点的 NoExecute
  key                  <string>      # 污点的键
  operator             <string>      # Exists 污点存在不管什么值,Equal 污点的值必须等值
  tolerationSeconds    <integer>     # 容忍时间,即如果被驱逐,可以等多久再走,默认 0 秒,NoExecute 使用
  value                <string>      # 污点的值
  • Окрасьте node2 и node3 соответственно
kubectl taint node node2 node-type=production:NoSchedule
kubectl taint node node3 node-type=dev:NoExecute
  • Определите файл манифеста POD, допустите наличие испорченных данных со значением типа узла dev на узле и примите удаление.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
        - name: myapp
          image: ikubernetes/myapp:v2
          ports:
            - name: http
              containerPort: 80
      tolerations:
      - key: node-type
        operator: Equal
        value: dev
        effect: NoExecute
  • Просмотрите результаты, kubectl get pods -o wide, работает на узле taint, который он допускает.
NAME                           READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-97578cf74-5v2r6   1/1     Running   0          6m22s   10.244.2.16   node3   <none>           <none>
myapp-deploy-97578cf74-gbfj7   1/1     Running   0          6m22s   10.244.2.14   node3   <none>           <none>
myapp-deploy-97578cf74-l4lbv   1/1     Running   0          6m22s   10.244.2.15   node3   <none>           <none>
myapp-deploy-97578cf74-zvn8f   1/1     Running   0          6m20s   10.244.2.17   node3   <none>           <none>
  • Добавьте новую порчу в узел, установите POD изгнания
kubectl taint node node3 disk=hdd:NoExecute --overwrite
  • Посмотрите результат, kubectl get pods -o wide, POD не может терпеть новые испорченные данные, результат вытесняется
NAME                           READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
myapp-deploy-97578cf74-84bfz   0/1     Pending   0          6s    <none>   <none>   <none>           <none>
myapp-deploy-97578cf74-fxk2d   0/1     Pending   0          5s    <none>   <none>   <none>           <none>
myapp-deploy-97578cf74-jp99j   0/1     Pending   0          6s    <none>   <none>   <none>           <none>
myapp-deploy-97578cf74-vdkbx   0/1     Pending   0          6s    <none>   <none>   <none>           <none>

разное

Публикуйте свои заметки по адресу:GitHub.com/RedHat Series/Арвин…Добро пожаловать в один клик