如何通过持续交付管理kubernetes部署yaml文件?

时间:2017-04-04 18:18:55

标签: kubernetes

假设我有一个简单的部署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文件,并且始终只编辑模板(但是再次,你在哪里存储最后部署的版本?)

  • 某些第三方工具?

2 个答案:

答案 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 -