背景
項目測試環境升級部署服務時,經常出現本地容器數據丟失,鏡像倉庫鏡像數據丟失現象,經排查容器的數據目錄/var/lib/docker,容器鏡像倉庫鏡像數據目錄/mnt/docker/registrydata以及k8s數據組目錄/var/lib/kubelet和主機根文件系統共用同一塊磁盤空間,有些團隊的服務日志沒有轉儲持續打印占用磁盤空間,導致整個根分區容量近乎占滿,出現容器數據和鏡像數據被系統刪除,進而導致pod crash或k8s pod被頻繁驅逐等問題發生。
解決措施
我們在生產環境上,需要將docker容器數據,鏡像倉庫數據,k8s本地數據目錄掛盤轉儲。
集群中數據目錄
docker-ce的默認工作目錄是/var/lib/docker,會存放docker鏡像文件、容器日志及寫到容器臨時目錄的文件等。
kubelet的默認工作目錄是/var/lib/kubelet,會存放volume文件(包括emptyDir volume)、plugin文件等。
數據目錄掛盤轉儲
以下操作需要嚴格按照順序在每個節點上操作,假如先在node01上操作:
- 尋找一塊磁盤空間大的盤掛載的目錄
等所有被驅逐的pod都runing后再做后續步驟
df -h
/dev/sdb1 3.7T 110G 3.6T 3% /data2
/dev/sdc1 3.7T 33G 3.7T 1% /data1
/dev/sdd1 3.7T 35G 3.7T 1% /data3
比如 /data1 掛載在sdc1 盤,而且空間為3.7T,只使用了1%,我們就將容器數據 和 k8s 數據存放在此目錄下。
- 先在節點上打上污點,驅逐已有的pod
kubectl cordon node01
kubectl drain node01 --delete-emptydir-data --ignore-daemonsets --force
等所有被驅逐的pod都runing后再做后續步驟
- 容器數據轉儲
mkdir -p /data1/var/lib
cp -rf /var/lib/docker /var/lib/docker.bak
systemctl stop docker
mv /var/lib/docker /data1/var/lib/
ln -s /data1/var/lib/docker /var/lib/
systemctl restart docker
kubectl get pod -A -o wide | grep node01
當node01 節點上所有 pod 都running后
rm -rf /var/lib/docker.bak
- k8s 容器數據轉儲
systemctl stop kubelet
cp -rf /var/lib/kubelet /var/lib/kubelet.bak
mv /var/lib/kubelet /data1/var/lib/
ln -s /data1/var/lib/kubelet /var/lib/
systemctl restart kubelet
- 恢復節點可調度
kubectl uncordon node01
最后檢查下所有pod都處于running狀態
鏡像數據目錄掛盤轉儲
先查看鏡像服務器所在節點地址
節點上敲命令docker images
登錄 173.64.48.12 節點,查詢docker-registry容器id
docker inspect 容器id
確認容器鏡像掛載目錄所映射的主機目錄是否在一個空間比較大的盤,如果在一個空間比較大的盤(判斷標準和容器數據目錄掛載轉儲相同),以下步驟不需要操作。
將docker-registry容器刪除
docker stop 容器 id
docker rm 容器id
掛載目錄下創建子目錄并同步鏡像數據
mkdir - p /data1/docker/registry
mv /mnt/data/registry /data1/docker/
注意:/mnt/data/registry 為當前鏡像服務器鏡像文件所在路徑
重啟啟動鏡像服務器
docker run -d -p 5000:5000 -v /data1/docker/registry:/var/lib/registry registry:v1
查看鏡像是否轉儲成功
curl -XGET 173.64.48.12:5000/v2/_catalog