如何在传递yaml进行容器创建时参数化图像版本

时间:2017-03-06 05:22:36

标签: kubernetes

在将清单.yaml传递给kubectl命令时,有没有办法从varibale / config传递图像版本

示例:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:${IMAGE_VERSION}
        imagePullPolicy: Always
        resources:
         limits:
           cpu: "1.2"
           memory: 100Mi
        ports:
        - containerPort: 80

用例是启动在kubernetes级别设置的特定映像版本,并且该变量由kubernetes本身在服务器端解析。

谢谢和问候, 拉维

3 个答案:

答案 0 :(得分:6)

k8s清单文件是静态yaml / json。

如果您想模拟清单(并以类似方式管理多个资源),我强烈建议您查看Helm

我最近创建了a Workshop which focuses precisely on the "Templating" features of Helm

Helm做的不仅仅是模板化,它是作为Kubernetes应用程序的完整包管理器构建的(想想Apt / Yum / Homebrew)。

如果您想处理客户端的所有内容,请查看https://github.com/errordeveloper/kubegen

虽然在某些时候,你需要Helm的其他功能,并且在那个时候需要迁移 - 我建议咬紧牙关并直接向Helm求助。

答案 1 :(得分:6)

最近调查后我们决定选择sed。将kubectl apply包装到一个小的bash脚本中,并在运行apply之前替换占位符。

我们确实研究过更复杂的工具,但我们只找到了Helm。然而,Helm是一项复杂的技术,不仅仅是模板化。它会改变您的工作流程,因为您不再使用kubectl进行部署,并且需要使用Helm包repo来推送您的包。我们的评估是Helm对于部署我们的应用程序没有用,并且仅仅使用它来模板化是过度的。

答案 2 :(得分:2)

这是一个使用sed进行操作的示例(摘自我典型的circleci配置):

replaces="s/{.Namespace}/$CIRCLE_BRANCH/;";
replaces="$replaces s/{.CiBuild}/$CIRCLE_BUILD_NUM/; ";
replaces="$replaces s/{.CiCommit}/$CIRCLE_SHA1/; ";
replaces="$replaces s/{.CiUser}/$CIRCLE_USERNAME/; ";

cat ./k8s/app.yaml | sed -e "$replaces" | ./kubectl --kubeconfig=`pwd`/.kube/config apply --namespace=$NAMESPACE -f -