Installation eines Kubernetes-Clusters unter CentOS7


Gentian Rrafshi
DevOps Engineer
  Dieser Artikel beinhaltet eine Schritt-für-Schritt Anleitung zum Aufsetzen eines schlichten Kubernetes-Cluster unter CentOS7. Wie genau man Kubernetes mit einem bestimmten Pud-Subnet/Service-Subnet, eines eigenen Configfiles usw. initialisiert, wird in folgenden Artikeln genauer erläutert.

 


Schritt 1 – Statische IPs setzen

Für ein Kubernetes-Cluster ist es empfehlenswert, statische IPs zu setzen. Hierfür wird im Verzeichnis /etc/sysconfig/network-scripts/ die Datei ifcfg-ens33 wie folgt geändert bzw. hinzufügen:

BOOTPROTO="none"
IPADDR="<IP welche die VM haben soll>"
GATEWAY="<GATEWAY-IP>"
PREFIX="24"

Des Weiteren sollte das resolv.conf im /etc/-Verzeichnis geändert werden:

# Generated by NetworkManager
search <DOMAINNAME>
nameserver <GATEWAY-IP>

Um die Einstellungen zu übernehmen, sollte zumindest das Network neu gestartet werden. Der Befehl dafür ist:

systemctl restart network

 

Schritt 2 - Vorbereiten des Hostnames

Damit die VMs miteinander kommunizieren können, setzen wir Hostnames.
In diesem Beispiel wird der Master als master-node und die Worker als worker-node-1, worker-node-2, usw. bezeichnet.

hostnamectl set-hostname master-node
hostnamectl set-hostname worker-node-1
hostnamectl set-hostname worker-node-2

 

und

cat <<EOF>> /etc/hosts
192.168.70.100 master-node
192.168.70.101 node-1 worker-node-1
192.168.70.102 node-2 worker-node-2
EOF

 

Nun können sich alle Maschinen pingen.

 

Schritt 3 - Vorbereiten des SE-Linux

CentOS7 hat SE-Linux, welches das Kubernetes-Cluster beeinflusst. Empfehlenswert ist es, in einer Testumgebung dies erstmal auszuschalten und später, in der produktiven Umgebung, zu konfigurieren. Um SE-Linux auszuschalten reichen folgende Befehle:

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
reboot

 

 

Schritt 4 - Vorbereiten der Firewall

Sind Firewall und IP-Tables nun aktiv, sollten dementsprechend die für das Kubernetes-Cluster notwendigen Ports freigeschaltet werden. Für die Masternodes sollten folgende Ports freigegeben werden [1]:

Protocol

Port Range

Purpose

Used By

TCP

6443

Kubernetes API server

All

TCP

2379-2380

etcd server client API

kube-apiserver, etcd

TCP

10250

Kubelet API

Self, Control plane

TCP

10255

Read-Only, Kubelet API

Self, Control plane

TCP

10251

kube-scheduler

Self

TCP

10252

kube-controller-manager

Self

 

 

Weiter werden für die Workernodes folgende Ports benötigt:

Protocol

Port Range

Purpose

Used By

TCP

10250

Kubelet API

Self, Control plane

TCP

10255

Read-Only, Kubelet API

Self, Control plane

 

 

Hierfür ist in CentOS7 der Befehl

firewall-cmd --permanent --add-port=XXX

zuständig.

 

Wichtig ist, danach die Firewall neu zu laden mit

firewall-cmd –reload

 

Kubernetes selbst benötigt noch eine CNI (Container Network Interface). In diesem Falle wird Weave verwendet, für welchen ebenso Ports freigeschaltet werden sollten.

Hierfür werden TCP 6783, UDP 6783 und UDP 6784 benötigt, welche Weaves Kontroll- und Datenports sind. [2]
Diese Ports sind obligatorisch für das Kubernetes-Cluster. Es gibt noch weitere, eher optionale Ports, wie die Ports TCP 6781/6782, welche - falls Metricdaten von Weave gesammelt werden sollen - gebraucht werden.

 

Schritt 5 - Ausschalten des Swaps

Der nächste Schritt widmet sich dem Swap. Kubernetes ist ein verteiltes System, welches für den Betrieb im großen Maße ausgelegt ist. Bei einer großen Zahl von Containern mit vielen VMs ist Vorhersehbarkeit und Konsistent wünschenswert. Das Deaktivieren vom Swap ist hier der richtige Ansatz. Schließlich ist es besser, einen einzelnen Container zu eliminieren, als mehrere Container unvorhersehbar und langsam auf dem Computer laufen zu lassen.  Temporär lässt sich Swap wie folgt ausgeschalten:

swapoff -a

 

Da der Swap nach jedem Reboot neu ausgeschalten werden muss, ist es empfehlenswert Swap permanent auszuschalten:

sed -i ‘/ swap / s/^/#/’ /etc/fstab
swapoff -a

 

 

Schritt 6 - Installieren einer Container Runtime

Kubernetes selbst braucht eine Container Runtime, damit die Container gestartet werden können und somit Pods deployed werden können. Docker ist hierfür ein der präferierte Kandidat. Zur Installation von Docker, hier speziell Version 18.09.6, wird folgender Befehl ausgeführt:

yum install docker-18.09.6_ce -y
systemctl start docker
systemctl enable docker

 

 

Schritt 7 - Vorbereiten Modprobe und IP-Tables

Für ein transparentes Masquerading und VxLAN die Kommunikation zwischen Kubernetes-Pods im gesamten Cluster zu erleichtern, sollte Sysctl konfiguriert werden:

sysctl -w net.brigde.bridge-nf-call-iptables=1

 

Schritt 8 - Installieren von Kubelet, Kubectl und Kubeadm

Um ein Kubernetes-Cluster initialisieren zu können, werden Kubelet, Kubeadm und Kubectl benötigt. Es empfiehlt sich, diese drei zu installieren, auch wenn Kubelet eigentlich die anderen mit installiert. So kann garantiert werden, dass die Versionen übereinstimmen.

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install kubelet-18.2 kubeadm-18.2 kubectl-18.2 -y
systemctl start kubelet
systemctl enable kubelet

 

 

Schritt 9 - Initialisieren von Kubernetes (dieser Schritt ist nur im Master zu machen)

Zur Initialisierung wird einfach nur

Kubeadm init

eingegeben. Danach sollte ein Join-Token generiert werden. Zum Beispiel:

 

kubeadm join 192.168.20.100:6443 --token 3r0tkb.4ily1z9seitmuqr8 \
    --discovery-token-ca-cert-hash sha256:e7555f4231e9553cd4363608886f32fb016dcfa9f38bee605a72dd9c06622142

 

Weiterhin weißt Kubelet nun daraufhin, einen /.kube-Ordner zu erstellen:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

 

Zu guter Letzt benötigen wir noch ein CNI, in diesem Falle Weave:

export kubever=$(kubectl version | base64 | tr -d '\n')
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

 

  

Schritt 10 - Die Workernodes hinzufügen

Der vorher ausgegebene Jointoken wird jetzt in jedem Worker-Node ausgeführt. Z.B.

kubeadm join 192.168.20.100:6443 --token 3r0tkb.4ily1z9seitmuqr8 \
    --discovery-token-ca-cert-hash sha256:e7555f4231e9553cd4363608886f32fb016dcfa9f38bee605a72dd9c06622142

 

 

Quellen:

[1] https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports

[2] https://www.weave.works/docs/net/latest/faq/

 


 


Kubernative GmbH
Ziegelei 9
72336 Balingen

Telefon:
Mail:
Internet:

+49 7433 2781296
Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
www.kubernative.net

Ein Tochterunternehmen der
ARWINET GmbH besuchen

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.