运行 针对特定项目和集群的单个 kubectl 命令?

Run a single kubectl command for a specific project and cluster?

背景

我们正在使用 Jenkins 将新版本的 Kubernetes (k8s) 复制控制器部署到我们的测试或生产集群。 test 和 prod (k8s) 集群位于不同的(google 云平台)项目下。我们在 Jenkins 上为我们的 gcloud SDK 配置了两个配置文件,一个用于测试 (test-profile),一个用于 prod (prod-profile)。我们在 Jenkins 中定义了一个托管脚本,用于为我们的复制控制器执行滚动更新。问题是我无法找到一种方法来控制我想将 kubectl rolling-update 命令定位到哪个项目(您可以指定哪个集群,但不能指定哪个项目受影响)。所以现在我们对测试服务器进行滚动更新的脚本看起来像这样:

gcloud config configurations activate test-profile && kubectl rolling-update ...

虽然这可行,但如果两个作业 运行 同时针对不同的环境,则可能会非常危险。假设作业 1 以测试环境为目标,而作业 2 以生产环境为目标。如果作业 2 在作业 1 执行其 rolling-update 命令之前将活动配置文件切换到 "prod-profile",作业 1 将以错误的项目为目标,并且在更坏的情况下更新错误的复制控制器(如果集群具有相同的名称)。

问题

有没有一种方法可以指定 kubectl 命令所针对的项目(例如在滚动更新期间)对 运行 同时是安全的?

您可以使用gcloud config set project yourProject设置项目属性。参见 https://cloud.google.com/sdk/gcloud/reference/config/set

您可以将 --cluster=--context= 标志传递给 kubectl 以设置单个 运行。例如,如果我的 ~/.kube/config "foo" 和 "bar":

中有两个集群
$ kubectl --cluster=foo get pods
NAME              READY     STATUS    RESTARTS   AGE
foo-ht1qh   1/1       Running   0          3h
foo-wf8f4   1/1       Running   0          3h
foo-yvgpd   1/1       Running   0          3h

$ kubectl --cluster=bar get pods
NAME              READY     STATUS    RESTARTS   AGE
bar-de4h7   1/1       Running   0          9h
bar-c4g03   1/1       Running   0          9h
bar-2sprd   1/1       Running   0          9h