本文基于K8S中Docker容器对postgres数据库进行备份的操作,编写好脚本后,手动执行脚本是正常的,但是crontab定时实行却报错,报错信息为kubectl command not found,提示没有找到kubectl指令。
本文主要介绍对该报错信息的分析及其解决办法。详细内容请参考下文。
一、查看数据库环境
1、获取数据库所在节点
2、进入数据库对接节点容器
二、编写数据库备份脚本
1、执行指令# vim pgbackup.sh
#!/bin/bash
#设置系统变量
source /etc/profile
filename="`date +%F`_bak.sql"
#备份数据脚本
cat > /usr/local/backup/exportPG.sh ${filename}
EOF
#给执行权限
chmod +x /usr/local/backup/exportPG.sh
#将服务器上的备份脚本复制到对应容器中去
kubectl cp /usr/local/backup/exportPG.sh sso/********:/exportPG.sh
#在容器外执行该脚本
kubectl exec -it ******** -n sso -- /exportPG.sh
#将备份后的数据文件复制到容器外
kubectl cp sso/********:${filename} /usr/local/backup/${filename}
2、授予备份脚本执行权限
执行指令# chmod +x
/usr/local/backup/pgbackup.sh
3、测试数据库备份脚本
说明:测试数据库备份脚本,手动执行# sh pgbackup.sh的时候,备份正常。但是在使用crontab执行任务定时执行的时候,报kubectl command not found的错误信息。
4、分析定时执行的报错信息
说明:crontab执行计划任务的时候并不知道所需要的特殊环境变量。所以要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。
特别需要注意如下三点:
(1)脚本中涉及文件路径时写全局路径;
比如:
上文所提到的数据备份脚本问题,就是kubectl指令没有写全路径,正确的做法是,通过执行指令# which kubectl查看指令kubectl的所在位置,让后将脚本的指令路径补全。
(2)脚本执行要用到程序或其他环境变量时,通过source命令引入环境变量;
比如:
在root的crontab文件中加入:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
(3)、如上文所述,当手动执行脚本正常,但是crontab定时执行报错的情况。就是环境变量问题,可以在crontab中直接引入环境变量解决。
0 * * * * /etc/profile;/bin/bash /home/scripts/test.sh >/dev/null 2>&1
5、修改后的备份脚本
说明:执行指令# vim pgbackup.sh修改数据库备份脚本,修改后的脚本如下