Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch to k3s Uninstall Script #108

Open
timothystewart6 opened this issue Sep 26, 2022 · 2 comments
Open

Switch to k3s Uninstall Script #108

timothystewart6 opened this issue Sep 26, 2022 · 2 comments
Labels
enhancement New feature or request

Comments

@timothystewart6
Copy link
Contributor

We mange our own way of cleaning up nodes, however we should rely on k3s's uninstall script that is placed there when k3s is installed.

https://rancher.com/docs/k3s/latest/en/installation/uninstall/

server nodes
/usr/local/bin/k3s-uninstall.sh

agent nodes
/usr/local/bin/k3s-agent-uninstall.sh

We will also want to be sure we can run this multiple times without failure (part of the reason it was extracted from this).

I think we can check to see if it exists first before running and assume if it does not that it's a clean system. Not the best but open to ideas.

@hdensity
Copy link
Contributor

hdensity commented Apr 2, 2023

I can tackle this change if you like. I've already made the necessary changes, but before creating a PR I'd like to discuss them with you.

First off, regarding the uninstall scripts. They call /usr/local/bin/k3s-killall.sh which stops the service and kills all processes, and then unmount and remove all files, including the uninstall scripts themselves. Basically this means, checking for it's existence is a safe way of assuming if the system is clean or not. Any error in their execution would prevent said scripts from being removed.

The question I have is:
a) should we use the script from get.k3s.io to install k3s? It would take care of downloading the appropriate binary for the given CPU architecture, creating the proper service files and generating the uninstall scripts for us.
b) or should we copy the uninstall scripts from templates?

Personally I would suggest switching to the script from get.k3s.io:

  • It is officially supported and maintained, reducing the need for template maintenance in k3s-ansible
  • It adds automatic support for systemd and openrc
  • k3s-ansible's responsibility would be more focused on "k3s cluster installation orchestration" and the official script takes care of "node installations"

Looking forward to your/any feedback.
Sam

hdensity added a commit to hdensity/k3s-ansible that referenced this issue Apr 2, 2023
hdensity added a commit to hdensity/k3s-ansible that referenced this issue Apr 3, 2023
hdensity added a commit to hdensity/k3s-ansible that referenced this issue Apr 3, 2023
hdensity added a commit to hdensity/k3s-ansible that referenced this issue Apr 10, 2023
hdensity added a commit to hdensity/k3s-ansible that referenced this issue Jun 30, 2023
@onedr0p
Copy link
Contributor

onedr0p commented Dec 9, 2023

@timothystewart6 Here's rendered scripts for each, taken from https://github.com/k3s-io/k3s/blob/master/install.sh

/usr/local/bin/k3s-killall.sh

/usr/local/bin/k3s-killall.sh 
#!/bin/sh

[ $(id -u) -eq 0 ] || exec sudo $0 $@

for bin in /var/lib/rancher/k3s/data/**/bin/; do
    [ -d $bin ] && export PATH=$PATH:$bin:$bin/aux
done

set -x

for service in /etc/systemd/system/k3s*.service; do
    [ -s $service ] && systemctl stop $(basename $service)
done

for service in /etc/init.d/k3s*; do
    [ -x $service ] && $service stop
done

pschildren() {
    ps -e -o ppid= -o pid= | \
    sed -e 's/^\s*//g; s/\s\s*/\t/g;' | \
    grep -w "^$1" | \
    cut -f2
}

pstree() {
    for pid in $@; do
        echo $pid
        for child in $(pschildren $pid); do
            pstree $child
        done
    done
}

killtree() {
    kill -9 $(
        { set +x; } 2>/dev/null;
        pstree $@;
        set -x;
    ) 2>/dev/null
}

remove_interfaces() {
    # Delete network interface(s) that match 'master cni0'
    ip link show 2>/dev/null | grep 'master cni0' | while read ignore iface ignore; do
        iface=${iface%%@*}
        [ -z "$iface" ] || ip link delete $iface
    done

    # Delete cni related interfaces
    ip link delete cni0
    ip link delete flannel.1
    ip link delete flannel-v6.1
    ip link delete kube-ipvs0
    ip link delete flannel-wg
    ip link delete flannel-wg-v6

    # Restart tailscale
    if [ -n "$(command -v tailscale)" ]; then
        tailscale set --advertise-routes=
    fi
}

getshims() {
    ps -e -o pid= -o args= | sed -e 's/^ *//; s/\s\s*/\t/;' | grep -w 'k3s/data/[^/]*/bin/containerd-shim' | cut -f1
}

killtree $({ set +x; } 2>/dev/null; getshims; set -x)

do_unmount_and_remove() {
    set +x
    while read -r _ path _; do
        case "$path" in $1*) echo "$path" ;; esac
    done < /proc/self/mounts | sort -r | xargs -r -t -n 1 sh -c 'umount -f "$0" && rm -rf "$0"'
    set -x
}

do_unmount_and_remove '/run/k3s'
do_unmount_and_remove '/var/lib/rancher/k3s'
do_unmount_and_remove '/var/lib/kubelet/pods'
do_unmount_and_remove '/var/lib/kubelet/plugins'
do_unmount_and_remove '/run/netns/cni-'

# Remove CNI namespaces
ip netns show 2>/dev/null | grep cni- | xargs -r -t -n 1 ip netns delete

remove_interfaces

rm -rf /var/lib/cni/
iptables-save | grep -v KUBE- | grep -v CNI- | grep -iv flannel | iptables-restore
ip6tables-save | grep -v KUBE- | grep -v CNI- | grep -iv flannel | ip6tables-restore

/usr/local/bin/k3s-uninstall.sh

#!/bin/sh
set -x
[ $(id -u) -eq 0 ] || exec sudo $0 $@

/usr/local/bin/k3s-killall.sh

if command -v systemctl; then
    systemctl disable k3s
    systemctl reset-failed k3s
    systemctl daemon-reload
fi
if command -v rc-update; then
    rc-update delete k3s default
fi

rm -f /etc/systemd/system/k3s.service
rm -f /etc/systemd/system/k3s.env

remove_uninstall() {
    rm -f /usr/local/bin/k3s-uninstall.sh
}
trap remove_uninstall EXIT

if (ls /etc/systemd/system/k3s*.service || ls /etc/init.d/k3s*) >/dev/null 2>&1; then
    set +x; echo 'Additional k3s services installed, skipping uninstall of k3s'; set -x
    exit
fi

for cmd in kubectl crictl ctr; do
    if [ -L /usr/local/bin/$cmd ]; then
        rm -f /usr/local/bin/$cmd
    fi
done

rm -rf /etc/rancher/k3s
rm -rf /run/k3s
rm -rf /run/flannel
rm -rf /var/lib/rancher/k3s
rm -rf /var/lib/kubelet
rm -f /usr/local/bin/k3s
rm -f /usr/local/bin/k3s-killall.sh

if type yum >/dev/null 2>&1; then
    yum remove -y k3s-selinux
    rm -f /etc/yum.repos.d/rancher-k3s-common*.repo
elif type rpm-ostree >/dev/null 2>&1; then
    rpm-ostree uninstall k3s-selinux
    rm -f /etc/yum.repos.d/rancher-k3s-common*.repo
elif type zypper >/dev/null 2>&1; then
    uninstall_cmd="zypper remove -y k3s-selinux"
    if [ "${TRANSACTIONAL_UPDATE=false}" != "true" ] && [ -x /usr/sbin/transactional-update ]; then
        uninstall_cmd="transactional-update --no-selfupdate -d run $uninstall_cmd"
    fi
    $uninstall_cmd
    rm -f /etc/zypp/repos.d/rancher-k3s-common*.repo
fi

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants