Да, чтобы иметь нулевое время простоя для statefulsets
обновления, вы должны иметь все упомянутые пункты:
.spec.updateStrategy
установлено на RollingUpdate
.spec.podManagementPolicy
установлен на OrderedReady
, что по умолчанию OrderedReady
.spec.replicas
установлен на минимум 2.
Еще одна вещь, которую вам нужно убедиться, что ваш набор состояний не имеет времени простоя, является правильным readiness
набор датчиков. Зонд readiness
сообщает менеджеру контроллера 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-проба, он будет другим.