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 drained
kubectl 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.2
Artık işletim sistemini güncelleyebilirsiniz. Örneğin Ubuntu için aşağıdaki update komutunu kullanabilirsiniz.
apt-get update
Kullanı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.deb
Otomatik 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 kubelet
kubeadm
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 kubeadm
Gü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 kubectl
Ardından servisleri yeniden başlatın.
systemctl restart kubelet
systemctl status kubelet
Tü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.2
SchedulingDisabled 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.2
kubectl 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 drained
Package 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 kubeadm
Sı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 kubectl
kubectl
ve kubelet
servislerini yeniden başlatalım.
systemctl restart kubelet
systemctl status kubelet
Versiyon 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.1
Son 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.1
Sıradaki yazı ile eğitim serisine devam edebilirsiniz.