首页 > 解决方案 > 如何仅更新容器?

问题描述

我在本地使用 minikube 工作,每次我对代码进行更改时,我都会删除服务(和部署)并创建一个新服务。

此操作为每个容器生成一个新 IP,因此我还需要更新我的前端,并在我的数据库容器中插入新数据,因为每次删除服务时我都会丢失所有数据。

浪费太多时间来高效工作。

我想知道是否有一种方法可以在不生成新 IP 且不删除 pod 的情况下更新容器(因为我不想每次更新后端代码时都删除我的数据库容器)?

标签: kubernetes

解决方案


使用新映像更新现有部署很容易,而无需删除它。

假设我们有一个带有部署的 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相关的部分


推荐阅读