我在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命令中使用的上下文。
我们这样做,因为我们在多个区域有多个集群,所以每次我们在函数应用程序上调用时,我们都需要连接到给定的集群来处理它。
这样做的问题是,当我们在两个不同的集群上同时收到两个请求时,最早的调用将覆盖其上下文,并在错误的集群上执行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
添加到kubecconfig中的名称中;因此,您必须添加"-admin"到$contextName
:
$contextName = "$cluster-$id-admin"
这是有限制的,因为az aks get-credentials
不允许我们为生成的user
对象覆盖参数name
(至少据我所知,文档中也没有提到)。其格式为"static"如果使用--admin
,则始终为clusterUser_{resourceGroupName}_{clusterName}
或clusterAdmin_{resourceGroupName}_{clusterName}
。
只有当您有两个具有完全相同名称和资源组名称的不同集群时才需要考虑这个问题(我想问为什么会出现这种情况,但是唉)。
你很可能在这里看到两种不同的结果:
- &"同名对象已存在"-ish错误,或
az aks get-credentials
的第二次调用将覆盖现有的对象与新的值如果您使用--overwrite-existing
命令参数,导致所有API调用第一次调用的集群失败与401或403相关的错误(至少是我的猜测)
为了解决这个问题,您可以写入一个特定的kubecconfig文件,同样是脚本当前上下文/执行的唯一文件,然后使用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"如果您使用--admin
,则将$contextName
(显然,将$contextName
和$kubeconfig
分开分配)
我想你指的是并发的powershell命令执行?
你可以把这些az login/k8s context setting/kubectl命令打包成一个脚本,并使用powershell内置的并发机制来完成你的工作。
PowerShell通过jobs
并发运行命令和脚本。
这些文档或教程可能会有所帮助:
- PowerShell: about_Thread_Jobs
- PowerShell多线程:A Deep Dive
- SO: Powershell可以并行运行命令吗?