經(jīng)過(guò)長(zhǎng)期的生產(chǎn)實(shí)踐,我們發(fā)現(xiàn)Rancher 生產(chǎn)環(huán)境中經(jīng)常會(huì)遇到下面這4個(gè)問(wèn)題喊巍。 我們整理出了這個(gè)四個(gè)問(wèn)題發(fā)生的情景以及相關(guān)的監(jiān)控腳本膊畴,提供給需要的朋友們澄者。
4個(gè)監(jiān)控項(xiàng)
- ipsec 監(jiān)控
- 主機(jī) disconnect 監(jiān)控.
- stack unhealthy 監(jiān)控
- stack upgraded 監(jiān)控
監(jiān)控項(xiàng)對(duì)應(yīng)的腳本抚笔,以及如何部署
準(zhǔn)備工作
- 獲取 Rancher api:
- 打開(kāi) Rancher 其中一個(gè)環(huán)境.
- 在頂部菜單中選擇 API -> Keys扶认,點(diǎn)擊 “高級(jí)選項(xiàng)” -> “添加環(huán)境API KEY”
- 名稱(chēng)統(tǒng)一定為 monitor .
- 記錄下 Access Key 與 Secret Key
- 獲取Project ID
- 打開(kāi) Rancher 其中一個(gè)環(huán)境.
- 在頂部菜單中選擇 API -> Keys,點(diǎn)擊 “高級(jí)選項(xiàng)”
- 找到 端點(diǎn)殊橙,比如 http://rancher.wmcloud-qa.com/v2-beta/projects/1a5 , Proeject ID 即為 1a5
1. IPSEC 監(jiān)控
監(jiān)控原因
實(shí)際工作中辐宾,偶爾會(huì)出現(xiàn)主機(jī)之間的IPSEC 通道斷開(kāi),這會(huì)導(dǎo)致兩臺(tái)主機(jī)間的容器無(wú)法通信膨蛮, 在生產(chǎn)中一旦發(fā)生該故障叠纹, 則會(huì)出現(xiàn)非常嚴(yán)重的生產(chǎn)事故。
注意事項(xiàng)
- 所有Rancher主機(jī)都需要部署該監(jiān)控
- 報(bào)警策略是敞葛,輸出值改變即觸發(fā) S1 報(bào)警
監(jiān)控腳本
#!/bin/bash
c_id=`docker ps | grep ipsec-router | awk -F' ' '{ print $1 }'`
#echo $c_id
n=`docker exec $c_id swanctl -S | grep IKE_SAs | awk -F' ' '{ print $2 }'`
echo $n
2.主機(jī) disconnect 監(jiān)控
監(jiān)控原因
很多原因會(huì)觸發(fā)Rancher主機(jī)disconnect誉察, 譬如 CPU 用滿(mǎn), 內(nèi)存用滿(mǎn)惹谐, 網(wǎng)絡(luò)用滿(mǎn)持偏, 磁盤(pán)用滿(mǎn),系統(tǒng)load過(guò)高豺鼻, CPU上下文切換過(guò)高。 一旦發(fā)生Rancher 主機(jī) disconnect 就表明系統(tǒng)資源的使用已經(jīng)出現(xiàn)嚴(yán)重問(wèn)題款慨, 需要運(yùn)維人員手工緊急處理.
注意事項(xiàng)
- 每一個(gè)Rancher Environment 需要一套 Access Key 與 Secret Key.
- 腳本名稱(chēng) prod-respool-disconnect-monitor.sh
- 腳本內(nèi)容, 需要修改的地方有 RANCHER_URL, RANCHER_ACCESS_KEY, RANCHER_SECRET_KEY, PROJECT_ID
- 報(bào)警策略是輸出非0 即觸發(fā) S1報(bào)警
監(jiān)控腳本
RANCHER_URL=rancher.wmcloud.com
RANCHER_ACCESS_KEY=*****
RANCHER_SECRET_KEY=*****
# get project ID easily from the URL when you're in dashboard
PROJECT_ID=1a163
# get all disconnected hosts (YELLOW)
list=`curl -s -k -u "${RANCHER_ACCESS_KEY}:${RANCHER_SECRET_KEY}" \
"https://${RANCHER_URL}/v2-beta/projects/${PROJECT_ID}/hosts" \
| jq '.data[] | select(.state | contains("disconnected"))' | jq -r .hostname `
if [[ "X${list}" == "X" ]];
then
echo '0'
exit 0
else
echo ${list}
exit 127
fi
3. Stack unhealthy 監(jiān)控
監(jiān)控原因
出現(xiàn)Stack unhealthy 的情況很多儒飒,比如 應(yīng)用程序啟動(dòng)失敗, 對(duì)某個(gè)目錄權(quán)限不足檩奠, 依賴(lài)的服務(wù)沒(méi)有啟動(dòng)桩了,Rancher主機(jī)故障等等。 無(wú)論哪一種情況埠戳,都表示Stack 處于非正常工作狀態(tài)井誉,需要運(yùn)維人員立即進(jìn)行處理。
注意事項(xiàng)
- 每一個(gè)Rancher Environment 需要一套 Access Key 與 Secret Key.
- 腳本名稱(chēng) prod-respool-stack-unhealthy-monitor.sh
- 腳本內(nèi)容, 需要修改的地方有 RANCHER_URL, RANCHER_ACCESS_KEY, RANCHER_SECRET_KEY, PROJECT_ID
- 報(bào)警策略是輸出非0 即觸發(fā) S1報(bào)警
監(jiān)控腳本
#!/bin/bash
RANCHER_URL=rancher.wmcloud.com
RANCHER_ACCESS_KEY=***
RANCHER_SECRET_KEY=***
# get project ID easily from the URL when you're in dashboard
PROJECT_ID=1a163
# get all disconnected hosts (YELLOW)
list=`curl -s -k -u "${RANCHER_ACCESS_KEY}:${RANCHER_SECRET_KEY}" \
"https://${RANCHER_URL}/v2-beta/projects/${PROJECT_ID}/stacks" \
| jq '.data[] | select(.healthState != "healthy")' | jq -r .name `
if [[ "X${list}" == "X" ]];
then
echo '0'
exit 0
else
echo '1'
exit 127
fi
4. Stack upgrade 狀態(tài)監(jiān)控
監(jiān)控原因
rancher 有一個(gè)bug整胃, 當(dāng)stack處于 upgraded 狀態(tài)時(shí)颗圣,如果主機(jī)重啟, 處于 upgraded 狀態(tài)的service 都會(huì)處于stop 狀態(tài),并且無(wú)法自動(dòng)恢復(fù)在岂。 upgraded 狀態(tài)存在的意義在于方便運(yùn)維進(jìn)行回滾奔则,因此在監(jiān)控時(shí),保留24小時(shí)的緩沖時(shí)間
注意事項(xiàng)
- 每一個(gè)Rancher Environment 需要一套 Access Key 與 Secret Key.
- 腳本名稱(chēng) prod-respool-stack-unhealthy-monitor.sh
- 腳本內(nèi)容, 需要修改的地方有 RANCHER_URL, RANCHER_ACCESS_KEY, RANCHER_SECRET_KEY, PROJECT_ID
- 報(bào)警策略是輸出非0 ,并且持續(xù)24小時(shí)后蔽午,即觸發(fā) S2報(bào)警
監(jiān)控腳本
#!/bin/bash
RANCHER_URL=rancher.wmcloud.com
RANCHER_ACCESS_KEY=***
RANCHER_SECRET_KEY=***
# get project ID easily from the URL when you're in dashboard
PROJECT_ID=1a163
# get all disconnected hosts (YELLOW)
list=`curl -s -k -u "${RANCHER_ACCESS_KEY}:${RANCHER_SECRET_KEY}" \
"https://${RANCHER_URL}/v2-beta/projects/${PROJECT_ID}/stacks" \
| jq '.data[] | select(.state == "upgraded")' | jq -r .name `
if [[ "X${list}" == "X" ]];
then
echo 0
exit 0
else
echo 1
exit 127
fi