• Rancher清理节点


    本节介绍如何从一个 Rancher 创建的 Kubernetes 集群中断开一个节点,并从该节点中删除所有 Kubernetes 组件。此过程允许您将释放节点资源,将节点用于其他用途。

    当您使用 Rancher 创建集群节点 时,将创建资源(容器/虚拟网络接口)和配置项(证书/配置文件)。

    当从您的 Rancher 启动的 Kubernetes 集群中删除节点时(假设它们处于active状态),这些资源将被自动清除,所需的唯一操作是重新启动节点。当一个节点变得不可访问并且不能使用自动清理过程时,我们将再次说明将该节点添加到集群之前需要执行的步骤。

    清理脚本#

    警告

    以下操作将删除节点中的数据(包括容器,卷,iptables 等),在执行命令之前,请先查看该脚本,确保您理解这个脚本在做什么,并且确保已进行了数据备份。

    #!/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

    删除了什么?#

    在使用 Rancher 清理创建的节点时,将根据要删除的集群节点的类型删除以下组件。

    删除的组件

    由基础设施提供商托管的节点

    自定义集群的节点

    托管集群的节点

    导入集群的节点

    Rancher deployment 命名空间 (默认cattle-system )
    由 Rancher 打了标签的serviceAccountclusterRoles, 和 clusterRoleBindings
    标签、注释和清理器
    Rancher Deployment
    主机、集群、项目和用户自定义资源定义 (CRDs)
    management.cattle.io API 分组下创建的所有资源
    所有由 Rancher v2.x 创建的 CRD

    通过 Rancher UI 从集群中删除节点#

    当节点处于“活动”状态时,从集群中删除节点将触发一个进程来清理节点。完成自动清理过程后,请重启节点,以确保正确删除了所有非持久性数据。

    重启节点:
    ## using reboot
    $ sudo reboot

    ## using shutdown
    $ sudo shutdown -r now

    手动从集群中删除 Rancher 组件#

    当某个节点不可访问并从集群中删除时,由于该节点不可访问,因此无法触发自动清理过程。请按照以下步骤手动删除 Rancher 组件。

    警告: 下面列出的命令将会从节点中删除数据。在执行任何命令之前,确保您已经创建了要保存的文件备份,因为数据将会丢失。

    从导入的集群中删除 Rancher 组件#

    对于导入的集群,删除 Rancher 的过程略有不同。您可以在 Rancher UI 中简单地删除集群,也可以运行从节点中删除 Rancher 组件的脚本。两个选项执行相同的删除操作。

    将导入的集群与 Rancher 分离后,集群的工作负载将不受影响,您可以使用与将集群导入 Rancher 之前相同的方法访问集群。

    通过 UI / API 删除#

    警告: 此过程将从您的集群中删除数据。在执行命令之前,请确保您已经创建了要保存的文件备份,因为数据将会丢失。

    在使用 Rancher UI(或 API)开始删除导入的集群之后, 将发生以下事件。

    1. Rancher 创建了一个 serviceAccount 用于从集群中删除 Rancher 组件。这个帐户分配了删除 Rancher 组件所需要的clusterRole 和 clusterRoleBinding 权限。

    2. 使用serviceAccount, Rancher 调度并运行一个作业,该作业清除集群中的 Rancher 组件。此作业还将 serviceAccount 及其角色作为依赖项引用,因此作业将在完成之前删除它们。

    3. Rancher 从集群中移除。但是,集群仍然在运行本地版本的 Kubernetes。

    结果: 所有在 删除了什么?中为导入集群列出的组件会被删除。

    通过运行脚本删除#

    您可以运行一个脚本,而不是使用 Rancher UI 来清除导入的集群节点。该功能从v2.1.0版本开始提供。

    先决条件:

    安装 kubectl

    1. 打开网页浏览器, 打开 GitHub页面, 并下载 user-cluster.sh.

    2. 在与user-cluster.sh相同的路径下运行以下命令,使脚本可执行:
      chmod +x user-cluster.sh

    3. 仅限于离线环境: 打开 user-cluster.sh 将 yaml_url 替换成 user-cluster.yml中的 URL

      如果您没有离线环境,请跳过这一步。

    4. 在同一目录中,运行脚本并提供 rancher/rancher-agent 镜像版本, 该版本应该与用于管理集群的 Rancher 版本一致。():

      提示:

      添加 -dry-run 标志来预览脚本的结果,而不做任何更改


      ./user-cluster.sh rancher/rancher-agent:

    结果: 脚本运行。所有在 删除了什么?中为导入集群列出的组件会被删除。

    Windows 节点#

    要清理 Windows 节点,可以运行位于 c:\etc\rancher目录下的清理脚本。该脚本删除 Kubernetes 生成的资源和执行的二进制文件。它还取消了防火墙规则和网络设置。

    要运行脚本,可以在 PowerShell 中使用此命令:
    pushd c:\etc\rancher
    .\cleanup.ps1
    popd

    结果: 节点被重置,可以重新添加到 Kubernetes 集群中。

    Docker 容器、镜像和卷#

    根据您分配给节点的角色,容器中有 Kubernetes 组件, 属于覆盖网络的容器、DNS、ingress 控制器和 Rancher Agent。(还有您创建的 Pods 也被调度到这个节点)

    清理所有 Docker 容器、镜像和卷:
    docker rm -f $(docker ps -qa)
    docker rmi -f $(docker images -q)
    docker volume rm $(docker volume ls -q)

    挂载#

    Kubernetes 的组件和密钥在系统上留下了需要卸载的挂载。

    挂载

    /var/lib/kubelet/pods/XXX (各种挂载)
    /var/lib/kubelet
    /var/lib/rancher

    卸载所有挂载:
    for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done

    文件与目录#

    以下目录在添加一个节点到一个集群时被使用到,应该将它们删除。您可以使用命令 rm -rf /directory_name删除目录

    注意: 根据您分配给节点的角色,一些目录将会或不会出现在节点上。

    Directories

    /etc/ceph
    /etc/cni
    /etc/kubernetes
    /opt/cni
    /opt/rke
    /run/secrets/kubernetes.io
    /run/calico
    /run/flannel
    /var/lib/calico
    /var/lib/etcd
    /var/lib/cni
    /var/lib/kubelet
    /var/lib/rancher/rke/log
    /var/log/containers
    /var/log/kube-audit
    /var/log/pods
    /var/run/calico

    清除目录:
    rm -rf /etc/ceph \
    /etc/cni \
    /etc/kubernetes \
    /opt/cni \
    /opt/rke \
    /run/secrets/kubernetes.io \
    /run/calico \
    /run/flannel \
    /var/lib/calico \
    /var/lib/etcd \
    /var/lib/cni \
    /var/lib/kubelet \
    /var/lib/rancher/rke/log \
    /var/log/containers \
    /var/log/kube-audit \
    /var/log/pods \
    /var/run/calico

    网络接口和 Iptables#

    其余被更改/配置过的两个组件是(虚拟)网络接口和 iptables 规则。它们相对于节点来说都是非持久性的,这意味着它们将在重新启动节点后被清除。要删除这些组件,建议重启节点。

    重启节点:
    ## using reboot
    $ sudo reboot

    ## using shutdown
    $ sudo shutdown -r now

    如果您想了解更多关于(虚拟)网络接口或 iptables 规则的信息,请参阅下面的特定主题。

    网络接口#

    注意: 根据为节点所在的集群配置的网络供应商,一些接口将出现在节点上,也可能不出现在节点上。

    Interfaces

    flannel.1
    cni0
    tunl0
    caliXXXXXXXXXXX (random interface names)
    vethXXXXXXXX (random interface names)

    列出所有接口:
    ## Using ip
    ip address show

    ## Using ifconfig
    ifconfig -a

    删除接口:
    ip link delete interface_name

    iptables#

    注意: 根据为节点所在的集群配置的网络供应商,节点上可能存在或不存在某些 chains。

    iptables 规则用于将数据从容器路由到容器。创建的规则不是持久性的,因此重新启动节点将把 iptables 恢复到原来的状态。

    Chains

    Chains

    cali-failsafe-in
    cali-failsafe-out
    cali-fip-dnat
    cali-fip-snat
    cali-from-hep-forward
    cali-from-host-endpoint
    cali-from-wl-dispatch
    cali-fw-caliXXXXXXXXXXX (random chain names)
    cali-nat-outgoing
    cali-pri-kns.NAMESPACE (chain per namespace)
    cali-pro-kns.NAMESPACE (chain per namespace)
    cali-to-hep-forward
    cali-to-host-endpoint
    cali-to-wl-dispatch
    cali-tw-caliXXXXXXXXXXX (random chain names)
    cali-wl-to-host
    KUBE-EXTERNAL-SERVICES
    KUBE-FIREWALL
    KUBE-MARK-DROP
    KUBE-MARK-MASQ
    KUBE-NODEPORTS
    KUBE-SEP-XXXXXXXXXXXXXXXX (random chain names)
    KUBE-SERVICES
    KUBE-SVC-XXXXXXXXXXXXXXXX (random chain names)

    列出所有 iptables 规则:
    iptables -L -t nat
    iptables -L -t mangle
    iptables -L

  • 相关阅读:
    如何使用API进行大规模数据收集和分析
    一键搞定发布自己Jar到Maven中央仓库
    Java多线程——线程池
    面向对象编程思维(软件工程)
    java对zip、rar、7z文件带密码解压实例
    leetcode:126. 单词接龙 II
    conda手动下载虚拟环境中的包
    windows安装metesploit遇到的问题
    【操作系统】操作系统基础必知必会
    关于并发编程与线程安全的思考与实践 | 京东云技术团队
  • 原文地址:https://blog.csdn.net/LG_15011399296/article/details/133693954