RKE Node Provisioning

4 Nov 2020 - Lesezeit: 6 Minuten

Ich arbeite ja gern mit verteilten Systemen und auch das ganze provisionierungszeug macht mir eine Menge Spaß. Weil das aber immer Fehleranfällig ist, wenn man nicht schon in einer durchgestylen Umgebung arbeitet, mache ich mir beim Aufbau einer solchen immer ein paar wiederverwendbare Notitzen in Form eines "quick and dirty" Skriptes.

So hat es sich mittlerweile als ganz brauchbar herausgestellt die folgenden Schritte beim Setup eines RKE Nodes für die Nutzung von Kubernetes zu gehen:

install needed software

yum upgrade -y
yum install -y arptables.x86_64 ebtables.x86_64 nscd.x86_64 iptables.x86_64 nftables.x86_64 conntrack-tools.x86_64
systemctl start nscd nftables
systemctl enable nscd nftables

create rke user

useradd -m -G docker rke
passwd rke 
su - rke
mkdir $HOME/.ssh
chmod 700 $HOME/.ssh
touch $HOME/.ssh/authorized_keys
echo "PLEASE PUT YOUR SSH KEY HERE" >> /home/rke/.ssh/authorized_keys

create special users for etcd. Ensure to use the id in the cluster configuration

Dieser Schritt ist nur für Knoten notwendig die etcd hosten werden.

groupadd --gid 52034 etcd
useradd --comment "etcd service account" --uid 52034 --gid 52034 etcd

edit /etc/hosts

Sofern vorhanden richte ich immer ganz gern die wichtigsten Knoten in einem Cluster so ein, das sie auch im Falle eines DNS Ausfalls miteinander sprechen können .

cat << EOF > /etc/hosts

111.222.000.111 node1 node1.localdomain 111.222.000.112 node2 node3.localdomain 111.222.000.113 node3 node3.localdomain 127.0.0.1 localhost localhost.local

EOF

Kublet hardening

cat << EOF > /etc/sysctl.d/90-kubelet.conf
vm.overcommit_memory=1
vm.panic_on_oom=0
kernel.panic=10
kernel.panic_on_oops=1
kernel.keys.root_maxbytes=25000000
EOF

sysctl -p /etc/sysctl.d/90-kubelet.conf

needed konfiguration für k8s

Wenn man der offizielle Doku folgt, dann ist das hier gar nicht so unwichtig

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

disable IPv6

Ich brauche in den Netzwerken in denen ich arbeite kein IPv6. Daher kommt raus was keine Miete zahlt.

cat <<EOF | sudo tee /etc/sysctl.d/disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF

sudo sysctl -p -f /etc/sysctl.d/disable-ipv6.conf

set timezone

timedatectl set-timezone "Europe/Berlin"

laden der notwendigen module

Die Module werden immer wieder gern vergessen. Daher habe ich sie immer in einem meiner Skripte mit dabei.

cat <<EOF | sudo tee /etc/modules-load.d/rke.conf
ip6_udp_tunnel
ip_set
ip_set_hash_ip
ip_set_hash_net
iptable_mangle
iptable_raw
nf_conntrack
veth
vxlan
xt_comment
xt_mark
xt_multiport
xt_nat
xt_recent
xt_set
xt_statistic
xt_tcpudp
nf_conntrack
EOF

for i in $(cat /etc/modules-load.d/rke.conf)
  do 
    modprobe $i
  done

Vertrauen ist gut - Kontrolle ist besser

    for module in br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw nf_conntrack_netlink nf_conntrack  nf_defrag_ipv4 nf_nat nf_nat_ipv4 nfnetlink udp_tunnel veth vxlan x_tables xt_addrtype xt_conntrack xt_comment xt_mark xt_multiport xt_nat xt_recent xt_set  xt_statistic xt_tcpudp;
        do
            if ! lsmod | grep -q $module; then
                echo "module $module is not present";
            fi;
        done

install Docker via the rancher provided skript

Rancher hat ja schon alles für eine einfache Installation vorbereitet. Daher nutze ich auch einfach deren Skript zur Installation von Docker.

curl https://raw.githubusercontent.com/rancher/install-docker/master/19.03.12.sh | sh
systemctl enable docker
systemctl stop docker
systemctl start docker

add firewall rules

# For etcd nodes, run the following commands:
firewall-cmd --permanent --add-port=2376/tcp
firewall-cmd --permanent --add-port=2379/tcp
firewall-cmd --permanent --add-port=2380/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=9099/tcp
firewall-cmd --permanent --add-port=10250/tcp

# For control plane nodes, run the following commands:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=2376/tcp
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=9099/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10254/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=30000-32767/udp

# For worker nodes, run the following commands:
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=2376/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=9099/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10254/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=30000-32767/udp
firewall-cmd --reload

Es wurden noch keine Kommentare verfasst, sei der erste!