Это 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 мог работать на одном хосте.
-
Если вы хотите запустить группу POD вместе, вы можете использовать сходство узлов для достижения этого.Для достижения этого нам необходимо: тщательно расположить метки узлов и использовать один и тот же набор селекторов меток для выбора узлов для POD, которые хотят Этот подход требует управления метками узлов и привязкой POD.
-
Если мы хотим запустить группу POD вместе и использовать привязку POD, мы можем установить привязку POD к POD, например: LNMT, тогда MySQL и Tomcat могут быть настроены на большее сходство с хостом или кабинетом, где находится Ngninx. расположен, поэтому должна быть предпосылка, что POD и POD являются ближайшими, что является стандартом, то есть, что такое же расположение, как мы можем знать, что узел и узел находятся в одном и том же шкафу.
Поэтому узловые узлы одного и того же шкафа могут быть отмечены одной и той же меткой.
-
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/Арвин…Добро пожаловать в один клик