{"id":48,"date":"2021-08-20T10:37:02","date_gmt":"2021-08-20T08:37:02","guid":{"rendered":"https:\/\/blog.kihr.online\/?p=48"},"modified":"2024-01-22T20:12:33","modified_gmt":"2024-01-22T19:12:33","slug":"upgrade-kubernetes-cluster-auf-neues-release","status":"publish","type":"post","link":"https:\/\/blog.kihr.online\/?p=48","title":{"rendered":"Upgrade Kubernetes Cluster auf neues Release"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Lesedauer<\/span> <span class=\"rt-time\"> 2<\/span> <span class=\"rt-label rt-postfix\">Minuten<\/span><\/span>\n<p class=\"wp-block-paragraph\">Da mit der Zeit jedes System zumindest sicherheitsrelevante Updates ben\u00f6tigt, und auch Kubernetes regelm\u00e4ssig neue Releases ver\u00f6ffentlicht, kommt irgandwann der Zeitpunkt an dem man auch das Kubernetes einmal updaten muss.<br>Hierbei ist zun\u00e4chst zu beachten, dass ein upgarde immer nur von einem Major Release zum n\u00e4chsten m\u00f6glich ist. Der kubeadm upgrade auf einem Master\/Backplane node wird das upgrade verweigern, wenn es \u00fcber mehr als ein Major relese geht.<br>Ich zeige hier einmal das upgrade von einer Version 1.20.x auf 1.21.4. Es kann aber f\u00fcr jedes weitere Release auch verwendet werden.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Ab dem Release 1.25.x ben\u00f6tigt man allerdings die neuen Repos von Kubernetes. Diese f\u00fcgt man mit folgenden Befehlen hinzu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee -a \/etc\/apt\/sources.list.d\/kubernetes.list &gt; \/dev\/null &lt;&lt;EOT<br>deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.25\/deb\/ \/<br>deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.26\/deb\/ \/<br>deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.27\/deb\/ \/<br>deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.28\/deb\/ \/<br>deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.29\/deb\/ \/<br>EOT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann ben\u00f6tigt man noch den public key f\u00fcr das repo. Dieser ist f\u00fcr aller Versionen gleich.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.28\/deb\/Release.key | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nach einem apt update stehen die Pakete zur Verf\u00fcgung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Upgrade des\/der Masternodes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Man sollte mit dem, oder wenn man mehrere davon hat, einem Masternode beginnen. Das vorher alle relevanten Daten gesichert werden, sollte selbstverst\u00e4ndlich sein. Alle Schritte m\u00fcssen per sudo oder als root ausgef\u00fchrt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zun\u00e4chst installiert man die neue kubeadm version<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><br>~# apt install -y --allow-change-held-packages kubeadm=1.21.1-*<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach kurz checken, ob man die richtige Version hat:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~# kubeadm version\nkubeadm version: &amp;version.Info{Major:\"1\", Minor:\"21\", GitVersion:\"v1.21.1\", GitCommit:\"5e58841cce77d4bc13713ad2b91fa0d961e69192\", GitTreeState:\"clean\", BuildDate:\"2021-05-12T14:17:27Z\", GoVersion:\"go1.16.4\", Compiler:\"gc\", Platform:\"linux\/amd64\"}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hat man die richtige Version, empfielt sich zun\u00e4chst einen check auszuf\u00fchren, ob der upgrade m\u00f6glich ist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n~# kubeadm upgrade plan<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Es kann vorkommen, das es noch einen Hinweis gibt, dass man daf\u00fcr ein neueres Minor Release f\u00fcr das Upgrade ben\u00f6tigt. Hier war das 1.21.4. Also dann:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><br>~# apt install -y --allow-change-held-packages kubeadm=1.21.4-*<br>~# kubeadm version<br>kubeadm version: &amp;version.Info{Major:\"1\", Minor:\"21\", GitVersion:\"v1.21.4\", GitCommit:\"3cce4a82b44f032d0cd1a1790e6d2f5a55d20aae\", GitTreeState:\"clean\", BuildDate:\"2021-08-11T18:14:53Z\", GoVersion:\"go1.16.7\", Compiler:\"gc\", Platform:\"linux\/amd64\"}<br>~# kubeadm upgrade plan<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn dann alles als OK angezeigt wird, k\u00f6nnen wir das update ausf\u00fchren. Das erforderliche Kommando wird in der Ausgabe des Plans angezeigt<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~# kubeadm upgrade apply v1.21.4<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach erfolgt der Upgrade. Dieser kann eine Weile dauern. Hier bei werden der API Sever, Kontroller Manager, etcd, kube scheduler und eine ganhze Reihe Zertifikate upgedated. Am Ende erh\u00e4lt man, hoffentlich, die Nachricht, dass alles Erfolgreich war und die Aufforderung nun auch die kubelets upzugraden. Wir tun das dann auch gleich f\u00fcr kubectl.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hat man mehrere Masternodes, sollte man den Masternode auf dem man arbeitet jetzt evakuieren. Die kubectl Kommandos sollten im Userspace ausgef\u00fchrt werden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~$ kubectl drain &lt;node-to-drain&gt; --ignore-daemonsets<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hierbei ersetzten wir den &lt;node-to-drain&gt; mit dem Nodenamen, den wir aus <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~$ kubectl get nodes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">erhalten. Jetzt f\u00fchren wir das update aus<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~$ apt install -y --allow-change-held-packages kubelet=1.21.4-* kubectl=1.21.4-*<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach m\u00fcssen wir kubelet einmal restarten<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~# systemctl daemon-reload\n~# systemctl restart kubelet<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hatten wir den Node evakuiert, k\u00f6nnen wir ihn jetzt wieder frei geben<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~$ kubectl uncordon &lt;node-to-uncordon&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach k\u00f6nnen wir, wenn wir mehrere Masternodes haben, das ganze auch f\u00fcr die anderen Masternodes ausf\u00fchren. Hierbei wir allerdings kubeadm upgrade plan durch kubeadm upgrade node ersetzt und kubeadm upgrade apply ist nicht notwendig.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Upgrade worker nodes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hier sollten wir auch zun\u00e4chst den Workernode evakuieren. Wir verenden das bekannt Kommando auf dem Masternode<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n~$ kubectl drain &lt;node-to-drain&gt; --ignore-daemonsets<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach auch hier das update:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~# apt install -y --allow-change-held-packages kubeadm=1.21.4-*<br>~# kubeadm upgrade node<br>~# apt install -y --allow-change-held-packages kubelet=1.21.4-* kubectl=1.21.4-*<br>~# systemctl daemon-reload<br>~# systemctl restart kubelet<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und danach auf dem Masternode den Workernode wieder frei geben<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n~$ kubectl uncordon &lt;node-to-uncordon&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das wiederholt man f\u00fcr alle Workernodes. Das ganze kann auch parallel auf mehreren ausgef\u00fchrt werden, wobei man darauf achten muss, die notwendige Kapazit\u00e4t f\u00fcr den Workload im Cluster nicht zu unterschreiten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Lesedauer<\/span> <span class=\"rt-time\"> 2<\/span> <span class=\"rt-label rt-postfix\">Minuten<\/span><\/span>Da mit der Zeit jedes System zumindest sicherheitsrelevante Updates ben\u00f6tigt, und auch Kubernetes regelm\u00e4ssig neue Releases ver\u00f6ffentlicht, kommt irgandwann der Zeitpunkt an dem man auch das Kubernetes einmal updaten muss.Hierbei ist zun\u00e4chst zu beachten, dass ein upgarde immer nur von einem Major Release zum n\u00e4chsten m\u00f6glich ist. Der kubeadm upgrade auf einem Master\/Backplane node wird [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"on","ocean_gallery_id":[],"footnotes":""},"categories":[28,29],"tags":[30,31],"class_list":["post-48","post","type-post","status-publish","format-standard","hentry","category-kubernetes","category-upgrade","tag-kubernetes","tag-upgrade","entry"],"_links":{"self":[{"href":"https:\/\/blog.kihr.online\/index.php?rest_route=\/wp\/v2\/posts\/48","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.kihr.online\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kihr.online\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kihr.online\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kihr.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=48"}],"version-history":[{"count":5,"href":"https:\/\/blog.kihr.online\/index.php?rest_route=\/wp\/v2\/posts\/48\/revisions"}],"predecessor-version":[{"id":70,"href":"https:\/\/blog.kihr.online\/index.php?rest_route=\/wp\/v2\/posts\/48\/revisions\/70"}],"wp:attachment":[{"href":"https:\/\/blog.kihr.online\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=48"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kihr.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=48"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kihr.online\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=48"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}