Kubernetes Cluster Nasıl Güncellenir?
Kubernetes cluster güncellemesi, yeni özelliklerin eklenmesi, hataların düzeltilmesi ve güvenlik yamalarının uygulanması gibi nedenlerle gerekebilir. Kubernetes kümenizi güncellemek için aşağıdaki adımları sırasıyla izleyebilirsiniz.
Bu yazımızda Kubernetes cluster nasıl güncellenir gösterebilmek için örnek bir cluster'ı 1.22'den 1.23'e yükselteceğiz. Öncesindesizde hızlı, basit ve temiz bir Kubernetes ortamı kurulumu için şu makaleye başvurabilirsiniz.
Güncelleme işlemine başlamadan önce şu iki uyarıyı dikkate almalısınız:
- Kubernetes güncelleme işlemi workload'ları değil, yalnızca Kubernetes ile ilgili bileşenleri etkiler. Ancak öncesinde veritabanında yer alanlar gibi önemli verilerinizi yedeklemeniz önemlidir.
- Sunucuda swap devre dışı bırakılmalıdır.
Hazırlıklar tamamlandıktan sonra başlayabiliriz.
1. Master Node Upgrade
İlk olarak master node'u drain etmemiz gerekiyor. Drain işlemi, bir node üzerinde çalışan tüm pod'ları başka node'lara dağıtarak ve node'un etkinliğini durdurarak node'u boşaltır.
$ kubectl drain master --ignore-daemonsets
node/master already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-proxy-lfplf, kube-system/weave-net-fv7sn
evicting pod kube-system/coredns-25433705f-ab2v8
evicting pod kube-system/coredns-25433705f-33fap
pod/coredns-25433705f-ab2v8 evicted
pod/coredns-25433705f-33fap evicted
node/master drainedkubectl drain komutunu kullanırken, Kubernetes kümesi, ayrılmak üzere olan pod'ları başka node'lara dağıtarak hizmet kesintisi yaşanmamasını sağlamaya çalışır. Bu komutu kullanırken bazı seçenekler belirleyebilirsiniz, örneğin, --ignore-daemonsets seçeneğiyle DaemonSet pod'ları göz ardı edebilirsiniz.
--ignore-daemonsets kullanmazsanız Daemonset pod'ları sürekli yeniden node üzerinde oluşturulacağı için drain işlemi tamamlanmayacaktır.Drain işlemi başarıyla tamamlandıktan sonra, SchedulingDisabled olduğundan emin olmak için node'un durumunu kontrol edebilirsiniz.Bu, o node'da hiçbir pod'un oluşturulmayacağı anlamına gelir.
#kubectl get nodes
NAME STATUS ROLES VERSION
master Ready,SchedulingDisabled control-plane,master v1.22.2
worker Ready <none> v1.22.2Artık işletim sistemini güncelleyebilirsiniz. Örneğin Ubuntu için aşağıdaki update komutunu kullanabilirsiniz.
apt-get updateKullanılabilir kubeadm paketleri için paket yöneticisini arayın ve ihtiyacınız olan sürüme ilişkin sonuçları filtrelemek için grep'i kullanın. Bizim senaryomuzda güncelleyeceğimiz versiyon 1.23'tür.
apt-cache show kubeadm | grep 1.23Çıktı aşağıdakine benzer olmalıdır:
Version: 1.23.1–00
Filename: pool/kubeadm_1.23.1–00_amd64_6bc970cf9bf5349ba18526f77c6ac16caf2a52b6a7b0e40753541ebef52ad99f.deb
Version: 1.23.0–00
Filename: pool/kubeadm_1.23.0–00_amd64_36016a07eb5c2bfae656cfee1b3848930757d201b474fea1cce1ecd507b94f0b.debOtomatik olarak kurulmalarını, yükseltilmelerini veya kaldırılmalarını önlemek için kubectl ve kubelet paketlerini hold komutu ile işaretlemeliyiz. Bu önlem amaçlı bir adımdır.
apt-mark hold kubectl kubeletkubeadm paketini ise unhold ile serbest bıraktıktan sonra yükseltin ve tekrar hold komutu ile işaretleyin.
apt-mark unhold kubeadm
apt-get install kubeadm=1.23.1–00
apt-mark hold kubeadmGüncellendiğinden emin olmak için kubeadm versiyonunu kontrol edin.
kubeadm version
Diğer hangi bileşenlerin yükseltilmesi gerektiğini görmek için kubeadm upgrade plan komutunun çıktısını kontrol edin.
kubeadm upgrade plan
Şimdi plan komutunu çalıştırın ve başarıyla tamamlandığından emin olun.
kubeadm upgrade apply v1.23.1
Son olarak kubectl ve kubelet bileşenlerini güncelleyelim.
apt-mark unhold kubelet kubectl
apt-get install kubelet=1.23.1-00 kubectl=1.23.1-00
apt-mark hold kubelet kubectlArdından servisleri yeniden başlatın.
systemctl restart kubelet
systemctl status kubeletTüm bileşenlerin güncellendiğinden emin olmak için tekrar plan komutuna bakabilirsiniz.
kubeadm upgrade plan
Node versiyonlarını tekrar kontrol ettiğimizde yeni versiyonu göreceğiz.
$ kubectl get nodes
NAME STATUS ROLES VERSION
master Ready,SchedulingDisabled control-plane,master v1.23.1
worker Ready <none> v1.22.2SchedulingDisabled durumunu kaldırmak için uncordon komutunu göndermemiz gerekiyor. Çünkü drain komutu aynı zamanda cordon komutunu da otomatik olarak uygular.
$ kubectl uncordon master
$ kubectl get nodes
NAME STATUS ROLES VERSION
master Ready control-plane,master v1.23.1
worker Ready <none> v1.22.2kubectl cordon komutu, bir Kubernetes node'unu geçici olarak korumaya alır. Bu komut kullanıldığında, Kubernetes control plane, belirtilen node'a yeni pod'lar yerleştirmez.Master node ile yapacağımız işlemler tamamlandı. Artık worker node'a geçebiliriz.
1. Worker Node Upgrade
Benzer bir şekilde yine drain işlemi ile başlıyoruz. Ekstra olarak --force parametresi ile drain işlemini kesinleştirebilirsiniz.
$ kubectl drain worker --ignore-daemonsets --force
node/test-worker drainedPackage manager ve ardından kubeadm'i güncelleyelim.
apt-get update
apt-mark unhold kubeadm
apt-get install kubeadm=1.23.1-00
apt-mark hold kubeadmSırada kubectl ve kubelet güncellemesi var.
apt-mark unhold kubelet kubectl
apt-get install kubelet=1.23.1-00 kubectl=1.23.1-00
apt-mark unhold kubelet kubectlkubectl ve kubelet servislerini yeniden başlatalım.
systemctl restart kubelet
systemctl status kubeletVersiyon kontrolü için node listesine göz attığımızda yeni versiyonu görmeliyiz.
$ kubectl get nodes
NAME STATUS ROLES VERSION
master Ready control-plane,master v1.23.1
worker Ready,SchedulingDisabled <none> v1.23.1Son olarak worker node'u da uncordon komutuyla aktif hale getirebilirsiniz.
kubectl uncordon worker
kubectl get nodes
NAME STATUS ROLES VERSION
master Ready control-plane,master v1.23.1
worker Ready <none> v1.23.1Sıradaki yazı ile eğitim serisine devam edebilirsiniz.
