2

有没有办法将 skaffold 配置文件绑定到命名空间?我想确保 dev、staging 和 prod 部署总是进入正确的命名空间。我知道我可以添加一个命名空间来skaffold run喜欢skaffold run -p dev -n dev,但这有点容易出错。我想通过将配置文件绑定到命名空间来使我的构建更加安全。

我已经尝试将以下内容添加到我skaffold.yaml的基础上,因为其中有一条路径,skaffold.yamlbuild/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

我尝试了其他更改集群命名空间的变体,但都失败了。

4

1 回答 1

1

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

有没有办法将 skaffold 配置文件绑定到命名空间?我想确保 dev、staging 和 prod 部署总是进入正确的命名空间。我知道我可以添加一个命名空间来skaffold run 喜欢skaffold run -p dev -n dev,但这有点容易出错。我想通过将配置文件绑定到命名空间来使我的构建更加安全。

一开始我们需要澄清两件事,即如果我们谈论的是在管道namespacesbuild还是deploy在管道的阶段。一方面,您写道,您想确保 dev、staging 和 prod部署始终进入正确的命名空间,所以我假设您对在最终构建镜像的kubernetes 集群namespace上设置适当的命名空间很感兴趣部署。但是后来您还提到了通过将配置文件绑定到名称空间来使构建更加安全。如果我错了,请纠正我,但我的猜测是你的意思是在舞台上。namespacesdeploy

所以回答你的问题:是的,可以将 skaffold 配置文件绑定到特定的 namespace

我已经尝试将以下内容添加到我skaffold.yaml的基础上,因为有一个路径skaffold.yamlbuild/cluster/namespace但我怀疑我误解了集群规范的目的。

你是对的,有这样的路径,skaffold.yaml但你的例子应该如下所示:

profiles:
- name: local
  patches:
  - op: replace
    path: /build/cluster/namespace
    value: testing

请注意,cluster元素的缩进级别与artifacts. 正如您在参考资料中所读到的:

cluster:    #   beta describes how to do an on-cluster build.

如您所见,它的大部分选项都与kaniko. 它也可以与特定的其他元素patched采用相同的方式,但无论如何我认为这不是你真正关心的元素,所以让我们暂时搁置它。skaffold.yamlprofiles

顺便提一句。skaffold.yaml您可以通过 runnig轻松验证您的语法:

skaffold fix

如果每个元素都被正确使用,所有缩进级别都是正确的等等。它将打印:

config is already latest version

否则类似于以下错误:

FATA[0000] creating runner: applying profiles: applying profile prod: invalid path: /build/cluster/namespace

解决方案

您可以通过设置来确保您的部署进​​入正确的命名空间kubectl flags。它假设您使用dockerasbuilderkubectlas deployer。由于有很多不同的buildersdeployers支持skaffold的例如,您部署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将部署在prod namespace我们的kubernetes 集群中:

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
于 2020-02-07T05:16:19.000 回答