azure - 如何使用多个 azure kubernetes 上下文

标签 azure kubernetes azure-functions kubectl

我在 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/

相关文章:

用于创建服务主体的 Azure 函数

kubernetes - 将 kubernetes Controller 管理器 "terminated-pod-gc-threshold"标志设置为较低值

Azure Kubernetes LoadBalancer 将请求转发到所有实例

docker - GET to API可在浏览器中使用,但不适用于Postman

c# - 如何将附加参数传递给 Blob 触发函数

c# - 使用刷新 token 和 native 应用程序客户端 ID 获取访问 token

azure - 如何以编程方式创建 Webhook 以检查 ADO 存储库是否有代码推送

c# - 如何从 Azure 总线服务检索所有主题?

c# - 从 IActionResult 响应中删除空值

消费计划的 Azure Functions 超时