在 AWS EKS 上以零停机时间重新创建 Kubernetes 部署

Recreate Kubernetes deployment with 0 downtime on AWS EKS

我在 Kubernetes (AWS EKS) 上进行了部署,在部署 .yaml 文件中定义了几个环境变量:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myApp
  name: myAppName
spec:
  replicas: 2
  (...)
    spec:
      containers:
      - env:
        - name: MY_ENV_VAR
          value: "my_value"
image: myDockerImage:prodV1
(...)

如果我想将 pods 升级到另一个版本的 docker 映像,例如 prodV2,我可以执行滚动更新,将 pods 从 prodV1 替换为 prodV2零停机时间。

但是,如果我添加另一个环境变量,比如 MY_ENV_VAR_2 : "my_value_2" 并执行相同的滚动更新,我在容器中看不到新的环境变量。为了同时拥有两个环境变量,我找到的唯一解决方案是手动执行

kubectl delete deployment myAppName
kubectl create deployment -f myDeploymentFile.yaml

如您所见,这不是零停机时间,因为删除部署将终止我的 pods 并引入停机时间,直到创建新部署并开始新的 pods。

有没有办法更好地做到这一点?谢谢!

这是一个您可能想自己测试的示例:

Noice 我用了 spec.strategy.type: RollingUpdate.

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        env:
        - name: MY_ENV_VAR
          value: "my_value"

申请:

➜  ~ kubectl apply -f deployment.yaml
➜  ~ kubectl exec -it nginx-<hash> env | grep MY_ENV_VAR
MY_ENV_VAR=my_value

注意 env 是在 yaml 中设置的 现在我们在 deployment.yaml:

中编辑环境

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        env:
        - name: MY_ENV_VAR
          value: "my_new_value"

申请并等待更新:

➜  ~ kubectl apply -f deployment.yaml
➜  ~ kubectl get po --watch
# after it updated use Ctrl+C to stop the watch and run:
➜  ~ kubectl exec -it nginx-<new_hash> env | grep MY_ENV_VAR
MY_ENV_VAR=my_new_value

如您所见,环境已更改。差不多就是这样了。