如何解决在 AWS EKS 上重新创建 Kubernetes 部署,停机时间为 0
我在 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
(...)
如果我想将 pod 升级到另一个版本的 docker 镜像,比如 prodV2,我可以执行滚动更新,以零停机时间将 pod 从 prodV1 替换为 prodV2。
但是,如果我添加另一个环境变量,比如 MY_ENV_VAR_2 : "my_value_2" 并执行相同的滚动更新,我在容器中看不到新的环境变量。为了同时拥有两个环境变量,我找到的唯一解决方案是手动执行
kubectl delete deployment myAppName
kubectl create deployment -f myDeploymentFile.yaml
如您所见,这不是零停机时间,因为删除部署将终止我的 Pod 并引入停机时间,直到创建新部署并启动新 Pod。
有没有办法更好地做到这一点?谢谢!
解决方法
以下是您可能想要测试自己的示例:
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 中的 env:
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
如您所见,环境发生了变化。差不多就是这样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。