假设我有一个简单的部署kubernetes config:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: backend
spec:
replicas: 1
template:
metadata:
name: backend
spec:
containers:
- name: backend
image: backend:1.0.0
resources:
limits:
memory: "500Mi"
cpu: "100m"
imagePullPolicy: Always
我想继续部署。
一种方法是简单地使用此文件进行创建,对于更新运行类似kubectl set image deployment/backend backend=backend:1.1.0
的操作。但是,如果在某个时候我想改变,例如,限制,我必须找出当前版本运行,在yaml文件中替换它并应用它?似乎很麻烦
Google似乎使用sed
替换image version in their example,如果您的kubernetes配置文件存储在与您的代码相同的repo中,则此类工作正常。如果它们存储在别处,或者你的构建需要相当长的时间呢?因此,只需要更改单个属性,就必须在整个构建过程中运行,这可能太长了
有一个脚本在每次部署后根据版本输入自动生成yaml文件,并且始终只编辑模板(但是再次,你在哪里存储最后部署的版本?)
某些第三方工具?
答案 0 :(得分:2)
Helm图表成为管理kubernetes部署的一种日益流行的方式。简而言之,它允许您生成部署,仅使用简单配置定义所需的变量,并且它还具有内置升级机制。换句话说,它提供了元部署。
请参阅以下docs.
答案 1 :(得分:0)
我假设您的yaml文件与要构建的代码位于相同的存储库中。
我们在YAML文件中使用了一个标签(即:snapshot)。但是,仅在最初创建时或使用“ kubectl apply”将其他更改应用于文件时才使用此选项。配置项完成构建后,它实际上运行了:
docker build -t <image>:<id> -f Dockerfile .
docker push <image>:<id>
docker tag <image>:<id> <image>:<snapshot>
docker tag <image>:snapshot
docker push <image>:snapshot
kubectl set image deployment <depl> <foo>=<image>:<id>
我们从来没有遇到过问题,因为我们很少更新YAML文件。但是,您永远不能确定某个地方没有缓存过:snapshot的旧版本。
如果您想始终在CI中执行“ kubectl apply”,则需要以某种方式(例如,通过sed或通过某种模板)从外部注入标签:
docker build -t <image>:${CI_BUILD_LABEL} -f Dockerfile .
docker push <image>:${CI_BUILD_LABEL}
cat template/deployment.yaml | sed s/MYPOD_VERSION/${CI_BUILD_LABEL} | kubectl apply -f -