3

有没有办法service.yaml使用环境变量设置 Knative 文件中某些键的值?


更多详情

我正在尝试使用 GitLab CI 将 Knative 服务部署到 Kubernetes 集群。我文件中的一些变量service.yaml取决于 GitLab CI 管道的项目和环境。有没有一种方法可以将这些值无缝插入我的service.yaml文件中,而无需求助于 hack 之类的sed -i ...

例如,给定以下脚本,我希望将$(KUBE_NAMESPACE)$(CI_ENVIRONMENT_SLUG)$(CI_PROJECT_PATH_SLUG)值替换为相应命名的环境变量。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: design
  namespace: "$(KUBE_NAMESPACE)"
spec:
  template:
    metadata:
      name: design-v1
      annotations:
        app.gitlab.com/env: "$(CI_ENVIRONMENT_SLUG)"
        app.gitlab.com/app: "$(CI_PROJECT_PATH_SLUG)"
    spec:
      containers:
        - name: user-container
          image: ...
      timeoutSeconds: 600
      containerConcurrency: 8
4

2 回答 2

2

不仅仅是 Knative 问题,这更多的是 Kubernetes 的限制。Kubernetes 允许一些扩展,但不允许在注释或命名空间定义中。例如,您可以在容器 env 定义中执行此操作:

containers:
- env:
  - name: PODID
    valueFrom: ...
  - name: LOG_PATH
    value: /var/log/$(PODID)

如果这是一个像 Gitlab 这样的 CI/CD 系统,环境变量应该在 shell 环境中,所以一个简单的 shell 扩展就可以了。例如。

#!/bin/bash

echo -e "
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: design
  namespace: "${KUBE_NAMESPACE}"
spec:
  template:
    metadata:
      name: design-v1
      annotations:
        app.gitlab.com/env: "${CI_ENVIRONMENT_SLUG}"
        app.gitlab.com/app: "${CI_PROJECT_PATH_SLUG}"
    spec:
      containers:
        - name: user-container
          image: ...
      timeoutSeconds: 600
      containerConcurrency: 8
" | kubectl apply -f -

您还可以使用envsubst作为其他答案中提到的帮助程序。

于 2020-07-04T01:07:42.073 回答
2

我不认为有一个很好的方法来扩展现有 yaml 中的环境变量,但如果你不想使用 sed,你也许可以使用envsubst

envsubst < original.yaml > modified.yaml

在使用 yaml 扩展其中包含的环境变量之前,您只需运行此命令。

另外我认为你需要你的变量使用花括号,而不是括号,像这样:${KUBE_NAMESPACE}.

编辑:您也可以像这样使用这个内联:kubectl apply -f <(envsubst < service.yaml)

于 2020-07-03T23:39:08.673 回答