将 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
配置文件中的默认设置,但无法覆盖基于选择的 profile
的 current-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.yaml
的 patching
特定片段覆盖此默认行为,并再次将 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 local
,skaffold
将始终根据当前 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
不要使用 $KUBECONFIG
的 currentContext
。使用此组合,如果 cli 参数中缺少 --kube-context
,如果 $KUBECONFIG
中的 currentContext
不同于 skaffold.yaml
中的 activation
步骤,则将触发错误消息激活的 Skaffold 配置文件的预期 kubeContext。
希望这能帮助那些在 skaffold 随机切换当前 kubernetes 集群时感到痛苦的开发人员,如果 $KUBECONFIG
中的 currentContext
从例如 side-effect 更改为 side-effect。另一个终端 window.
解决我关于
我发现有几次当我当前的 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
配置文件中的默认设置,但无法覆盖基于选择的 profile
的 current-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.yaml
的 patching
特定片段覆盖此默认行为,并再次将 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 todocker-desktop
. I'd like to prevent myself and other people on my team from committing the same mistake.
我理解你的观点,如果有一些内置机制可以防止通过命令行选项覆盖 skaffold.yaml
中配置的自动配置文件激活,但目前看来这是不可能的.如果您不指定 -p local
,skaffold
将始终根据当前 context
选择正确的配置文件。好吧,对于 功能请求 。
我能够通过以下两种方式锁定 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
不要使用 $KUBECONFIG
的 currentContext
。使用此组合,如果 cli 参数中缺少 --kube-context
,如果 $KUBECONFIG
中的 currentContext
不同于 skaffold.yaml
中的 activation
步骤,则将触发错误消息激活的 Skaffold 配置文件的预期 kubeContext。
希望这能帮助那些在 skaffold 随机切换当前 kubernetes 集群时感到痛苦的开发人员,如果 $KUBECONFIG
中的 currentContext
从例如 side-effect 更改为 side-effect。另一个终端 window.