背景介紹
本文介紹的內容,以docker-ce=19.03.13~centos 和 kubernetes=1.16.2 版本為例介紹,其他版本應該大同小異。
我們知道,docker-ce的默認工作目錄是/var/lib/docker,會存放docker鏡像文件、容器日志及寫到容器臨時目錄的文件等。
kubelet的默認工作目錄是/var/lib/kubelet,會存放volume文件(包括emptyDir volume)、plugin文件等。
這實際存在一個風險:大量的鏡像文件或容器日志等,可能把操作系統根分區容量占滿,進而導致系統crash或k8s pod被頻繁驅逐等異常發生。
我們在生產環境上,往往需要更改docker和kubelet的工作目錄,將其改到另外一塊數據盤的文件系統上,例如下文中的“/mnt/data”目錄。
修改docker工作目錄
修改 vim /usr/lib/systemd/system/docker.service啟動文件,添加 --graph=/data/docker
ExecStart=/usr/bin/dockerd --graph=/data/docker -H fd:// --containerd=/run/containerd/containerd.sock
重啟docker
systemctl daemon-reload
systemctl restart docker
修改kubelet工作目錄
根據 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 加載文件,只需要修改 /etc/sysconfig/kubelet 即可。
KUBELET_EXTRA_ARGS="--root-dir=/data/k8s/kubelet"
此時config.yaml文件還是在/var/lib/kubelet下,需要修改為 : /data/k8s/kubelet
將 vim 文件中 /var/lib/kubelet 改為 /data/k8s/kubelet
Environment="KUBELET_CONFIG_ARGS=--config=/data/k8s/kubelet/config.yaml"
EnvironmentFile=-/data/k8s/kubelet/kubeadm-flags.env
移動數據到 /data/k8s/kubelet
mkdir -p /data/k8s/kubelet mv /var/lib/kubelet/* /data/k8s/kubelet cp -rp /data/k8s/kubelet/pki/ /var/lib/kubelet/ ##后面可能會報 證書路徑問題,故將證書拷貝回原路徑
重啟kubelet
systemctl daemon-reload
systemctl restart kubelet
修改etcd數據目錄
使用kubeadm搭建的k8s集群,默認etcd的數據目錄為 /var/lib/etcd 。
集群運行一段時間后, 發現在系統硬盤上的etcd即占空間,又影響速度。所以將其數據目錄遷移到ssd中。
注意
修改配置文件后,etcd會自動重啟,並且導致對應機器的kubectl不可用。
所以請一台一台修改,etcd leader 節點放到最后操作,並且確保其他機器的kubectl可用。
vim /etc/kubernetes/manifests/etcd.yaml
# 翻到最下方,編輯hostPath
volumes: - hostPath: path: /etc/kubernetes/pki/etcd type: DirectoryOrCreate name: etcd-certs - hostPath: path: /data/k8s/etcd # 將這個路徑改為你要更改到的路徑 type: DirectoryOrCreate name: etcd-data
注意,這里不要修改command中的–data-dir。 command中的選項是控制容器中的數據目錄,我們只需要改變hostpath就可以了。
修改完成后,etcd會自動重啟,使用其他master查看etcd狀態。
這里etcd起不來是正常的,需要執行一下幾步:
- 刪除etcd的pod,刪除后pod會從列表中消失,這是正常現象
- 需把etcd的要把/var/lib/etcd/* 拷貝到更改后的目錄
- 重啟物理機的kubelet
- 查看狀態
以上4步做完之后,etcd應該已經起來了。 注意,這里一定要先修改配置文件,在拷貝etcd數據
使用kubectl ecex 到一個etcd節點中, 查看etcd狀態,一定要等節點狀態全部健康后,在繼續操作其他節點。