我在 powershell 中有一个 azure 函数应用程序,专用于 kubernetes 函数。
有多个函数,但对于每个函数,我们要做的第一件事就是这样。
az login --service-principal -u $usr -p $pwd --tenant $tenant
$config = $HOME + "/.kube/$tenant";
az account set --subscription $subscription
az aks get-credentials --overwrite-existing --name $cluster --resource-group $rg --admin --file $config
kubectl config set-context --current --namespace=$tenant
这设置了我们将在下一个 kubectl 命令中使用的上下文。
我们这样做是因为我们在多个区域有多个集群,因此每次我们收到函数应用程序的调用时,我们都需要连接到给定的集群来处理它。
问题是,当我们同时收到 2 个不同集群的 2 个请求时,最早的调用将覆盖其上下文并在错误的集群上执行 kubectl 命令。 有没有办法隔离每个调用或解决方案?
最佳答案
您应该能够只使用 kubectl 的全局 --context
参数(和 --kubeconfig
如果需要),例如:
az aks get-credentials -n $cluster -g $rg
kubectl get pod -n $tenant --context $cluster
如果您有两个名称相同的不同集群,则可以使用 az aks get-credentials
拥有--context
命令参数,然后为并发脚本执行选择一个鉴别器:
$id = "$(new-guid)"
$contextName = "$cluster-$id"
az aks get-credentials -n $cluster -g $rg --context $contextName
kubectl get pod -n $tenant --context $contextName
请注意添加 --admin
获取凭据时的命令参数还将附加 -admin
kubeconfig 中的名称;从而迫使您将“-admin”添加到 $contextName
:
$contextName = "$cluster-$id-admin"
这有一个限制,即 az aks get-credentials
不允许我们覆盖参数 name
对于生成的user
对象(至少据我所知, nor is it mentioned in the docs )。它的格式是“静态”并且始终是 clusterUser_{resourceGroupName}_{clusterName}
或clusterAdmin_{resourceGroupName}_{clusterName}
如果使用 --admin
.
如果您有 2 个具有完全相同的名称和资源组名称的不同集群,这实际上只是一个问题(我想知道为什么会出现这种情况,但可惜)。
您很可能会在这里看到两种不同的结果:
- “同名对象已存在”错误,或
- 第二次调用
az aks get-credentials
如果您使用--overwrite-existing
将使用新值覆盖现有对象命令参数,导致对第一个调用集群的所有 API 调用失败,并出现 401 或 403 相关错误(至少是我的猜测)
为了解决这个问题,您可以写入特定的 kubeconfig 文件,该文件对于脚本的当前上下文/执行也是唯一的,然后使用 kubectl 的全局 --kubeconfig
命令参数:
$id = "$(new-guid)"
$contextName = $kubeconfig = "$cluster-$id"
az aks get-credentials -n $cluster -g $rg --context $contextName --file $kubeconfig
kubectl get pod -n $tenant --context $contextName --kubeconfig $kubeconfig
记住将“-admin”添加到您的$contextName
中,如果您使用--admin
(显然,将 $contextName
和 $kubeconfig
分配分开)。
关于azure - 如何使用多个 azure kubernetes 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74374492/