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

时间:2020-02-04 16:22:07

标签: kubernetes skaffold

是否可以将skaffold配置文件绑定到名称空间?我想确保开发,登台和产品部署始终使用正确的名称空间。我知道我可以像skaffold run一样向skaffold run -p dev -n dev添加一个命名空间,但这容易出错。我想通过将配置文件绑定到名称空间来使构建更加安全。

我尝试根据以下事实将以下内容添加到我的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

我尝试了其他更改集群名称空间的方法,但是它们都失败了。

1 个答案:

答案 0 :(得分:1)

如果是TL / DR:请直接转到“解决方案”(最后一节)

是否可以将skaffold配置文件绑定到名称空间?我想 确保开发,阶段和产品部署始终进行 正确的名称空间。我知道我可以向skaffold run添加名称空间 像skaffold run -p dev -n dev一样,但是容易出错。 ID 希望通过将配置文件绑定到名称空间来使我的构建更加安全。

在开始时,我们需要澄清两件事,即我们是在管道的namespaces还是build阶段谈论deploy。一方面,您写的是希望确保开发,调试和生产部署始终使用正确的名称空间,所以我假设您对在您的 kubernetes集群上设置适当的namespace,最终将在其中构建内置映像。后来,您还提到了通过将配置文件绑定到名称空间来使构建更加安全。如果我错了,请纠正我,但我的猜测是您在namespaces阶段的意思是deploy

所以回答您的问题:是的,可以将skaffold配置文件绑定到特定的名称空间

我尝试根据以下内容将以下内容添加到我的skaffold.yaml中: skaffold.yaml中有一条路径是 build/cluster/namespace,但我怀疑我误会了 集群规范的目的。

您是对的,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中其他skaffold.yaml元素相同的方式使用profiles,但是无论如何我都不认为这是您真正关心的元素,因此让我们将其保留现在。

顺便说一句。您可以通过runnig轻松验证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用作部署者。由于builders支持许多不同的deployersskaffold,例如如果您使用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标志,但是也可以分别为applydelete命令设置。

下一步,我们需要在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