我的要求是登录到pod,而不选择命名空间和pod名称,然后提供一个在其中运行的命令。没有回答查询的线程或问题。以下是我想出的解决方案。如果可以对此进行改进,请提供这些改进。
我正在寻找构建自动化或 krew 插件来登录任何命名空间中的任何 pod 并在其中运行任何命令。它纯粹是基于自动化的,有很多插件可以像 k9s 和其他 krew 插件一样做同样的工作,但我的要求更像是基于通用的轻量级,可以在没有任何第三方工具的情况下在管道中实现。
创建一个 shell 脚本
login.sh
#$1 is namespace $2 is the row number where the pod is located $3 is the command to run inside the pod
#$3 is command can be bash,sh or some command like echo "test"
#Example ./login.sh test-ns 1 bash or ./login.sh test-ns 1 'echo "test"'
pod=$(kubectl get pods -n $1 | grep -v NAME | awk -v i=1 -v j=$2 'FNR == j {print $i}')
kubectl exec -it $pod -n $1 -- $3
如何使用?
login.sh $namespace $pod_数字$command
1.创建上面的脚本,使其可执行并将其复制到/usr/local/bin目录或$PATH变量中
chmod +x login.sh
#Check if /usr/local/bin exists in PATH variable, if not then run the export command
echo $PATH
export PATH=$PATH:/usr/local/bin
cp -p login.sh /usr/local/bin/login.sh
2.运行kubectl 获取 pods以获取要在其中运行命令的 pod 编号
helloworld-v1-5dfcf5d5cd-v7xtw 1/1 Running 0 8d
httpbin-56db79f4f5-j2cxz 1/1 Running 1 8d
test-cc5b6bfd-2hhmr 1/1 Running 0 39h
我想进入第二个豆荚,外壳是bash
3.运行命令以使用脚本
login.sh default 2 bash
演示输出
输出如下所示:
shubham.yadav@my-MAC:~/k8s $ ./login.sh default 2 bash
root@httpbin-56db79f4f5-j2cxz:/#
另一个例子只是为了让实现更清晰
shubham.yadav@my-MAC:~/k8s $ login.sh qa-test 2 'echo "From the pod Login Succeeded"'
"From the pod Login Succeeded"
注意:如果命名空间中有大量 pod,您可以使用 awk 的NR实用程序来获取 pod 的列号。
KP是kubectl get pods的别名
kp | grep -v NAME | awk '{print NR, $1}'
1 details-v1-78d78fbddf-zksf7
2 helloworld-v1-5dfcf5d5cd-wl2nx
3 httpbin-56db79f4f5-wj4ql
4 load-generator-5cdbd66865-fxpbm
5 productpage-v1-85b9bf9cd7-qp79l
6 ratings-v1-6c9dbf6b45-xm6ww
7 reviews-v1-564b97f875-cx86c
8 reviews-v2-568c7c9d8f-xxc86
9 reviews-v3-67b4988599-p98ft
10 test-cc5b6bfd-68tqg
11 test-cc5b6bfd-8q694
12 unset-deployment-7896c75bf6-5w27b
13 web-v1-fc4d58bdc-pcv9p
14 web-v2-7bf5dd654d-684t9
15 web-v3-7567d5d6b9-sqrpg
为 shell 脚本创建二进制文件
如果您有兴趣为上述脚本创建二进制文件,您可以点击以下链接,该链接可让您为上述 shell 脚本创建二进制文件。
还可以将二进制名称更改为更友好的名称,从login.sh更改为仅执行
shubham.yadav@my-MAC:/usr/local/bin $ mv login.sh execute
shubham.yadav@my-MAC:/usr/local/bin $ execute qa-test 2 'echo "Binary Name Changed"'
"Binary Name Changed"