Я надеюсь, что кто-нибудь сможет пролить свет на эту проблему и способы ее решения.
у меня есть служба Azure Kubernetes, работающая на уровне FRee с двумя рабочими узлами:
Всего я выпускаю около 40 модулей, и каждый модуль имеет коляску istio.
Сегодня я начинаю видеть, что после каждого выпуска новый модуль переходит в статус ожидания с сообщением:
0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 4 Insufficient cpu. preemption: 0/5 nodes are available: 1 Preemption is not helpful for scheduling, 4 No preemption victims found for incoming pod..
Я немного запутался, потому что не могу точно определить проблему.
Читая документацию Microsoft, я вижу, что существует ограничение в 30 модулей на узел, что означает, что у меня предположительно может быть всего 180 модулей, 30 на узел и всего 6 узлов в масштабируемом наборе рабочих Linux (верно?)
Если проблема не в ограничении количества модулей, работающих на узле, мне остается ограничить ресурсы и не устанавливать пороговые значения того, сколько ресурсов может использовать каждый контейнер.
я подготовил этот файл yaml:
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: kube-system
spec:
limits:
- default:
cpu: "500m"
defaultRequest:
cpu: "250m"
type: Container
---
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: default
spec:
limits:
- default:
cpu: "500m"
defaultRequest:
cpu: "250m"
type: Container
Я применил ограничение ресурсов, но, похоже, ничего не изменилось. Я вижу ограничения, если описываю пространства имен, но модули продолжают находиться в состоянии ожидания.
Просто чтобы уточнить, поскольку я считаю это важным. рабочие используют сеть Azure CNI, которая ограничивает количество модулей 30 на узел.
Пожалуйста, если кто-нибудь может помочь мне понять, что я здесь делаю неправильно, я буду благодарен, и если вам нужна дополнительная информация, не стесняйтесь спрашивать.
похоже, что проблема связана с тем, что узлам не хватает ресурсов ЦП. запуск 40 модулей с дополнительными модулями Istio может потреблять значительное количество ресурсов ЦП. Можете ли вы добавить их в свой поток - kubectl top nodes kubectl описать узлы и журналы kubectl -n kube-system Deployment/cluster-autoscaler
Найден, мне только что пришло в голову, что если примененный вами предельный диапазон предназначен только для kube-system и пространств имен по умолчанию, и возможно, что ваши поды работают в другом пространстве имен. Можете ли вы проверить это один раз? У вас может быть повреждение на одном из ваших узлов, что делает его непригодным для планирования, несмотря на наличие свободной памяти. Вы можете найти пятно и удалить его. Вы можете использовать kubectl для описания узлов | grep -e 'Taint\|Hostname', чтобы определить, какой из двух узлов имеет загрязнение. Проверьте все это один раз. Если все в порядке, попробуйте удалить запрос ресурсов и ограничение из файла развертывания POD.
Чтобы решить проблему ожидающих модулей с недостаточными ресурсами ЦП, вы можете попробовать уменьшить ограничения ЦП и добавить в кластер больше рабочих узлов.
Вы можете обратиться к примеру ниже и сравнить его с вашей настройкой.
Здесь у меня есть два узла в моем кластере navAKSCluster.
Пул системных узлов-
az aks nodepool add \
--resource-group navrg \
--cluster-name navAKSCluster \
--name systempool \
--node-count 1 \
--enable-cluster-autoscaler \
--min-count 1 \
--max-count 2 \
--node-vm-size Standard_D2ds_v5 \
--mode System
пул пользователей
az aks nodepool add \
--resource-group navrg \
--cluster-name navAKSCluster \
--name userpool \
--node-count 1 \
--enable-cluster-autoscaler \
--min-count 1 \
--max-count 6 \
--node-vm-size Standard_D2ds_v5 \
--mode User
Ограничения примененного ресурса
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: kube-system
spec:
limits:
- default:
cpu: "500m"
defaultRequest:
cpu: "250m"
type: Container
---
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: default
spec:
limits:
- default:
cpu: "500m"
defaultRequest:
cpu: "250m"
type: Container
и развернул приложение
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: "100m"
memory: "200Mi"
limits:
cpu: "500m"
memory: "500Mi"
Теперь, если ты увидишь, если я это сделаю
kubectl get pods -n default
или
kubectl top nodes
Если вы по-прежнему сталкиваетесь с проблемами с ожидающими модулями из-за ограничений ЦП, вы можете масштабировать пул узлов:
kubectl scale deployment nginx --replicas=20 -n default
Теперь проверьте
kubectl get pods -n default
вы даже можете настроить горизонтальное автомасштабирование модулей.
kubectl autoscale deployment nginx --cpu-percent=50 --min=10 --max=50 -n default
Использованная литература:
Ознакомьтесь с разделом Диагностика и решение проблем службы Azure Kubernetes — он может предоставить некоторую информацию об этой проблеме и, возможно, предложить решение.