Rancher ノードのルート ディレクトリのスペース不足の解決策

1. 問題の説明


Rancher ノード サーバーを作成するとき、ディスク ディレクトリのスペースは計画されていませんでした。デフォルトの構成によれば、ルート ディレクトリは/50G のみで、docker のデフォルトのインストール パスは であり/var/lib/docker、その結果、ルート ディレクトリの使用率は 85% になります。Rancher ノードはディスク圧力アラームを頻繁に報告するため、docker のデフォルトのkubelet has disk pressureデータ ディレクトリを変更する必要があります。

2. Docker のデフォルトのデータ ディレクトリを変更する


  1. まず現在のデータ ディレクトリを確認します。
docker info | grep 'Docker Root Dir'
Docker Root Dir: /var/lib/docker
  1. Docker サービスを停止する
systemctl stop docker
  1. ディレクトリの下にスペースを空けて新しいディレクトリを作成します
mkdir -p /home/docker/
  1. データを新しいディレクトリにコピーする
cp -R /var/lib/docker /home/docker/
  1. 設定ファイルを変更する
vi /etc/docker/daemon.json

「graph」パラメータを設定します。私の docker バージョンは 20.10 です。他のバージョンでは、設定方法を自分で確認できます。

{
    
    
  "graph": "/home/docker"
}
  1. 設定ファイルをロードしてサービスを再起動します
systemctl daemon-reload
systemctl restart docker
  1. 変更後、再度docker情報を確認してください
docker info | grep 'Docker Root Dir'
Docker Root Dir: /home/docker
  1. 正しいことを確認したら、ルートディレクトリ内の古いデータを削除します
rm -rf /var/lib/docker/

3. 質問


ワークロードは以前に Rancher のこのノードにデプロイされているため、コンテナーを再度起動すると次のエラーが報告されます。

failed to create sandbox: 
ResolvConfPath /home/docker/container/xxx/resolv.conf does not exist

多くの方法を試しましたが問題を解決できず、最終的にはノードに再参加する必要がありました。

  1. ノードの解除
    Rancherノード管理でノードを解除し、解除完了後ステータスが になったらdrainedノードを削除します。
  2. ノードをクリーンアップする
    公式のノード クリーンアップ スクリプトを使用してノードをクリーンアップします

#!/bin/bash

KUBE_SVC='
kubelet
kube-scheduler
kube-proxy
kube-controller-manager
kube-apiserver
'

for kube_svc in ${KUBE_SVC};
do
  # 停止服务
  if [[ `systemctl is-active ${
     
     kube_svc}` == 'active' ]]; then
    systemctl stop ${kube_svc}
  fi
  # 禁止服务开机启动
  if [[ `systemctl is-enabled ${
     
     kube_svc}` == 'enabled' ]]; then
    systemctl disable ${kube_svc}
  fi
done

# 停止所有容器
docker stop $(docker ps -aq)

# 删除所有容器
docker rm -f $(docker ps -qa)

# 删除所有容器卷
docker volume rm $(docker volume ls -q)

# 卸载mount目录
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher;
do
  umount $mount;
done

# 备份目录
mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")

# 删除残留路径
rm -rf /etc/ceph \
    /etc/cni \
    /opt/cni \
    /run/secrets/kubernetes.io \
    /run/calico \
    /run/flannel \
    /var/lib/calico \
    /var/lib/cni \
    /var/lib/kubelet \
    /var/log/containers \
    /var/log/kube-audit \
    /var/log/pods \
    /var/run/calico \
    /usr/libexec/kubernetes

# 清理网络接口
no_del_net_inter='
lo
docker0
eth
ens
bond
'

network_interface=`ls /sys/class/net`

for net_inter in $network_interface;
do
  if ! echo "${no_del_net_inter}" | grep -qE ${net_inter:0:3}; then
    ip link delete $net_inter
  fi
done

# 清理残留进程
port_list='
80
443
6443
2376
2379
2380
8472
9099
10250
10254
'

for port in $port_list;
do
  pid=`netstat -atlnup | grep $port | awk '{print $7}' | awk -F '/' '{print $1}' | grep -v - | sort -rnk2 | uniq`
  if [[ -n $pid ]]; then
    kill -9 $pid
  fi
done

kube_pid=`ps -ef | grep -v grep | grep kube | awk '{print $2}'`

if [[ -n $kube_pid ]]; then
  kill -9 $kube_pid
fi

# 清理Iptables表
## 注意:如果节点Iptables有特殊配置,以下命令请谨慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain
systemctl restart docker

  1. ノードに再参加する

おすすめ

転載: blog.csdn.net/qq12547345/article/details/128470553