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) 执行以下操作:
- Docker 构建新图像
myapp.4
并上传到 GCR
- 运行
kubectl set image myapp.4
更新部署。
这适用于大多数部署,但对部署清单本身的更改又如何呢?例如,如果我们将 resource > cpu
更改为 1500m,我们现在必须手动 运行 kubectl apply
。 这一步需要自动化,这让我明白了我的观点: 而不是使用 kubectl set image
构建系统本身不能只是 运行 kubectl apply
每一次?什么时候在 CI/CD 管道中使用 kubectl set image
与 kubectl apply
比较合适?
只要提供了新图像,难道 kubectly apply
不会同时处理图像更新和其他配置更改吗?如果是这样,pros/cons 与 kubcetl set image
的区别是什么?
PS - 我们的部署很简单,主要依靠单个副本,不一定需要 100% 正常运行时间。
使用 kubectl set image
,您只需修补部署中部署的映像。要修补其他值(CPU、内存、副本等),您可以使用其他命令,例如 path
或 set repiclas
问题是您失去了与原始 YAML 定义的一致性。如果您的集群崩溃并且您想要重新创建一个,您将不会拥有完全相同的部署,因为您的 YAML 文件将过时(“补丁”将不为人所知)
使用 kubectl apply
覆盖现有的控制平面配置并设置 YAML 的确切内容。当您处于 GitOps 模式时,它更加一致并且是一种常见的做法。
使用哪一个?一切都取决于您需要什么以及您想要实现什么。我更喜欢 kubectl apply
模式,因为它的一致性和可重玩性,但这取决于你!
使用最适合您的情况。请记住 CI 将是资源等应用的“真实来源”。如果您在其他地方更改它并且 运行 CI 作业,它会再次更新它。
大多数 CI 引擎都能够仅在文件已更改的情况下触发特定作业。
这样,您可以在清单未更改的情况下修补图像,并在清单 已 更改的情况下 运行 完全应用。
我个人通常使用图像补丁方法,因为我更喜欢将我的 Kube 文件与我的源代码分开,但如前所述,最适合你的情况!
每次更改应用程序代码或 Kubernetes 配置时,您有两个选项来更新集群:kubectl apply
或 kubectl set image
。
您可以使用 kubectl set 更改对象的 image
、resources
(CPU 和内存等计算资源)或 selector
字段。
您可以使用 kubectl apply 通过应用新的或更新的配置来更新资源
考虑这个名为 myapp
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) 执行以下操作:
- Docker 构建新图像
myapp.4
并上传到 GCR - 运行
kubectl set image myapp.4
更新部署。
这适用于大多数部署,但对部署清单本身的更改又如何呢?例如,如果我们将 resource > cpu
更改为 1500m,我们现在必须手动 运行 kubectl apply
。 这一步需要自动化,这让我明白了我的观点: 而不是使用 kubectl set image
构建系统本身不能只是 运行 kubectl apply
每一次?什么时候在 CI/CD 管道中使用 kubectl set image
与 kubectl apply
比较合适?
只要提供了新图像,难道 kubectly apply
不会同时处理图像更新和其他配置更改吗?如果是这样,pros/cons 与 kubcetl set image
的区别是什么?
PS - 我们的部署很简单,主要依靠单个副本,不一定需要 100% 正常运行时间。
使用 kubectl set image
,您只需修补部署中部署的映像。要修补其他值(CPU、内存、副本等),您可以使用其他命令,例如 path
或 set repiclas
问题是您失去了与原始 YAML 定义的一致性。如果您的集群崩溃并且您想要重新创建一个,您将不会拥有完全相同的部署,因为您的 YAML 文件将过时(“补丁”将不为人所知)
使用 kubectl apply
覆盖现有的控制平面配置并设置 YAML 的确切内容。当您处于 GitOps 模式时,它更加一致并且是一种常见的做法。
使用哪一个?一切都取决于您需要什么以及您想要实现什么。我更喜欢 kubectl apply
模式,因为它的一致性和可重玩性,但这取决于你!
使用最适合您的情况。请记住 CI 将是资源等应用的“真实来源”。如果您在其他地方更改它并且 运行 CI 作业,它会再次更新它。
大多数 CI 引擎都能够仅在文件已更改的情况下触发特定作业。 这样,您可以在清单未更改的情况下修补图像,并在清单 已 更改的情况下 运行 完全应用。
我个人通常使用图像补丁方法,因为我更喜欢将我的 Kube 文件与我的源代码分开,但如前所述,最适合你的情况!
每次更改应用程序代码或 Kubernetes 配置时,您有两个选项来更新集群:kubectl apply
或 kubectl set image
。
您可以使用 kubectl set 更改对象的 image
、resources
(CPU 和内存等计算资源)或 selector
字段。
您可以使用 kubectl apply 通过应用新的或更新的配置来更新资源