在bash脚本中运行多个kubectl命令

时间:2019-11-19 23:23:04

标签: bash shell kubernetes

我正在尝试创建一个仪表板,在其中可以查看集群中Pod的状态。所以我有一个bash脚本,其内容类似于:

SERVICE_ONE=$(kubectl get pods | grep service-one | grep -E -- 'CrashLoopBackOff|Terminating|Error|Fail')
SERVICE_TWO=$(kubectl get pods | grep service-two | grep -E -- 'CrashLoopBackOff|Terminating|Error|Fail')
SERVICE_THREE=$(kubectl get pods | grep service-three | grep -E -- 'CrashLoopBackOff|Terminating|Error|Fail')

if [ ${#SERVICE_ONE} = 0 ]
then
  SERVICE_ONE_STATUS="GOOD"
else
  SERVICE_ONE_STATUS="BAD"

然后将这些结果发布到GUI。唯一的问题是这些kubectl命令中几乎有20个,它们总共使程序运行超过2分钟。我尝试做类似的事情:

KUBE_OUTPUT=$(kubectl get pods)
SERVICE_ONE=$(grep service-one <<< ${KUBE_OUTPUT} | grep -E -- 'CrashLoopBackOff|Terminating|Error|Fail')
SERVICE_TWO=$(grep service-two <<< ${KUBE_OUTPUT} | grep -E -- 'CrashLoopBackOff|Terminating|Error|Fail')
SERVICE_THREE=$(grep service-three <<< ${KUBE_OUTPUT} | grep -E -- 'CrashLoopBackOff|Terminating|Error|Fail')

但是这不起作用,因为kube输出没有以我在终端上简单运行时的格式保存(存在间距问题,没有换行符等)。我想知道是否有更好的方式一次执行多个kubectl命令?

1 个答案:

答案 0 :(得分:1)

因为,每次运行kubectl命令来获取pod的详细信息都会花费时间。

我尝试使用-o = jsonpath类似于以下内容获取kubectl

$  VAR=$(kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.status.phase}{'\n'}{end}"$'\r' | grep -E -- 'CrashLoopBackOff|T
erminating|Error|Fail|Running')

这将使用广告连播的名称和状态过滤结果。 输出就像

$ IFS=' '
$ echo $VAR
my-deployment-55bc8b77dd-8plsw  Running
my-deployment-55bc8b77dd-crlbx  Running
my-deployment-55bc8b77dd-jqqx4  Running
my-deployment-55bc8b77dd-mnm5k  Running
my-deployment-55bc8b77dd-zndvs  Running

现在您可以再次根据广告连播名称进行过滤

$ SERVICE=$(echo $VAR | grep my-deployment-55bc8b77dd-8plsw)

输出将是

$ echo $SERVICE
my-deployment-55bc8b77dd-8plsw  Running

现在拆分结果并根据需要显示状态。 霍普这有帮助。 如果这不是您想要的。请发表评论。

谢谢。