Kubernetes 将skaffold配置文件绑定到命名空间

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配置文件绑定到命名空间?我希望确保dev、staging和prod部署始终使用正确的名称空间。我知道我可以像
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

我会试着复制它,一旦我发现了什么,我会给你回复的。