Kubernetes 将skaffold配置文件绑定到命名空间
有没有办法将skaffold配置文件绑定到命名空间?我希望确保dev、staging和prod部署始终使用正确的名称空间。我知道我可以像Kubernetes 将skaffold配置文件绑定到命名空间,kubernetes,skaffold,Kubernetes,Skaffold,有没有办法将skaffold配置文件绑定到命名空间?我希望确保dev、staging和prod部署始终使用正确的名称空间。我知道我可以像skaffold run-pdev-ndev一样向skaffold run-pdev-ndev添加一个名称空间,但这有点容易出错。我希望通过将配置文件绑定到名称空间,使我的构建更加安全 我尝试将以下内容添加到我的skaffold.yaml中,因为skaffold.yaml中有一个路径,但我怀疑我误解了集群规范的目的 profiles: - name: local
skaffold run-pdev-ndev
一样向skaffold run-pdev-ndev
添加一个名称空间,但这有点容易出错。我希望通过将配置文件绑定到名称空间,使我的构建更加安全
我尝试将以下内容添加到我的skaffold.yaml
中,因为skaffold.yaml
中有一个路径,但我怀疑我误解了集群规范的目的
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:请直接转到“解决方案”(最后一节)
有没有办法将skaffold配置文件绑定到命名空间?我想
确保dev、staging和prod部署始终转到
右命名空间。我知道我可以将名称空间添加到skaffold run
像skaffold run-pdev-ndev
,但这有点容易出错。我想要
希望通过将配置文件绑定到名称空间,使我的构建更加安全
首先,我们需要澄清两件事,即如果我们在管道的build
或deploy
阶段讨论namespace
。一方面,您要确保dev、staging和prod部署始终位于正确的名称空间,因此我假设您对在kubernetes集群上设置适当的名称空间
非常感兴趣,最终将在其中部署构建的映像。Howewer后来还提到,通过将配置文件绑定到名称空间,使构建更加安全。如果我错了,请纠正我,但我猜您的意思是在deploy
阶段使用namespace
因此,回答您的问题:是的,可以将skaffold配置文件绑定到特定的命名空间
我已经尝试根据
事实上,skaffold.yaml
中有一条路径
但我怀疑我误解了
集群规范的目的
profiles:
- name: local
patches:
- op: replace
path: /build/artifacts/0/cluster/namespace
value: testing
您是对的,skaffold.yaml
中有这样的路径,但是您的示例应该如下所示:
profiles:
- name: local
patches:
- op: replace
path: /build/cluster/namespace
value: testing
请注意,集群
元素与工件处于相同的缩进级别。正如您在中看到的:
正如您所看到的,它的大多数选项都与kaniko
相关。它也可以用与特定的配置文件中的其他skaffold.yaml
元素相同的方式进行修补
,但无论如何,我认为这不是您真正关心的元素,所以让我们暂且不谈
顺便说一句,您可以通过运行以下命令轻松验证您的skaffold.yaml
语法:
skaffold fix
如果每个元素都正确使用,所有缩进级别都正确等。它将打印:
config is already latest version
否则会出现如下错误:
FATA[0000] creating runner: applying profiles: applying profile prod: invalid path: /build/cluster/namespace
解决方案
通过设置kubectl标志
,您可以确保部署转到正确的命名空间。它假设您使用docker
作为builder
和kubectl
作为部署者。由于skaffold
支持大量不同的builder
和deployer
,例如,您使用helm
进行部署,因此详细的解决方案可能会大不相同
一个非常重要的警告:路径必须已经存在于您的常规配置部分中,否则您将无法在配置文件
部分对其进行修补,例如:
如果您的配置文件部分中有以下补丁
:
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:
- 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
命名空间中
:
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
我会试着复制它,一旦我发现了什么,我会给你回复的。