我想要一个命令,它可以获取pod的名称,然后使用它登录到pod。列出吊舱以获取吊舱名称的命令:
kubectl get pods | Select-String -Pattern "mypodname"
输出为:
mypodname 1/1 Running 0 4d3h
我只需要在这里得到mypodname的值。我尝试过选择对象名称,但没有成功。podname会随着时间的推移而变化。例如,它可能是mypodname-3467gogsfg一天和mypodname-043086dndn第二天因为新的部署。
这个值我将在这个命令中使用:
kubectl --server=https://myservername.com --insecure-skip-tls-verify exec -it <name of pod goes here> /bin/sh
第二个问题是如何在windows powershell脚本中组合这两者,以便我可以运行这样的程序来登录吊舱:
podlogin mypodname
函数可能就是您想要的,因为您希望通过只传递名称将结果组合到执行中:
Function PodLogin ($PodName) {
$name = kubectl get pods | ? { $_ -match "(?<=($PodName-.*))s" } | % { $Matches[1] }
kubectl --server=https://myservername.com --insecure-skip-tls-verify exec -it $name /bin/sh
}
Where-Object
(?
(的使用只允许更精简的代码,而不必挖掘匹配值的属性,因为-Match
将填充$Matches
自动变量。然后,管道到Foreach-Object
(%
(以访问通过$Matches[1]
匹配的值尽管不一定需要,但将其保存到$name
总体上更具吸引力。最后,将$name
传递给您的命令以供执行。
现在您可以使用PodLogin podname
进行调用。
这里有一个RegEx演示来解释这种模式。
- 假设模式总是
podname-....
,后面跟着一个空格
如果我理解正确,您可以拆分输出,然后将第一个单词分配给变量。kubectl的输出是文本,而不是对象。
$podname = -split (kubectl get pods | select-string mypodname) | select -first 1
$podname
mypodname
podlogin $podname