Kubernetes Updates

Einen Kubernetes Cluster aktuell zu halten dient mehreren Zwecken. Einerseits gewährleistet es die Sicherheit des Clusters. Hinzu kommt, dass Kubernetes auch neue Features mit jedem Release mitbringt. Um hier auf der sicheren Seite zu sein, empfiehlt es sich, regelmäßig Kubernetes-Updates zu installieren.

In besonders kritischen Fällen aktualisieren wir die Cluster API automatisch auf die letzte Minor-Version, um auch unsere eigene Infrastruktur sicher zu halten. In diesem Fall können Sie den nächsten Abschnitt “Der Cluster” überspringen. Sie müssen jedoch noch die (Worker-)Nodes selbst updaten.

Bevor Sie einen Cluster upgraden, lesen Sie das Changelog der Ziel-Kubernetes-Version, und machen Sie sich mit den bevorstehenden Änderungen vertraut.

Das Tool Kubepug kann bei der Vorbereitung eines Updates helfen. Es überprüft die Kompatibilität der benutzten Ressourcen zur neuen Kubernetes-Version und warnt vor veralteten (deprecated) oder nicht mehr unterstützten Versionen.

Der Cluster

In Kubernetes teilt sich die Infrastruktur in Master- (= Kubernetes Controlplane) und (Worker)-Nodes. Bei GKS Clustern wird der Master verwaltet.

Da mehrere Versionen für den Master angeboten werden, kann man im GKS Web Interface die Version auswählen. Ein Update des Masters ist mit ein paar Mausklicks erledigt.

Als Erstes gehen Sie zu dem Cluster, für den Sie ein Update durchführen wollen.

Step 1

Klicken Sie in das Feld Control Plane und wählen Sie eine neue Version für den Master aus.

Step 2

Wir empfehlen, dabei direkt Upgrade Machine Deployments zu aktivieren, um die Worker-Nodes gleich mit upzugraden.

Step 2

Jetzt aktualisiert GKS den Master (und ggf. auch die Nodes) selbstständig und Sie sind mit diesem Schritt fertig.

Die Nodes

Sofern der Master ohne Machine Deployments aktualisiert wurde, oder ein Upgrade der GKS-Plattform selbst zu einem impliziten Upgrade des Master geführt hat (i.d.R. nur Patchlevel), müssen Sie nun noch manuell die Nodes updaten. Auch hier hilft Ihnen das GKS Web Interface.

Beachten Sie jedoch, dass bei einem Update neue Nodes erzeugt und die alten Nodes gelöscht werden. Dabei werden zwangsweise auch alle Pods neu gestartet.

Im ersten Schritt klicken Sie auf das Machine Deployment.

Step 3

Klicken Sie auf das Editier- (Bleistift-)Symbol, um die Update-Ansicht zu öffnen.

Step 4

Bei der kubelet Version wählen Sie die Version aus, die auch bei Ihrem Cluster Controlplane konfiguriert ist (in diesem Beispiel 1.23.6) und bestätigen Sie mit Save Changes.

Step 5

Nun aktualisiert GKS automatisch die Node Group auf die neue Version und Kubernetes sorgt dafür, dass Ihre Applikationen neu auf die aktualisierten Nodes verteilt werden.

Zwei-Node Cluster

Aufzupassen ist hier bei Clustern mit zwei Nodes. GKS nutzt ein rollierendes Update als Update-Strategie. Hierbei wird immer ein Node nach dem anderen getauscht. Bei einem Cluster mit zwei oder weniger Nodes bedeutet dies, dass der zuerst aktualisierte Node komplett geplant wird, noch bevor der zweite fertig ist.

Als Lösung gibt es ein recht einfaches Bash-Script, welches in einem Namespace alle Pods noch einmal neu erstellen lässt: https://github.com/truongnh1992/playing-with-istio/blob/master/upgrade-sidecar.sh

Dieses nutzen wir, nachdem das Cluster komplett aktualisiert wurde, in einem Terminal mit konfiguriertem kubectl. Im Kapitel Mit einem Cluster verbinden zeigen wir, wie Sie Ihr kubectl mit Ihrem Cluster verbinden können.

curl -o upgrade-node.sh https://raw.githubusercontent.com/truongnh1992/playing-with-istio/master/upgrade-sidecar.sh
chmod +x upgrade-node.sh
echo -e "#\!/bin/bash\n$(cat upgrade-node.sh)" > upgrade-node.sh

Nun müssen Sie nur noch dieses Script auf alle Ihre Namespaces anwenden.

kubectl get namespace
NAME              STATUS   AGE
default           Active   36m
kube-node-lease   Active   36m
kube-public       Active   36m
kube-system       Active   36m

# Wir interessieren uns für default Namespace:
./upgrade-node.sh default

Refreshing pods in all Deployments

Nun sind alle Pods sauber auf Ihre Nodes verteilt worden.