kubernetes之如何在POD外执行复杂shell命令

查看官方文档,可以很轻易知道在 POD 外执行某个容器内的某个命令如下:

1
kubectl exec [POD名称] -- [需要执行的命令]

演示(进入容器内并列出当前文件夹文件信息):

1
2
3
4
5
6
7
8
[root@lemonlzy data]# kubectl exec -it kom-7ff799c96d-4tkqh -- ls
'${catalina.base}'	        commons-daemon.jar   shutdown.sh
 bootstrap.jar		        configtest.sh	     startup.sh
 catalina-tasks.xml	        daemon.sh	     tomcat-juli.jar
 catalina.sh		        digest.sh	     tool-wrapper.sh
 categoryWebService_Error.log   error.log	     version.sh
 ciphers.sh		        logs
 commons-daemon-native.tar.gz   setclasspath.sh

但是实际使用中我们通常会遇到一行命令中会使用各种管道命令,这样的话使用上述方式就不行了。

演示(显示容器内部 tomcat 进程信息):

1
[root@lemonlzy data]# kubectl exec -it kom-7ff799c96d-4tkqh -- ps -ef | grep tomcat

没有任何输出,实际上该命令将| grep tomcat 视为 kubectl exec -it kom-7ff799c96d-4tkqh – ps -ef 的结果再执行的管道命令,所以没有任何输出,且不符合我们的预期,并不能查询到容器内部 tomcat 的进程信息 解决 此时应该如下操作(注意命令用单引号包围,并注意与需执行命令中的单双引号进行区分):

1
kubectl exec [POD名称] -- bash -c '[需要执行的命令]'

调整如下:

1
2
3
4
[root@lemonlzy data]# kubectl exec -it kom-7ff799c96d-4tkqh -- bash -c 'ps -ef | grep tomcat'
root         1     0  1 10:34 ?        00:02:53 /usr/local/openjdk-8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root      3909     0  0 14:28 pts/0    00:00:00 bash -c ps -ef | grep tomcat
root      3916  3909  0 14:28 pts/0    00:00:00 grep tomcat

编写 shell 脚本,仅保留 pod 内 tomcat 容器,三天内的日志信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#/bin/bash

POD_NAME=`(kubectl get pod | grep kom | awk '{print $1}')`
for pod in ${POD_NAME[@]};
do
    kubectl exec -it $pod -- bash -c 'find /usr/local/tomcat/logs/ -mtime +2 | xargs rm -f'
    kubectl exec -it $pod -- bash -c 'find /usr/local/tomcat/logs/ -name "debug.log" | xargs truncate -s 0'
    kubectl exec -it $pod -- bash -c 'find /usr/local/tomcat/logs/ -name "info.log" | xargs truncate -s 0'
    kubectl exec -it $pod -- bash -c 'find /usr/local/tomcat/logs/ -name "error.log" | xargs truncate -s 0'
done

另外获取容器名称用$() 去执行命令即可。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up