将 skaffold 配置文件绑定到集群

Tie skaffold profile to cluster

解决我关于 的另一个问题,有没有办法将配置文件绑定到集群?

我发现有几次当我当前的 kubernetes 上下文指向 docker-desktop 时,我不小心 运行 命令 skaffold run -p local -n skeleton。我想防止我自己和我团队中的其他人犯同样的错误。

我发现skaffold.yaml参考中有specifying contexts but that doesn't play nicely if developers use custom contexts like kubeclt set-context custom --user=custom --cluster=custom. I've also found a cluster field的方法,但似乎不能满足我的需要,因为它不让我指定集群名称。

在深入研究 skaffold documentation 并进行了几次测试后,我终于找到了至少部分解决问题的方法,也许不是最优雅的方法,但仍然可以使用。如果我找到更好的方法,我会编辑我的答案。

让我们从头说起:

我们可以读到 here:

When interacting with a Kubernetes cluster, just like any other Kubernetes-native tool, Skaffold requires a valid Kubernetes context to be configured. The selected kube-context determines the Kubernetes cluster, the Kubernetes user, and the default namespace. By default, Skaffold uses the current kube-context from your kube-config file.

这是非常重要的一点,因为我们实际上是从 kube-context 开始的,并且基于它我们能够触发特定的配置文件,而不是相反的配置文件。

重要的是要记住kube-context不是根据profile激活的,而是相反的:特定的profile被触发基于当前上下文(由 kubectl config use-context 选择)。

尽管我们可以通过打补丁 () 来覆盖 skaffold.yaml 配置文件中的默认设置,但无法覆盖基于选择的 profilecurrent-context,例如按照您的命令手动操作:

skaffold -p prod

此处您手动选择特定 profile。这样你就绕过了自动 profile triggering。正如文档所说:

Activations in skaffold.yaml: You can auto-activate a profile based on

  • kubecontext (could be either a string or a regexp: prefixing with ! will negate the match)
  • environment variable value
  • skaffold command (dev/run/build/deploy)

假设我们想根据当前 kube-context 激活我们的配置文件只是为了简单起见,但是我们可以像示例 here.[=64 中那样通过 AND 和 OR 将不同的条件连接在一起=]

解决方案

I want to make sure that if I run skaffold -p prod skaffold will fail if my kubecontext points to a cluster other than my production cluster.

这样恐怕不行。如果您已经通过 -p prod 手动选择了 prod profile,那么您将绕过基于当前上下文的配置文件选择,因此您已经选择了 可以做什么 无论如何哪里可以做已设置(当前选择kube-context)。 在这种情况下 skaffold 没有任何机制可以阻止您 运行 某些东西出现在错误的集群 上。换句话说,您以这种方式强制管道的某些行为。您已经通过选择配置文件同意了它。如果您放弃使用 -p--profile 标志,某些配置文件将永远不会被触发,除非当前选择 kube-context 会自动触发。 skaffold 不会让这种事发生。

让我们看看下面的例子,展示如何让它工作:

apiVersion: skaffold/v2alpha3
kind: Config
metadata:
  name: getting-started
build:
  artifacts:
  - image: skaffold-example
    docker:
      dockerfile: NonExistingDockerfile # the pipeline will fail at build stage
  cluster:
deploy:
  kubectl:
    manifests:
    - k8s-pod.yaml
    flags:
      global: # additional flags passed on every command.
      - --namespace=default
  kubeContext: minikube
profiles:
- name: prod
  patches:
  - op: replace
    path: /build/artifacts/0/docker/dockerfile
    value: Dockerfile
  - op: replace
    path: /deploy/kubectl/flags/global/0
    value: --namespace=prod
  activation:
  - kubeContext: minikube
    command: run 
  - kubeContext: minikube
    command: dev 

在我们 skaffold.yaml 配置的一般部分,我们配置了:

dockerfile: NonExistingDockerfile # the pipeline will fail at build stage

在我们命名 Dockerfile - "NonExistingDockerfile" 之前,每个管道都会在其 build 阶段失败。所以默认情况下,所有构建,无论选择什么 kube-context 都注定要失败。然而,我们可以通过 profile 部分中 skaffold.yamlpatching 特定片段覆盖此默认行为,并再次将 Dockerfile 设置为其标准名称。这样每:

skaffold run

skaffold dev

命令只有在当前 kube-context 设置为 minikube 时才会成功。否则会失败。

我们可以通过以下方式检查:

skaffold run --render-only

之前将我们当前的 kube-context 设置为与 profile 定义的 activation 部分中存在的内容相匹配的设置。

I've found a couple times now that I accidentally run commands like skaffold run -p local -n skeleton when my current kubernetes context is pointing to docker-desktop. I'd like to prevent myself and other people on my team from committing the same mistake.

我理解你的观点,如果有一些内置机制可以防止通过命令行选项覆盖 skaffold.yaml 中配置的自动配置文件激活,但目前看来这是不可能的.如果您不指定 -p localskaffold 将始终根据当前 context 选择正确的配置文件。好吧,对于 功能请求

,它看起来不错 material

我能够通过以下两种方式锁定 Skaffold 的 kubeContext:

skaffold dev --profile="dev-cluster-2" --kube-context="dev-cluster-2"

我也在skaffold.yaml中设置:

profiles:
- name: dev-cluster-2
  activation:
    - kubeContext: dev-cluster-2
  deploy:
    kubeContext: dev-cluster-2

似乎 使用此组合足以明确地告诉 skaffold 不要使用 $KUBECONFIGcurrentContext。使用此组合,如果 cli 参数中缺少 --kube-context,如果 $KUBECONFIG 中的 currentContext 不同于 skaffold.yaml 中的 activation 步骤,则将触发错误消息激活的 Skaffold 配置文件的预期 kubeContext。

希望这能帮助那些在 skaffold 随机切换当前 kubernetes 集群时感到痛苦的开发人员,如果 $KUBECONFIG 中的 currentContext 从例如 side-effect 更改为 side-effect。另一个终端 window.