Обновление Kubernetes без простоя?
Согласно https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/, я хотел бы спросить, как добиться непрерывного обновления без простоев? Я думаю, вот минимальные требования:
(1).spec.updateStrategy установлен в RollingUpdate
(2).spec.podManagementPolicy установлен в OrderedReady
(3).spec.replicas установлен в 2
Это правильно? И я предполагаю, что когда обновление происходит в обратном порядке, весь трафик к StatefulSet обслуживается модулями с меньшим порядковым номером?
2 ответа
Да, чтобы иметь нулевое время простоя для statefulsets
обновить, вы должны иметь все упомянутые пункты:
.spec.updateStrategy
установлен вRollingUpdate
.spec.podManagementPolicy
установлен вOrderedReady
который по умолчаниюOrderedReady
.spec.replicas
установить минимум 2.
Еще одна вещь, которую вы должны убедиться, что ваш набор состояний не имеет времени простоя, является правильным readiness
зонд установлен. readiness
probe сообщает менеджеру контроллера kubernetes, что этот модуль готов к обработке запроса, и вы можете начать отправлять запросы на него.
Причина, по которой это очень важно при обновлении с нулевым временем простоя, состоит в том, что у вас есть две реплики Statefulset, и вы начали обновление без установки зонда готовности. Kubernetes удалит модуль в обратном порядке и переведет его в рабочее состояние, пометит его как готовый и завершит работу другого модуля. Теперь предположим, что ваш контейнерный процесс не был запущен в то время, когда не будет ни одного модуля для обслуживания запросов, потому что один модуль еще не полностью готов, и kubernetes отключил другой модуль для процесса обновления и, следовательно, потери данных.
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
РЕДАКТИРОВАТЬ: следующий фрагмент json, который я использую для обновления обновлений состояний в моем случае:
"spec": {
"containers": [
{
"name": "md",
"image": "",
"imagePullPolicy": "IfNotPresent",
"command": [
"/bin/sh",
"-c"
],
"args": [
"chmod -R 777 /logs/; /on_start.sh"
],
"readinessProbe": {
"exec": {
"command": [
"cat",
"/tmp/ready.txt"
]
},
"failureThreshold": 10,
"initialDelaySeconds": 5,
"periodSeconds": 5,
"successThreshold": 1,
"timeoutSeconds": 1
},
"securityContext": {
"privileged": true
}
}
Вот как вы можете настроить проверку готовности в ваших контейнерах с установленным состоянием. Я устанавливаю зонд готовности как linux command
, если у вас есть http-зонд, то он будет другим.
Я согласен с @Prafull Ladha, главная роль readinessProbe
здесь, чтобы гарантировать, что новые стручки, созданные во время RollingUpdate
готовы принять на себя запросы, прежде чем прекратить старые стручки. Однако вы также можете контролировать процесс непрерывного обновления, указав соответствующие необязательные параметры, как описано в официальной документации Kubernetes.