kubernetes - 如何仅更新容器?
问题描述
我在本地使用 minikube 工作,每次我对代码进行更改时,我都会删除服务(和部署)并创建一个新服务。
此操作为每个容器生成一个新 IP,因此我还需要更新我的前端,并在我的数据库容器中插入新数据,因为每次删除服务时我都会丢失所有数据。
浪费太多时间来高效工作。
我想知道是否有一种方法可以在不生成新 IP 且不删除 pod 的情况下更新容器(因为我不想每次更新后端代码时都删除我的数据库容器)?
解决方案
使用新映像更新现有部署很容易,而无需删除它。
假设我们有一个带有部署的 YAML文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
要运行此部署,请运行以下命令:
$ kubectl create -f nginx-deployment.yaml --record
(--record
- 将当前命令附加到已创建或更新资源的注释中。这对于将来的审查很有用,例如调查在每个部署修订中执行了哪些命令,以及进行回滚。)
要查看部署推出状态,请运行
$ kubectl rollout status deployment/nginx-deployment
要更新 nginx 映像版本,只需运行以下命令:
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
或者您可以使用以下命令编辑现有部署:
$ kubectl edit deployment/nginx-deployment
要查看部署更新过程的状态,请运行以下命令:
$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
或者
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 36s
每次更新 Deployment 时,它都会通过创建新的 ReplicaSet,将其扩展为 3 个副本,并将旧的 ReplicaSet 缩减为 0 来更新 Pod。如果在上一次更新过程中再次更新 Deployment,它会立即开始创建新的 ReplicaSet ,而无需等待上一次更新完成。
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-1180356465 3 3 3 4s
nginx-deployment-2538420311 0 0 0 56s
如果您在编辑 Deployment 时打错字(例如,nginx:1.91),您可以将其回滚到以前的好版本。
首先,检查此部署的修订:
$ kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl create -f nginx-deployment.yaml --record
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
3 kubectl set image deployment/nginx-deployment nginx=nginx:1.91
因为我们在使用 --record 创建这个 Deployment 时记录了命令,所以我们可以很容易地看到我们在每个修订版中所做的更改。
要查看每个修订的详细信息,请运行:
$ kubectl rollout history deployment/nginx-deployment --revision=2
deployments "nginx-deployment" revision 2
Labels: app=nginx
pod-template-hash=1159050644
Annotations: kubernetes.io/change-cause=kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
QoS Tier:
cpu: BestEffort
memory: BestEffort
Environment Variables: <none>
No volumes.
现在您可以使用命令回滚到以前的版本:
$ kubectl rollout undo deployment/nginx-deployment
deployment "nginx-deployment" rolled back
或者您可以回滚到特定版本:
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment "nginx-deployment" rolled back
更多信息请阅读 Kubernetes 文档中与Deployment相关的部分
推荐阅读
- android - 单击后退按钮后键盘关闭时如何从edittext中清除焦点?
- angular - 如何在Angular 2+中从父组件到达子组件的NgForm
- join - Rails 5.2 中范围内的连接与 Rails 5.1 有何不同?
- javascript - 如何在 jquery 上只选择父级?
- sql-workbench-j - SQL Workbench/J:运行 SQL 文件
- pandas - 使用循环方法填充空 Panda 数据框
- flutter - 从 CupertinoTabScaffold 导航出去
- informatica - 如何在 IICS 中加载和使用列名/标题 > 65 字符?
- javascript - jQuery表刷新但发生重复
- ffmpeg - 将 h264 字节流重新打包到 Matroska 输出