概述

如今,Kubernetes 是最受欢迎的容器编排工具之一。其受欢迎的主要原因之一是它提供了在大规模部署容器化应用时管理容器化应用的高效方式。

Kubernetes 内置了许多对象,允许我们可靠地运行容器化应用。这些最常用于此类用例的对象包括 PodDeploymentStatefulSetCronJob 等等。

在这篇教程中,我们将讨论如何不修改声明性配置文件,而使用各种方法来更新 Deployment 对象中的容器镜像。

1. 示例设置

在本节中,我们将创建一个 NGINX Deployment 对象作为示例。

Kubernetes 的 命名空间 允许我们在集群内隔离资源。因此,首先让我们创建一个新的命名空间来部署一个 nginx pod:

$ kubectl create ns deployment-demo
namespace/deployment-demo created

接下来,让我们将以下声明性配置保存在名为 deployment-demo.yaml 的文件中。我们将使用它来创建一个使用 nginx 图像的 1.22 标签的 pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: deployment-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.22
        name: nginx
        ports:
        - containerPort: 80
          name: nginx

值得注意的是,DeploymentContainer 的名称都是 nginx

现在,让我们使用 apply 命令来创建 nginx pod:

$ kubectl apply -f deployment-demo.yaml
deployment.apps/nginx created

最后,让我们验证 pod 是否已在 deployment-demo 命名空间中创建并处于运行状态:

$ kubectl get pods -n deployment-demo      
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7c8cbb65f7-jwjqg   1/1     Running   0          118s

现在,所需的设置已经完成。让我们看看如何更新 Deployment 对象中的容器镜像。

2. 使用 set 操作

我们可以使用 set 操作与 kubectl 命令结合使用来更新 nginx deployment 中的图像。

为了理解这一点,让我们修改 Deployment 对象以使用 nginx 图像的 1.23 标签:

$ kubectl set image deployment/nginx nginx=nginx:1.23 -n deployment-demo
deployment.apps/nginx image updated

在这个例子中,**nginx 表示容器名称,而 nginx:1.23 表示容器图像及其标签**。

现在,让我们验证 pod 是否处于健康状态,并且它正在使用 1.23 标签的 nginx 图像:

$ kubectl get pods -n deployment-demo
NAME                     READY   STATUS    RESTARTS   AGE
nginx-578b68d5d6-dtt72   1/1     Running   0          23s

$ kubectl get deploy -o wide -n deployment-demo
NAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES       SELECTOR
nginx   1/1     1            1           2d20h   nginx        nginx:1.23   app=nginx

这里,我们使用了 宽输出格式 来显示部署的额外详细信息。在上述输出中,倒数第二列显示了容器使用的图像

3. 使用 patch 操作

除了这个,我们还可以使用 patch 操作与 kubectl 命令结合使用来更新 Deployment 对象中的图像。

我们可以从命令行或通过 patch 文件指定 patch 配置。patch 文件类似于声明性配置,但它只包含部分配置。

例如,在声明性配置中,容器细节存在于 spec.template.spec.containers 部分。因此,让我们创建一个 YAML 文件,其中包含此部分,并将其保存为 patch-demo.yaml 文件:

spec:
  template:
    spec:
      containers:
      - image: nginx:1.24
        name: nginx

在此配置中,我们使用了带有 1.24 标签的 nginx 图像。

接下来,让我们使用 --patch-file 选项来更新 Deployment 对象

$ kubectl patch deployment/nginx --patch-file patch-demo.yaml -n deployment-demo
deployment.apps/nginx patched

最后,让我们验证 pod 的状态以及容器使用的图像:

$ kubectl get pods -n deployment-demo
NAME                     READY   STATUS    RESTARTS   AGE
nginx-56df444f8c-gbxc8   1/1     Running   0          22s

$ kubectl get deploy -o wide -n deployment-demo                                       
NAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES       SELECTOR
nginx   1/1     1            1           2d20h   nginx        nginx:1.24   app=nginx

在这里,我们可以观察到容器正在使用 1.24 标签的 nginx 图像。

4. 使用 edit 操作

在前面的例子中,我们讨论了如何使用 patch 文件来更新 Deployment 对象。使用配置文件来更新 Kubernetes 对象是一个最佳实践,主要原因是我们可以始终 版本控制 这些文件以跟踪更改。

然而,有时我们希望进行临时更改以尝试某些东西。在这种情况下,我们可以使用 edit 操作与 kubectl 命令结合使用:

$ kubectl edit deployment nginx -n deployment-demo

这个命令 在默认编辑器中打开 nginx 部署的 YAML 配置。从这一点开始,我们可以做出所需的更改,保存文件并退出编辑器。在我们的案例中,我们将修改 spec.template.spec.containers 部分,以使用 nginx 图像的 1.25 标签

现在,让我们在保存文件并退出编辑器后验证容器是否使用了指定的图像:

$ kubectl get pods -n deployment-demo
NAME                     READY   STATUS    RESTARTS   AGE
nginx-74d46ddcd8-qxrlc   1/1     Running   0          26s

$ kubectl get deploy -o wide -n deployment-demo         
NAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES       SELECTOR
nginx   1/1     1            1           2d21h   nginx        nginx:1.25   app=nginx

5. 清理工作

总是建议移除临时创建的对象。这有助于摆脱不必要的对象,并允许更有效地利用硬件资源。

因此,让我们执行 delete 操作来删除我们在设置示例时创建的 DeploymentNamespace 对象:

$ kubectl delete deploy nginx -n deployment-demo
deployment.apps "nginx" deleted

$ kubectl delete namespace deployment-demo 
namespace "deployment-demo" deleted

6. 总结

在这篇文章中,我们讨论了如何无需原始声明性配置文件即可实时编辑 Kubernetes Deployment 对象。

首先,我们讨论了如何使用 set 操作直接指定容器镜像。

接着,我们看到了如何使用 patch 文件执行相同的操作。

最后,我们讨论了使用 edit 操作的方法,它提供了快速且易于一次性修改多个字段的最佳途径。