![]() 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. |
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
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.
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
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.
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
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
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
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
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"
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:
[2] https://www.weave.works/docs/net/latest/faq/
Kubernative GmbH |
|
Telefon: |
+49 7433 2781296 |
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.