如何在 Kubernetes 部署中使用 dynamic/variable 图像标签?
How to use dynamic/variable image tag in a Kubernetes deployment?
在我们也使用 Kustomize 的项目中,我们的基础 deployment.yaml
文件如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:IMAGE_TAG # <------------------------------
ports:
- containerPort: 80
然后我们使用sed
将IMAGE_TAG
替换为我们要部署的镜像版本。
是否有更复杂的方法来执行此操作,而不是使用 sed
编辑文本 yaml 文件?
为此有一个特定的转换器,称为 images transformer。
您可以保持部署不变,有或没有标签:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
然后在您的自定义文件中:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
images:
- name: nginx
newTag: MYNEWTAG
请记住,这将替换您的 kustomization 文件中包含的所有资源的所有 nginx 映像的标签。如果您需要 运行 多个版本的 nginx,您可以用占位符替换部署中的图像名称,并在转换器中使用不同的条目。
可以使用来自环境变量的图像标签,而不必为每个不同的标签编辑文件。如果您的图像标签需要在不更改 version-controlled 个文件的情况下发生变化,这将非常有用。
标准 kubectl
就足够了。简而言之,使用引用此ConfigMap数据的configMapGenerator
with data populated from environment variables. Then add replacements
替换相关图像标签。
例子
继续您的示例 deployment.yaml
,您可能在同一文件夹中有一个 kustomization.yaml
文件,如下所示:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# Generate a ConfigMap based on the environment variables in the file `.env`.
configMapGenerator:
- name: my-config-map
envs:
- .env
replacements:
- source:
# Replace any matches by the value of environment variable `MY_IMAGE_TAG`.
kind: ConfigMap
name: my-config-map
fieldPath: data.MY_IMAGE_TAG
targets:
- select:
# In each Deployment resource …
kind: Deployment
fieldPaths:
# … match the image of container `nginx` …
- spec.template.spec.containers.[name=nginx].image
options:
# … but replace only the second part (image tag) when split by ":".
delimiter: ":"
index: 1
resources:
- deployment.yaml
在同一个文件夹中,你需要一个文件.env
只有环境变量名(注意:只有名字,没有赋值):
MY_IMAGE_TAG
现在本地环境中的 MY_IMAGE_TAG
被集成为 运行 kubectl kustomize
、kubectl apply --kustomize
等
时的图像标签
演示:
MY_IMAGE_TAG=foobar kubectl kustomize .
这将打印生成的图像标签,根据需要为 foobar
:
# …
spec:
# …
template:
# …
spec:
containers:
- image: nginx:foobar
name: nginx
ports:
- containerPort: 80
备选方案
请记住 configMapGenerator
documentation 中的以下内容:
Note: It's recommended to use the local environment variable population functionality sparingly - an overlay with a patch is often more maintainable. Setting values from the environment may be useful when they cannot easily be predicted, such as a git SHA.
如果您只是想在多个文件之间共享 固定 图像标签,请参阅已经 .
在我们也使用 Kustomize 的项目中,我们的基础 deployment.yaml
文件如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:IMAGE_TAG # <------------------------------
ports:
- containerPort: 80
然后我们使用sed
将IMAGE_TAG
替换为我们要部署的镜像版本。
是否有更复杂的方法来执行此操作,而不是使用 sed
编辑文本 yaml 文件?
为此有一个特定的转换器,称为 images transformer。 您可以保持部署不变,有或没有标签:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
然后在您的自定义文件中:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
images:
- name: nginx
newTag: MYNEWTAG
请记住,这将替换您的 kustomization 文件中包含的所有资源的所有 nginx 映像的标签。如果您需要 运行 多个版本的 nginx,您可以用占位符替换部署中的图像名称,并在转换器中使用不同的条目。
可以使用来自环境变量的图像标签,而不必为每个不同的标签编辑文件。如果您的图像标签需要在不更改 version-controlled 个文件的情况下发生变化,这将非常有用。
标准 kubectl
就足够了。简而言之,使用引用此ConfigMap数据的configMapGenerator
with data populated from environment variables. Then add replacements
替换相关图像标签。
例子
继续您的示例 deployment.yaml
,您可能在同一文件夹中有一个 kustomization.yaml
文件,如下所示:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# Generate a ConfigMap based on the environment variables in the file `.env`.
configMapGenerator:
- name: my-config-map
envs:
- .env
replacements:
- source:
# Replace any matches by the value of environment variable `MY_IMAGE_TAG`.
kind: ConfigMap
name: my-config-map
fieldPath: data.MY_IMAGE_TAG
targets:
- select:
# In each Deployment resource …
kind: Deployment
fieldPaths:
# … match the image of container `nginx` …
- spec.template.spec.containers.[name=nginx].image
options:
# … but replace only the second part (image tag) when split by ":".
delimiter: ":"
index: 1
resources:
- deployment.yaml
在同一个文件夹中,你需要一个文件.env
只有环境变量名(注意:只有名字,没有赋值):
MY_IMAGE_TAG
现在本地环境中的 MY_IMAGE_TAG
被集成为 运行 kubectl kustomize
、kubectl apply --kustomize
等
演示:
MY_IMAGE_TAG=foobar kubectl kustomize .
这将打印生成的图像标签,根据需要为 foobar
:
# …
spec:
# …
template:
# …
spec:
containers:
- image: nginx:foobar
name: nginx
ports:
- containerPort: 80
备选方案
请记住 configMapGenerator
documentation 中的以下内容:
Note: It's recommended to use the local environment variable population functionality sparingly - an overlay with a patch is often more maintainable. Setting values from the environment may be useful when they cannot easily be predicted, such as a git SHA.
如果您只是想在多个文件之间共享 固定 图像标签,请参阅已经