Последовательное обновление Kubernetes не работает

У меня есть 2 установки Kubernetes для разных проектов, которые, насколько я могу судить, имеют эквивалентную конфигурацию в важных областях, но 2 по-разному выполняют скользящие обновления.

Оба были установлены на AWS с помощью kops.

Система 1 (k8s v1.7.0) - Убить модуль при развертывании с использованием веб-интерфейса k8s, сначала создается новый модуль, а затем после запуска старый модуль завершается. Без простоев.

Система 2 (k8s v1.8.4) - Убить модуль при развертывании с использованием веб-интерфейса k8s, старый модуль немедленно уничтожается, а затем создается новый модуль. Вызывает кратковременный простой.

Есть какие-либо предложения или идеи относительно того, почему они ведут себя по-другому и как я могу заставить систему 2 создать новый модуль перед завершением работы старого?

Развертывание системы 1

{
  "kind": "Deployment",
  "apiVersion": "extensions/v1beta1",
  "metadata": {
    "name": "proxy-deployment",
    "namespace": "namespace",
    "selfLink": "/apis/extensions/v1beta1/namespaces/namespace/deployments/proxy-deployment",
    "uid": "d12778ba-8950-11e7-9e69-12f38e55b21a",
    "resourceVersion": "31538492",
    "generation": 7,
    "creationTimestamp": "2017-08-25T04:49:45Z",
    "labels": {
      "app": "proxy"
    },
    "annotations": {
      "deployment.kubernetes.io/revision": "6",
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1beta1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"name\":\"proxy-deployment\",\"namespace\":\"namespace\"},\"spec\":{\"replicas\":2,\"template\":{\"metadata\":{\"labels\":{\"app\":\"proxy\"}},\"spec\":{\"containers\":[{\"image\":\"xxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/nginx-proxy-xxxxxx:latest\",\"name\":\"proxy-ctr\",\"ports\":[{\"containerPort\":80},{\"containerPort\":8080}]}]}}}}\n"
    }
  },
  "spec": {
    "replicas": 1,
    "selector": {
      "matchLabels": {
        "app": "proxy"
      }
    },
    "template": {
      "metadata": {
        "creationTimestamp": null,
        "labels": {
          "app": "proxy",
          "date": "1522386390"
        }
      },
      "spec": {
        "containers": [
          {
            "name": "proxy-ctr",
            "image": "xxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/nginx-proxy-xxxxxx:latest",
            "ports": [
              {
                "containerPort": 80,
                "protocol": "TCP"
              },
              {
                "containerPort": 8080,
                "protocol": "TCP"
              }
            ],
            "resources": {},
            "terminationMessagePath": "/dev/termination-log",
            "terminationMessagePolicy": "File",
            "imagePullPolicy": "Always"
          }
        ],
        "restartPolicy": "Always",
        "terminationGracePeriodSeconds": 30,
        "dnsPolicy": "ClusterFirst",
        "securityContext": {},
        "schedulerName": "default-scheduler"
      }
    },
    "strategy": {
      "type": "RollingUpdate",
      "rollingUpdate": {
        "maxUnavailable": "25%",
        "maxSurge": "25%"
      }
    },
    "revisionHistoryLimit": 2,
    "progressDeadlineSeconds": 600
  },
  "status": {
    "observedGeneration": 7,
    "replicas": 1,
    "updatedReplicas": 1,
    "readyReplicas": 1,
    "availableReplicas": 1,
    "conditions": [
      {
        "type": "Progressing",
        "status": "True",
        "lastUpdateTime": "2018-03-30T05:03:01Z",
        "lastTransitionTime": "2017-08-25T04:49:45Z",
        "reason": "NewReplicaSetAvailable",
        "message": "ReplicaSet \"proxy-deployment-1457650622\" has successfully progressed."
      },
      {
        "type": "Available",
        "status": "True",
        "lastUpdateTime": "2018-06-01T06:55:12Z",
        "lastTransitionTime": "2018-06-01T06:55:12Z",
        "reason": "MinimumReplicasAvailable",
        "message": "Deployment has minimum availability."
      }
    ]
  }
}

Развертывание Системы 2

{
  "kind": "Deployment",
  "apiVersion": "extensions/v1beta1",
  "metadata": {
    "name": "prodefault-deployment",
    "namespace": "namespace",
    "selfLink": "/apis/extensions/v1beta1/namespaces/namespace/deployments/prodefault-deployment",
    "uid": "a80528c8-eb79-11e7-9364-068125440f70",
    "resourceVersion": "25203392",
    "generation": 10,
    "creationTimestamp": "2017-12-28T02:49:00Z",
    "labels": {
      "app": "prodefault"
    },
    "annotations": {
      "deployment.kubernetes.io/revision": "7",
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1beta1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"name\":\"prodefault-deployment\",\"namespace\":\"namespace\"},\"spec\":{\"replicas\":1,\"strategy\":{\"rollingUpdate\":{\"maxSurge\":\"25%\",\"maxUnavailable\":\"25%\"},\"type\":\"RollingUpdate\"},\"template\":{\"metadata\":{\"labels\":{\"app\":\"prodefault\"}},\"spec\":{\"containers\":[{\"image\":\"xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/xxxxxxxxxxx-pro-default:latest\",\"livenessProbe\":{\"httpGet\":{\"path\":\"/healthchk\",\"port\":80},\"initialDelaySeconds\":120,\"periodSeconds\":15,\"timeoutSeconds\":1},\"name\":\"prodefault-ctr\",\"ports\":[{\"containerPort\":80}],\"readinessProbe\":{\"httpGet\":{\"path\":\"/healthchk\",\"port\":80},\"initialDelaySeconds\":5,\"periodSeconds\":2,\"timeoutSeconds\":3},\"resources\":{\"limits\":{\"cpu\":\"1\",\"memory\":\"1024Mi\"},\"requests\":{\"cpu\":\"150m\",\"memory\":\"256Mi\"}},\"volumeMounts\":[{\"mountPath\":\"/var/www/html/homes\",\"name\":\"efs-pvc\"},{\"mountPath\":\"/var/xero\",\"name\":\"xero-key\",\"readOnly\":true},{\"mountPath\":\"/var/gcal\",\"name\":\"gcal-json\",\"readOnly\":true}]}],\"volumes\":[{\"name\":\"efs-pvc\",\"persistentVolumeClaim\":{\"claimName\":\"tio-pv-claim-homes\"}},{\"name\":\"xero-key\",\"secret\":{\"secretName\":\"xero-key\"}},{\"name\":\"gcal-json\",\"secret\":{\"secretName\":\"gcaljson\"}}]}}}}\n"
    }
  },
  "spec": {
    "replicas": 1,
    "selector": {
      "matchLabels": {
        "app": "prodefault"
      }
    },
    "template": {
      "metadata": {
        "creationTimestamp": null,
        "labels": {
          "app": "prodefault"
        }
      },
      "spec": {
        "volumes": [
          {
            "name": "efs-pvc",
            "persistentVolumeClaim": {
              "claimName": "tio-pv-claim-homes"
            }
          },
          {
            "name": "xero-key",
            "secret": {
              "secretName": "xero-key",
              "defaultMode": 420
            }
          },
          {
            "name": "gcal-json",
            "secret": {
              "secretName": "gcaljson",
              "defaultMode": 420
            }
          }
        ],
        "containers": [
          {
            "name": "prodefault-ctr",
            "image": "xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/xxxxxxxxxxx-pro-default:latest",
            "ports": [
              {
                "containerPort": 80,
                "protocol": "TCP"
              }
            ],
            "resources": {
              "limits": {
                "cpu": "1",
                "memory": "1Gi"
              },
              "requests": {
                "cpu": "150m",
                "memory": "256Mi"
              }
            },
            "volumeMounts": [
              {
                "name": "efs-pvc",
                "mountPath": "/var/www/html/homes"
              },
              {
                "name": "xero-key",
                "readOnly": true,
                "mountPath": "/var/xero"
              },
              {
                "name": "gcal-json",
                "readOnly": true,
                "mountPath": "/var/gcal"
              }
            ],
            "livenessProbe": {
              "httpGet": {
                "path": "/healthchk",
                "port": 80,
                "scheme": "HTTP"
              },
              "initialDelaySeconds": 120,
              "timeoutSeconds": 1,
              "periodSeconds": 15,
              "successThreshold": 1,
              "failureThreshold": 3
            },
            "readinessProbe": {
              "httpGet": {
                "path": "/healthchk",
                "port": 80,
                "scheme": "HTTP"
              },
              "initialDelaySeconds": 5,
              "timeoutSeconds": 3,
              "periodSeconds": 2,
              "successThreshold": 1,
              "failureThreshold": 3
            },
            "terminationMessagePath": "/dev/termination-log",
            "terminationMessagePolicy": "File",
            "imagePullPolicy": "Always"
          }
        ],
        "restartPolicy": "Always",
        "terminationGracePeriodSeconds": 30,
        "dnsPolicy": "ClusterFirst",
        "securityContext": {},
        "schedulerName": "default-scheduler"
      }
    },
    "strategy": {
      "type": "RollingUpdate",
      "rollingUpdate": {
        "maxUnavailable": "25%",
        "maxSurge": "25%"
      }
    },
    "revisionHistoryLimit": 2,
    "progressDeadlineSeconds": 600
  },
  "status": {
    "observedGeneration": 10,
    "replicas": 1,
    "updatedReplicas": 1,
    "readyReplicas": 1,
    "availableReplicas": 1,
    "conditions": [
      {
        "type": "Progressing",
        "status": "True",
        "lastUpdateTime": "2018-01-15T06:07:52Z",
        "lastTransitionTime": "2017-12-28T03:00:16Z",
        "reason": "NewReplicaSetAvailable",
        "message": "ReplicaSet \"prodefault-deployment-9685f46d4\" has successfully progressed."
      },
      {
        "type": "Available",
        "status": "True",
        "lastUpdateTime": "2018-06-13T07:12:41Z",
        "lastTransitionTime": "2018-06-13T07:12:41Z",
        "reason": "MinimumReplicasAvailable",
        "message": "Deployment has minimum availability."
      }
    ]
  }
}

person Mark Walker    schedule 13.06.2018    source источник
comment
Значит, вы пытаетесь выполнить скользящее обновление, убивая стручки? Обычным способом было бы «kubectl set image» или «kubectl apply».   -  person derkoe    schedule 13.06.2018
comment
Ни применение, ни установка изображения не имеют никакого эффекта с тех пор, как и раньше, из-за того, что последнее не изменяется, насколько известно kubectl. Удаление модуля на панели инструментов всегда было эффективным при установке версии 1.7, а затем извлекались самые свежие данные из репозитория.   -  person Mark Walker    schedule 14.06.2018
comment
Да, вы должны изменить изображение - вы должны использовать дайджест изображения, если у вас есть только последний тег. См. kubernetes.io/docs/concepts/configuration/overview/.   -  person derkoe    schedule 16.06.2018


Ответы (1)


Я заметил, что для обоих модулей определена следующая стратегия скользящего обновления:

"strategy": {
  "type": "RollingUpdate",
  "rollingUpdate": {
    "maxUnavailable": "25%",
    "maxSurge": "25%"
  }
},

Таким образом, он должен завершать работу старого модуля после создания нового модуля при обычном скользящем обновлении с помощью 'set image' или 'kubectl apply'.

Таким образом, различное поведение двух систем может исходить из приборной панели. Я предполагаю, что вы используете приборную панель с другой версией в двух своих системах, поскольку, согласно метрике совместимости приборной панели, kubernetes v1.7 нуждается в приборной панели 1.7 для поддержки, в то время как kubernetes v1.8 нуждается в приборной панели 1.8 для поддержки. Может быть, разные версии приборной панели рассматривают «kill pod» как разные действия, я не знаю.

Или, если вы используете приборную панель 1.7 в своей системе v1.8, попробуйте сначала обновить приборную панель.

И, наконец, не используйте «модуль уничтожения» для непрерывного обновления.

person Kun Li    schedule 13.06.2018
comment
Да, версии приборной панели кажутся 1.7 и 1.8 соответственно. Неохотно обновлять 1.7, так как те работают в данный момент. Поймите, что модуль уничтожения может быть не идеальным вариантом, просто раньше работал безупречно и проще, чем поиск / ввод идентификаторов, поэтому привык к нему. Применить и установить изображение никогда не работало, так как yaml и ссылка на изображение остались неизменными. - person Mark Walker; 14.06.2018