5. Управление ресурсами
Использование. процессорных. ресурсов. pod-оболочкой. выражается,. как. можно. было.ожидать,.в.единицах.процессоров..Одна.такая.единица.эквивалентна.одному. AWS.vCPU,.одному.Google.Cloud.Core,.одному.Azure.vCore.и.одному.гиперпотоку. физического.процессора,.который.поддерживает.гиперпоточность..Иными.словами,. 1 CPU.с.точки.зрения.Kubernetes.означает.то,.о.чем.можно.было.бы.подумать. Поскольку. большинству. pod-оболочек. не. нужен. целый. процессор,. запросы. и. ли- миты. обычно. выражаются. в. миллипроцессорах. (которые. иногда. называют. милли- ядрами)..Память.измеряется.в.байтах.или,.что.более.удобно,.в.мебибайтах.(МиБ)
Например,.запрос.100m.(100.миллипро- цессоров).и.250Mi.(250.МиБ.памяти).означает,.что.pod-оболочка.не.может.быть. назначена.узлу.с.меньшим.количеством.доступных.ресурсов..Если.в.кластере.нет. ни.одного.узла.с.достаточной.мощностью,.pod-оболочка.будет.оставаться.в.состоя- нии.pending,.пока.такой.узел.не.появится.
Лимит на ресурс.определяет.максимальное.количество.этого.ресурса,.которое. pod-оболочке. позволено. использовать.. Если. pod-оболочка. попытается. занять. больше. выделенного. ей. лимита. на. процессор,. производительность. будет. сни- жена
акие.лимиты.следует.устанавливать.для.конкретного.приложения,.зависит.от. ваших.наблюдений.и.личного.мнения.(см..подраздел.«Оптимизация.pod-оболочек». на.с..123). Kubernetes.допускает.отрицательный баланс ресурсов,.когда.сумма.всех.лимитов. у.контейнеров.одного.узла.превышает.общее.количество.ресурсов,.которыми.узел. обладает..Это.своего.рода.азартная.игра:.планировщик.ставит.на.то,.что.большин- ство.контейнеров.большую.часть.времени.не.будут.достигать.своих.лимитов. Если.ставка.себя.не.оправдает,.общее.количество.потребляемых.ресурсов.начнет. приближаться.к.максимальной.мощности.узла.и.Kubernetes.начнет.удалять.кон- тейнеры.более.агрессивно..В.условиях.нехватки.ресурсов.могут.быть.остановлены. даже.те.контейнеры,.которые.исчерпали.запрошенные.ресурсы,.а.не.лимиты1.
Кубер будет убивать поды с приложения в случае если нехватка ресурсов будет угрожать жизни кублета
Всегда заказывайте запросы и лимиты на ресурсы для своих контейнеров. Это поможет Kubernetes как следует управлять вашими pod-оболочками и планиро- вать их работу.
нужно делать маленькие контейнеры
- Мелкие.контейнеры.быстрее.собираются.
- Образы.занимают.меньше.места.
- Загрузка.образов.с.сервера.происходит.быстрее.
- Уменьшается.поверхность.атаки.
Используя golang можно здорово выиграть
Потому что го можно собрать в один бинарь, а контейнер состоящий из одно бинаря уже и не уменьшить
куберу нужно понимать когда под готов принимать запросы и жив ли он вообще (под существует пока в нем существует процесс, но процесс может зависнуть, тогда под будет существовать, но приложение в нем работать не будет)
для этого есть liveness пробы
livenessProbe:
httpGet:
path: /healthz # эндпоинт тут специально с ошибкой, чтобы не конфликтнуть с эндпоинтом приложения
port: 8888
initialDelaySeconds: 3
periodSeconds: 3
Как. скоро. Kubernetes. следует. начинать. проверять. работоспособность?. Никакое. приложение.не.может.стартовать.мгновенно..Если.проверка.произойдет.сразу.после. запуска. контейнера,. она,. скорее. всего,. потерпит. неудачу:. в. результате. контейнер. перезапустится.—.и.этот.цикл.будет.повторяться.бесконечно! Поле.initialDelaySeconds.позволяет.указать.время.ожидания.перед.первой. проверкой.работоспособности,.чтобы.избежать.убийственного цикла (loop of the death). Точно.так.же.Kubernetes.лучше.не.заваливать.ваше.приложение.запросами.к.конеч- ной.точке.healthz.тысячу.раз.в.секунду..Поле.periodSeconds.определяет,.к.ак.часто. следует. выполнять. проверку. работоспособности:. в. данном. примере. это. делается. каждые.три.секунды.
Помимо.httpGet,.доступны.и.другие.типы.проверок..Для.сетевых.серверов,.которые. не.понимают.HTTP,.можно.использовать.tcpSocket: livenessProbe: tcpSocket: port: 8888 Если.TCP-соединение.с.заданным.портом.будет.успешно.установлено,.контей- нер.жив. Вы. можете. также. выполнять. в. контейнере. произвольные. команды,. используя. проверку.exec: readinessProbe: exec: command: - cat - /tmp/healthy Проверка.exec.выполняет.внутри.контейнера.заданную.команду.и.считается.успеш- ной. при. успешном. выполнении. команды. (то. есть. если. завершается. с. нулевым. статусом)..Обычно.exec.лучше.подходит.для.проверки.готовности.
Проверки.готовности.и.работоспособности.имеют.общее.происхождение,.но. разную. семантику.. Иногда. приложению. нужно. просигнализировать. Kubernetes. о.том,.что.оно.временно.неспособно.обрабатывать.запросы:.возможно,.выполняет. длинный.процесс.инициализации.или.ждет.завершения.какого-то.дочернего.про- цесса..Для.этого.предусмотрена.проверка.готовности. Если. ваше. приложение. не. начинает. прослушивать. HTTP,. пока. не. будет. готово. к.обработке.запросов,.проверки.готовности.и.работоспособности.могут.выглядеть. одинаково: readinessProbe: httpGet: path: /healthz port: 8888 initialDelaySeconds: 3 periodSeconds: 3 Контейнер,. не. прошедший. проверку. готовности,. удаляется. из. любых. сервисов,. совпавших.с.заданной.pod-оболочкой..Это.похоже.на.удаление.неисправного.узла. из.пула.балансировщика.нагрузки:.к.pod-оболочке.не.будет.направляться.трафик,. пока.она.опять.не.начнет.успешно.проходить.проверку.готовности.
можно.установить.поле.minReadySeconds.. Контейнеры. или. pod-оболочки. не. будут. считаться. готовыми,. пока. с. момента. успешной.проверки.готовности.не.пройдет.minReadySeconds.секунд.(по.умолча- нию.0).
Ресурс.PodDisruptionBudget. позволяет.указать,.сколько.pod-оболочек.заданного.приложения.допустимо.к.по- тере.в.любой.момент.времени.
Иногда.Kubernetes.нужно.остановить.ваши.pod-оболочки,.даже.если.они.в.полном. порядке.и.готовы.к.работе.(этот.процесс.называется.выселением)..Возможно,.узел,. на.котором.они.размещены,.очищается.перед.обновлением.и.pod-оболочки.необ- ходимо.переместить.на.другой.узел.
minAvailable
maxUnavailable
Доменные.имена.сервисов.всегда.имеют.следующую.структуру: SERVICE.NAMESPACE.svc.cluster.local Приставка..svc.cluster.local.является.необязательной,.равно.как.и.простра.нство. имен..Но.если,.например,.вы.хотите.обратиться.к.сервису.demo.из.пространства. prod,.можно.использовать.такое.имя: demo.prod Даже.если.у.вас.есть.десять.разных.сервисов.под.названием.demo,.каждый.из.ко- торых. размещен. в. отдельном. пространстве,. вы. можете. уточнить,. какой. из. них. имеется.в.виду,.добавив.к.доменному.имени.пространство.имен.
Вы. можете. ограничить. потребление. процессорного. времени. и. памяти. не. только. для.отдельных.контейнеров,.как.было.показано.в.подразделе.«Запросы.ресурсов». на.с..108,.но.и.для.заданных.пространств.имен..Для.этого.в.соответствующем.про- странстве.нужно.создать.ресурс.ResourceQuota..Ниже.показан.пример: apiVersion: v1 kind: ResourceQuota metadata: name: demo-resourcequota spec: hard: pods: "100"
Теперь.Kubernetes.будет.блокировать.любые.API-операции.в.пространстве.имен.demo,. которые.превышают.квоту..В.этом.примере.ResourceQuota.ограничивает.простран- ство.имен.100.pod-оболочками,.поэтому.при.попытке.запуска.101-й.pod-оболочки. вы.увидите.такое.сообщение.об.ошибке: Error from server (Forbidden): pods "demo" is forbidden: exceeded quota: demo-resourcequota, requested: pods=1, used: pods=100, limited: pods=100 Использование.ResourceQuota.—.это.хороший.способ.не.дать.приложе.ниям.из. одного. пространства. имен. захватить. слишком. много. ресурсов. у. других. частей. кластера.
Чтобы.проверить,.активирован.ли.ресурс.ResourceQuotas.в.конкретном.простран- стве.имен,.используйте.команду.kubectl.get.resourcequotas
ограничения нужны в любом случае. Без них контейнер с утечкой памяти или слишком высокими требованиями к процессору может израсходовать все доступные ресурсы на узле и затруднить работу своих соседей.
Чтобы избежать такой ситуации, назначьте контейнеру лимиты, немного превы- шающие 100 % от уровня обычного потребления. Благодаря этому контейнер не будет удален в условиях нормальной работы, а если что-то пойдет не так, масштабы последствий будут минимизированы.
У. Kubernetes. есть. дополнение. под. названием. Vertical. Pod. Autoscaler. (VPA). (github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler),.которое.может.по- мочь. вам. в. подборе. идеальных. значений. для. запросов. ресурсов.. Оно. следит. за. заданным.развертыванием.и.автоматически.регулирует.запросы.ресурсов.для.его. pod-оболочек,.исходя.из.того,.что.те.на.самом.деле.используют..У.дополнения.есть. пробный.режим,.который.просто.дает.советы,.не.модифицируя.запущенные.pod- оболочки,.и.это.может.быть.полезно.
На мелких нодах доля нагрузки на поддержку кластера ощутима (системные приложения занимают какую-то часть ресурсов, и когда ресурсов мало, то эта часть становится заметнй)
На больших нода эта доля менее заметна, но потеря большой ноды влечет потеря большой доли кластера
Поэтому в размере нод нужно найти баланс
Взгляните на относительное потребление ресурсов каждым узлом, используя приборную панель вашего облачного провайдера или команду kubectl top nodes. Чем больше заняты ваши процессоры, тем выше эффективность. Если большие узлы вашего кластера загружены сильнее других, советуем удалить некоторые из узлов помельче и заменить их более крупными.
Ресурсам можно давать аннотации с именем владельца ресурса
Это позволит легко находить ответственного при возникновении проблем или при обнаружении ненужного ресурса
У. вашего. кластера. всегда. должно. быть. достаточно. резервной. мощности,. чтобы. справиться.с.отказом.одного.рабочего.узла.
В.Kubernetes.можно.использовать.концепцию.принадлежности узлов.(node. affinities),.чтобы.pod-оболочки,.отказ.которых.недопустим,.не.размещались.на.пре- рываемых.узлах.
No Comments