为特定项目和集群运行单个 kubectl 命令?

Joh*_*han 4 google-cloud-platform kubernetes google-kubernetes-engine

背景

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

gcloud config configurations activate test-profile && kubectl rolling-update ...
Run Code Online (Sandbox Code Playgroud)

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

问题

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

Tim*_*kin 11

您可以将--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
Run Code Online (Sandbox Code Playgroud)

$ 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
Run Code Online (Sandbox Code Playgroud)