在 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
如您所见,环境已更改。差不多就是这样了。
我在 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
如您所见,环境已更改。差不多就是这样了。