на главную сниппетов
Deployment это можно настроить в поле
.spec.replicas:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginxinc/nginx-unprivileged:1.20
ports:
- containerPort: 8080
nginx, хотя при этом их доступность он учитывать не будет. В следующем разделе мы рассмотрим, как это можно решить.
PodDisruptionBudget (
pdb) защищает ваши поды от необходимых перебоев в работе, которые могут происходить в случае отключения узлов для обслуживания или во время апгрейдов.
pdb можно так:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: nginx
pdb обеспечит, чтобы всегда было доступно 2 пода, соответствующих метке
app=nginx.
$ oc get pods -l app=nginx -o wide
NAME READY STATUS
nginx-deployment-94795dbf6-thjws 1/1 Running
nginx-deployment-94795dbf6-xhvn6 1/1 Running
nginx-deployment-94795dbf6-z2xt9 1/1 Running
pdb:
$ oc get pdb
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
pdb 2 N/A 1 31m
$ oc describe pdb pdb
Name: pdb
Namespace: pdb-testing
Min available: 2
Selector: app=nginx
Status:
Allowed disruptions: 1
Current: 3
Desired: 2
Total: 3
.spec.minAvailable или
.spec.maxUnavailable.
.spec.maxUnavailable значение можно указать целым числом или в процентах, а для
.spec.minAvailable только целым числом.
Pdb работает со следующими ресурсами:
DeploymentReplicationControllerReplicaSetStatefulSetminAvailable: 100%, это будет означать то же, что
maxUnavailable: 0%. На практике так делать нельзя, поскольку это приведёт к невозможности планировщика исключать поды, усложнив жизнь вашему администратору.
disruptionsAllowed не может быть 0. Произойдёт это, к примеру, если установить
minAvailable на 2 при выполнении всего двух реплик приложения.
pdb сообщать планировщику, что определённое число подов можно вывести из строя, не навредив существенным образом приложению. Это своеобразный компромисс между разработчиком и администратором.
requiredDuringSchedulingIgnoredDuringExecution: означает обязательную близость, то есть в случае невозможности выполнить это требование поды разным узлам назначаться не будут.preferredDuringSchedulingIgnoredDuringExecution: означает желательную близость, то есть планировщик постарается соблюсти требование, и если ему это не удастся, распределит поды по разным узлам.apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
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
Pod:
apiVersion: v1
kind: Pod
metadata:
name: with-pod-antiaffinity
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname
Deployment из предыдущего раздела:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginxinc/nginx-unprivileged:1.20
ports:
- containerPort: 8080
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname
$ kubectl get node
NAME STATUS ROLES AGE VERSION
node-1 Ready worker 15d v1.23.3+e419edf
node-2 Ready worker 15d v1.23.3+e419edf
node-3 Ready worker 15d v1.23.3+e419edf
topologyKey=kubernetes.io/hostname, можно ожидать, что они будут распределены так:
$ kubectl get node -l kubernetes.io/hostname=node-1
NAME STATUS ROLES AGE VERSION
node-1 Ready worker 15d v1.23.3+e419edf
$ kubectl get node -l kubernetes.io/hostname=node-2
NAME STATUS ROLES AGE VERSION
node-2 Ready worker 15d v1.23.3+e419edf
$ kubectl get node -l kubernetes.io/hostname=node-3
NAME STATUS ROLES AGE VERSION
node-3 Ready worker 15d v1.23.3+e419edf
$ kubectl get pods -o wide
NAME READY NODE
nginx-deployment-7dffdbff88-2z5vb 1/1 node-1
nginx-deployment-7dffdbff88-64fwd 1/1 node-2
nginx-deployment-7dffdbff88-7zr7z 1/1 node-3
$ kubectl scale --replicas=6 deployment/nginx-deployment
deployment.apps/nginx-deployment scaled
$ kubectl get pods -o wide
NAME READY STATUS NODE
nginx-deployment-7dffdbff88-2z5vb 1/1 Running node-1
nginx-deployment-7dffdbff88-64fwd 1/1 Running node-2
nginx-deployment-7dffdbff88-7zr7z 1/1 Running node-3
nginx-deployment-7dffdbff88-j8x2r 0/1 ContainerCreating node-1
nginx-deployment-7dffdbff88-8jxw7 0/1 ContainerCreating node-2
nginx-deployment-7dffdbff88-vd8dn 0/1 ContainerCreating node-3
topology.kubernetes.io/zone.
topology.kubernetes.io/zone.
/health).В Kubernetes планирование – это обеспечение сопоставления подов с узлами, чтобы Kubelet мог их выполнять.
Планировщик следит за создаваемыми подами, которые ещё не к узлам не присвоены. Его задача в том, чтобы для каждого такого пода найти наиболее подходящий узел.
Если запросить 400m памяти, то это будет означать 0.4 байта. Однако вводящий этот запрос человек, вероятно, имеет ввиду 400 мебибайт (400Mi) или 400 мегабайт (400M).
1.0,
0.5,
100m. Суффикс
m означает миллиядро (или миллицпу), то есть одну тысячную ядра.
В Kubernetes 1 единица ЦПУ эквивалентна 1 физическому ядру ЦПУ, или 1 виртуальному ядру, что зависит от того, является ли узел физическим хостом или же виртуальной машиной, запущенной на физической.
Pod запросы и лимиты устанавливаются в поле
.spec.containers[].resources:
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "64Mi"
cpu: "250m"
frontend не менее 64 мебибайт памяти и 250 миллиядер.
LimitRange для всего пространства имён.
LimitRange:
apiVersion: v1
kind: LimitRange
metadata:
name: limit-range
spec:
limits:
- defaultRequest: # Предустановленный REQUEST
memory: 256Mi
cpu: 250m
default: # Предустановленный LIMIT
memory: 512Mi
cpu: 500m
type: Container
.spec.limits.defaultRequest устанавливает запрос ресурсов по умолчанию;.spec.limits.default устанавливает предустановленный лимит ресурсов.
на главную сниппетов