使用环境变量在 knative service.yaml 文件中设置值
Set values in a knative service.yaml file using environment variables
有没有办法使用环境变量在 Knative service.yaml
文件中设置某些键的值?
更多详情
我正在尝试使用 GitLab CI 将 Knative 服务部署到 Kubernetes 集群。我的 service.yaml
文件中的一些变量取决于 GitLab CI 管道的项目和环境。有没有一种方法可以将这些值无缝地插入到我的 service.yaml
文件中,而无需诉诸 sed -i ...
?
这样的 hack
例如,给定以下脚本,我希望 $(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
我不认为有一个很好的方法可以在现有的 yaml 中扩展环境变量,但是如果你不想使用 sed,你可以使用 envsubst:
envsubst < original.yaml > modified.yaml
在使用 yaml 扩展其中包含的环境变量之前,您只需 运行 此命令。
另外我认为你需要你的变量使用花括号,而不是括号,像这样:${KUBE_NAMESPACE}
.
编辑:您也可以像这样使用此内联:kubectl apply -f <(envsubst < service.yaml)
不仅仅是 Knative 问题,这更多是 Kubernetes 限制。 Kubernetes 允许进行一些扩展,但不允许在注释或命名空间定义中进行扩展。例如,您可以在容器环境定义中执行此操作:
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 作为其他答案中提到的助手。
有没有办法使用环境变量在 Knative service.yaml
文件中设置某些键的值?
更多详情
我正在尝试使用 GitLab CI 将 Knative 服务部署到 Kubernetes 集群。我的 service.yaml
文件中的一些变量取决于 GitLab CI 管道的项目和环境。有没有一种方法可以将这些值无缝地插入到我的 service.yaml
文件中,而无需诉诸 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
我不认为有一个很好的方法可以在现有的 yaml 中扩展环境变量,但是如果你不想使用 sed,你可以使用 envsubst:
envsubst < original.yaml > modified.yaml
在使用 yaml 扩展其中包含的环境变量之前,您只需 运行 此命令。
另外我认为你需要你的变量使用花括号,而不是括号,像这样:${KUBE_NAMESPACE}
.
编辑:您也可以像这样使用此内联:kubectl apply -f <(envsubst < service.yaml)
不仅仅是 Knative 问题,这更多是 Kubernetes 限制。 Kubernetes 允许进行一些扩展,但不允许在注释或命名空间定义中进行扩展。例如,您可以在容器环境定义中执行此操作:
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 作为其他答案中提到的助手。