Kubectl 设置图像与从 CI 应用 - 最佳实践

Kubectl set image vs. apply from CI - best practice

考虑这个名为 myapp

的基本休息应用程序的部分 k8s 部署清单
spec:
  replicas: 1
     ...
      containers:
        name: myapp
        image: us.gcr.io/my-org/myapp.3
      ...
      resources:
        limits:
          cpu: 1000m
          memory: 1.5Gi

我们将增量构建存储在 Google 容器注册表 (GCR) 中,例如 (myapp.1, myapp.2, myapp.3)。在当前设置中,我们的 CI 系统 (Jenkins) 执行以下操作:

这适用于大多数部署,但对部署清单本身的更改又如何呢?例如,如果我们将 resource > cpu 更改为 1500m,我们现在必须手动 运行 kubectl apply这一步需要自动化,这让我明白了我的观点: 而不是使用 kubectl set image 构建系统本身不能只是 运行 kubectl apply每一次?什么时候在 CI/CD 管道中使用 kubectl set imagekubectl apply 比较合适?

只要提供了新图像,难道 kubectly apply 不会同时处理图像更新和其他配置更改吗?如果是这样,pros/cons 与 kubcetl set image 的区别是什么?

PS - 我们的部署很简单,主要依靠单个副本,不一定需要 100% 正常运行时间。

使用 kubectl set image,您只需修补部署中部署的映像。要修补其他值(CPU、内存、副本等),您可以使用其他命令,例如 pathset repiclas

问题是您失去了与原始 YAML 定义的一致性。如果您的集群崩溃并且您想要重新创建一个,您将不会拥有完全相同的部署,因为您的 YAML 文件将过时(“补丁”将不为人所知)


使用 kubectl apply 覆盖现有的控制平面配置并设置 YAML 的确切内容。当您处于 GitOps 模式时,它更加一致并且是一种常见的做法。


使用哪一个?一切都取决于您需要什么以及您想要实现什么。我更喜欢 kubectl apply 模式,因为它的一致性和可重玩性,但这取决于你!

使用最适合您的情况。请记住 CI 将是资源等应用的“真实来源”。如果您在其他地方更改它并且 运行 CI 作业,它会再次更新它。

大多数 CI 引擎都能够仅在文件已更改的情况下触发特定作业。 这样,您可以在清单未更改的情况下修补图像,并在清单 更改的情况下 运行 完全应用。

我个人通常使用图像补丁方法,因为我更喜欢将我的 Kube 文件与我的源代码分开,但如前所述,最适合你的情况!

每次更改应用程序代码或 Kubernetes 配置时,您有两个选项来更新集群:kubectl applykubectl set image

您可以使用 kubectl set 更改对象的 imageresources(CPU 和内存等计算资源)或 selector字段。

您可以使用 kubectl apply 通过应用新的或更新的配置来更新资源