本文基于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 <<EOF
#!/bin/bash
export PGUSER=****
export PGPASSword='******'
export PGHOST=172.**.**.**
export PGPORT=324**
#備份整個集群庫中的數據
#pg_dumpall -a > ${filename}
#備份整個集群庫包含建庫建表操作
pg_dumpall > ${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}
1.
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修改數據庫備份腳本,修改后的腳本如下