将 skaffold 配置文件绑定到命名空间
Tie skaffold profile to namespace
有没有办法将 skaffold 配置文件绑定到命名空间?我想确保 dev、staging 和 prod 部署始终转到正确的命名空间。我知道我可以像 skaffold run -p dev -n dev
一样向 skaffold run
添加命名空间,但这有点容易出错。我想通过将配置文件绑定到名称空间来使我的构建更加安全。
我已经尝试将以下内容添加到我的 skaffold.yaml
中,因为 skaffold.yaml
中有一条路径 build/cluster/namespace
但我怀疑我误解了集群规范。
profiles:
- name: local
patches:
- op: replace
path: /build/artifacts/0/cluster/namespace
value: testing
但我收到错误
❮❮❮ skaffold render -p local
FATA[0000] creating runner: applying profiles: applying profile local: invalid path: /build/artifacts/0/cluster/namespace
我尝试过其他更改集群命名空间的变体,但都失败了。
如果TL/DR:请直接跳转到"solution"(最后一节)
Is there a way to tie a skaffold profile to a namespace? I'd like to
make sure that dev, staging and prod deployments always go to the
right namespace. I know that I can add a namespace to skaffold run
like skaffold run -p dev -n dev
but that's a little error prone. I'd
like to make my builds even safer by tying profiles to namespaces.
一开始我们需要澄清两件事,即如果我们在管道的 build
或 deploy
阶段谈论 namespaces
。一方面你写道,你希望 确保开发、暂存和生产 deployments 总是去正确的命名空间 所以我假设您对在 kubernetes 集群 上设置适当的 namespace
非常感兴趣,最终将在其中部署构建的映像。但是后来您还提到了 通过将配置文件绑定到名称空间 使 构建 更加安全。如果我错了请纠正我,但我猜你的意思是 namespaces
在 deploy
阶段。
所以回答你的问题:是的,可以将 skaffold 配置文件绑定到特定的命名空间。
I've tried adding the following to my skaffold.yaml
based on the
fact that there's a path in skaffold.yaml
which is
build/cluster/namespace but I suspect I'm misunderstanding the
purpose of the cluster spec.
你是对的,skaffold.yaml
中有这样的路径,但是你的例子应该如下所示:
profiles:
- name: local
patches:
- op: replace
path: /build/cluster/namespace
value: testing
请注意,cluster
元素与 artifacts
处于同一缩进级别。正如您在 reference:
中看到的那样
cluster: # beta describes how to do an on-cluster build.
如您所见,它的大部分选项都与kaniko
相关。它也可以是 patched
与特定 profiles
中其他 skaffold.yaml
元素相同的方式,但无论如何我认为这不是您真正关心的元素,所以让我们把它留给现在。
顺便说一句。您可以通过 运行nig:
轻松验证您的 skaffold.yaml
语法
skaffold fix
如果每个元素都被正确使用,所有缩进级别都正确等等,它将打印:
config is already latest version
否则类似下面的错误:
FATA[0000] creating runner: applying profiles: applying profile prod: invalid path: /build/cluster/namespace
解决方案
您可以通过设置 kubectl flags
确保您的部署进入正确的命名空间。它假设您使用 docker
作为 builder
和 kubectl
作为部署者。由于 skaffold
支持许多不同的 builders
和 deployers
,例如您使用 helm
部署,详细的解决方案可能看起来完全不同。
一个非常重要的警告:路径必须已经存在于您的常规配置部分,否则您将无法在 profiles
部分中对其进行修补,例如:
如果您的个人资料部分中有以下 patch
:
profiles:
- name: prod
patches:
- op: replace
path: /build/artifacts/0/docker/dockerfile
value: DifferentNameForDockerfile
您的 skaffold.yaml
中必须已经存在以下部分:
build:
artifacts:
- image: skaffold-example
docker:
dockerfile: Dockerfile # the pipeline will fail at build stage
回到我们的 namaspaces
,首先我们需要在 deploy
部分设置默认值:
deploy:
kubectl:
manifests:
- k8s-pod.yaml
flags:
global: # additional flags passed on every command.
- --namespace=default
# apply: # additional flags passed on creations (kubectl apply).
# - --namespace=default
# delete: # additional flags passed on deletions (kubectl delete).
# - --namespace=default
我只设置了 global
标志,但这也可以分别为 apply
和 delete
命令设置。
下一步我们需要在 profiles
:
中覆盖我们的默认值(它们必须已经存在,所以我们可以覆盖它们)
profiles:
- name: dev
patches:
- op: replace
path: /deploy/kubectl/flags/global/0
value: --namespace=dev
- name: staging
patches:
- op: replace
path: /deploy/kubectl/flags/global/0
value: --namespace=staging
- name: prod
patches:
- op: replace
path: /deploy/kubectl/flags/global/0
value: --namespace=prod
那么我们可以运行:
skaffold run --render-only --profile=prod
正如我们所看到的,我们的 Pod
将部署在 kubernetes 集群 的 prod
namespace
中:
Generating tags...
- skaffold-example -> skaffold-example:v1.3.1-15-g11d005d-dirty
Checking cache...
- skaffold-example: Found Locally
apiVersion: v1
kind: Pod
metadata:
labels:
app.kubernetes.io/managed-by: skaffold-v1.3.1
skaffold.dev/builder: local
skaffold.dev/cleanup: "true"
skaffold.dev/deployer: kubectl
skaffold.dev/docker-api-version: "1.39"
skaffold.dev/profile.0: prod
skaffold.dev/run-id: b83d48db-aec8-4570-8cb8-dbf9a7795c00
skaffold.dev/tag-policy: git-commit
skaffold.dev/tail: "true"
name: getting-started
namespace: prod
spec:
containers:
- image: skaffold-example:3e4840dfd2ad13c4d32785d73641dab66be7a89b43355eb815b85bc09f45c8b2
name: getting-started
有没有办法将 skaffold 配置文件绑定到命名空间?我想确保 dev、staging 和 prod 部署始终转到正确的命名空间。我知道我可以像 skaffold run -p dev -n dev
一样向 skaffold run
添加命名空间,但这有点容易出错。我想通过将配置文件绑定到名称空间来使我的构建更加安全。
我已经尝试将以下内容添加到我的 skaffold.yaml
中,因为 skaffold.yaml
中有一条路径 build/cluster/namespace
但我怀疑我误解了集群规范。
profiles:
- name: local
patches:
- op: replace
path: /build/artifacts/0/cluster/namespace
value: testing
但我收到错误
❮❮❮ skaffold render -p local
FATA[0000] creating runner: applying profiles: applying profile local: invalid path: /build/artifacts/0/cluster/namespace
我尝试过其他更改集群命名空间的变体,但都失败了。
如果TL/DR:请直接跳转到"solution"(最后一节)
Is there a way to tie a skaffold profile to a namespace? I'd like to make sure that dev, staging and prod deployments always go to the right namespace. I know that I can add a namespace to
skaffold run
likeskaffold run -p dev -n dev
but that's a little error prone. I'd like to make my builds even safer by tying profiles to namespaces.
一开始我们需要澄清两件事,即如果我们在管道的 build
或 deploy
阶段谈论 namespaces
。一方面你写道,你希望 确保开发、暂存和生产 deployments 总是去正确的命名空间 所以我假设您对在 kubernetes 集群 上设置适当的 namespace
非常感兴趣,最终将在其中部署构建的映像。但是后来您还提到了 通过将配置文件绑定到名称空间 使 构建 更加安全。如果我错了请纠正我,但我猜你的意思是 namespaces
在 deploy
阶段。
所以回答你的问题:是的,可以将 skaffold 配置文件绑定到特定的命名空间。
I've tried adding the following to my
skaffold.yaml
based on the fact that there's a path inskaffold.yaml
which is build/cluster/namespace but I suspect I'm misunderstanding the purpose of the cluster spec.
你是对的,skaffold.yaml
中有这样的路径,但是你的例子应该如下所示:
profiles:
- name: local
patches:
- op: replace
path: /build/cluster/namespace
value: testing
请注意,cluster
元素与 artifacts
处于同一缩进级别。正如您在 reference:
cluster: # beta describes how to do an on-cluster build.
如您所见,它的大部分选项都与kaniko
相关。它也可以是 patched
与特定 profiles
中其他 skaffold.yaml
元素相同的方式,但无论如何我认为这不是您真正关心的元素,所以让我们把它留给现在。
顺便说一句。您可以通过 运行nig:
轻松验证您的skaffold.yaml
语法
skaffold fix
如果每个元素都被正确使用,所有缩进级别都正确等等,它将打印:
config is already latest version
否则类似下面的错误:
FATA[0000] creating runner: applying profiles: applying profile prod: invalid path: /build/cluster/namespace
解决方案
您可以通过设置 kubectl flags
确保您的部署进入正确的命名空间。它假设您使用 docker
作为 builder
和 kubectl
作为部署者。由于 skaffold
支持许多不同的 builders
和 deployers
,例如您使用 helm
部署,详细的解决方案可能看起来完全不同。
一个非常重要的警告:路径必须已经存在于您的常规配置部分,否则您将无法在 profiles
部分中对其进行修补,例如:
如果您的个人资料部分中有以下 patch
:
profiles:
- name: prod
patches:
- op: replace
path: /build/artifacts/0/docker/dockerfile
value: DifferentNameForDockerfile
您的 skaffold.yaml
中必须已经存在以下部分:
build:
artifacts:
- image: skaffold-example
docker:
dockerfile: Dockerfile # the pipeline will fail at build stage
回到我们的 namaspaces
,首先我们需要在 deploy
部分设置默认值:
deploy:
kubectl:
manifests:
- k8s-pod.yaml
flags:
global: # additional flags passed on every command.
- --namespace=default
# apply: # additional flags passed on creations (kubectl apply).
# - --namespace=default
# delete: # additional flags passed on deletions (kubectl delete).
# - --namespace=default
我只设置了 global
标志,但这也可以分别为 apply
和 delete
命令设置。
下一步我们需要在 profiles
:
profiles:
- name: dev
patches:
- op: replace
path: /deploy/kubectl/flags/global/0
value: --namespace=dev
- name: staging
patches:
- op: replace
path: /deploy/kubectl/flags/global/0
value: --namespace=staging
- name: prod
patches:
- op: replace
path: /deploy/kubectl/flags/global/0
value: --namespace=prod
那么我们可以运行:
skaffold run --render-only --profile=prod
正如我们所看到的,我们的 Pod
将部署在 kubernetes 集群 的 prod
namespace
中:
Generating tags...
- skaffold-example -> skaffold-example:v1.3.1-15-g11d005d-dirty
Checking cache...
- skaffold-example: Found Locally
apiVersion: v1
kind: Pod
metadata:
labels:
app.kubernetes.io/managed-by: skaffold-v1.3.1
skaffold.dev/builder: local
skaffold.dev/cleanup: "true"
skaffold.dev/deployer: kubectl
skaffold.dev/docker-api-version: "1.39"
skaffold.dev/profile.0: prod
skaffold.dev/run-id: b83d48db-aec8-4570-8cb8-dbf9a7795c00
skaffold.dev/tag-policy: git-commit
skaffold.dev/tail: "true"
name: getting-started
namespace: prod
spec:
containers:
- image: skaffold-example:3e4840dfd2ad13c4d32785d73641dab66be7a89b43355eb815b85bc09f45c8b2
name: getting-started