Kubernetes Cluster Nasıl Güncellenir?
5 min read

Kubernetes Cluster Nasıl Güncellenir?

Kubernetes cluster ve bileşenlerin master ve worker node'larda ayrı ayrı güncelleyebilirsiniz.
Kubernetes Cluster Nasıl Güncellenir?
Photo by Caleb / Unsplash

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.

Kubeadm İle Kubernetes Cluster Kurulumu
Kubeadm, Kubernetes clusterını kolayca oluşturmak ve yönetmek için kullanılan bir araçtır.

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.

Kubernetes Cluster, Node ve Bileşenler
Kubernetes, Control Plane ve Worker olmak üzere iki ana parçadan oluşur. Her biri ise kendine özgü birçok bileşen içerir.