Azure Kubernetes Service(AKS) mimarisinde “Virtual Node” opsiyonu

Firat Yasar
Devops Türkiye☁️ 🐧 🐳 ☸️
5 min readMar 28, 2020

Kubernetes mimarisinde cluster’ınız içerisinde pod’larınız genişleyecek alan bulamadıkları zaman cluster auto scaler çalışır ve cluster’ınıza bir node daha ekler. Sonrasında Kube Scheduler schedule edilmeyi bekleyen pod’ları yeni eklenen node üzerinde schedule eder. Tabi bu işlem çok hızlı olmaz ve node’un ayağa kalkması için bir süre beklenmesi gerekir. Bazı durumlarda çok kısa süreli çalışacak pod’lar için bu süreleri beklemek çok anlamlı değildir çünkü yeni node up duruma gelene kadar belki yük ortadan kalkabilir.

İşte tam bu noktada Azure üzerinde kullanabileceğiniz hızlı ve performanslı bir seçenek mevcuttur. “Virtual Nodes” :)

Şimdi biraz daha bu virtual nodes opsiyonunu açıklayalım.

Azure üzerinde Azure Container Instance(ACI) isminde container’larınızı çalıştırabileceğiniz, shared bir ortam kullanan ve saniye bazında ücretlendirildiğiniz bir servis mevcuttur. Bahsi geçen “Virtual nodes” özelliği de bu servis ile Azure Kubernetes Service(AKS)’in birbirlerine entegre edilmesi ile oluşturulmuştur.

Normalde ACI kullandığınızda container’ınız public bir ip alarak shared ortamdaki bir host üzerinde çalışmaya başlar. Fakat ACI’yi virtual node olarak kullandığınızda durum birazdaha farklı bir mimariye evrilir. Virtual node üzerinde çalışan pod’lar bu farklı mimari ile sizin belirleyeceğiniz private IP subnetinden IP alarak cluster ile güvenli bir biçimde iletişim kurarlar.

Shared bir platform olan Azure container instance üzerinde çalıştırdığınız pod’lar için per/second şeklinde ücretlendirilirler.

Eğer pod’larınız çok kısa süreli genişlemeye ihtiyaç duyuyorsa, Azure Container Instance üzerinde horizontal olarak genişlemesi fiziksel bir node ayağa kaldırmaktan daha kullanışlıdır. Ya da kısa bir test işleminiz için yeni bir node eklemek istemiyorsanız, yine virtual node özelliğinden faydalanmak fiziksek bir node eklemekten daha efektif olacaktır.

Not: Şu anda Azure platformu üzerinde kullanabileceğimiz bu virtual node özelliği sadece Linux tabanlı pod ve node’lar için desteklenmektedir.

Virtual Nodes özelliği nasıl entekre edilir?

Virtual nodes özelliğini gerek portal üzerinden gerekse komut satırı ile entegre etmek oldukça kolaydır. Portal üzerinde aşağıdaki gibi “Virtual Nodes” opsiyonunu enable olarak işaretlemeniz yeterli olacaktır.

Azure Kubernetes Service(AKS) ile cluster provision etmek istediğinizde network opsiyonu olarak iki tip network seçebilirsiniz. Bunlar basic(Kubenet) ve advanced(cni) network seçenekleridir. En temel farkları advanced network pod’lar için node’ların bulunduğu ip havuzundan ip ataması yaparken, basic network seçeneği her nod üzerinde pod’lar için ayrı bir IP network’ü yapılandırır.

Virtual node yapılandırılacak olan AKS cluster’ın advanced network olarak konfigüre edilmiş olması gerekir. Böylece virtual nodes kendisine node network içerisinde bir subnet oluşturup, üzerindeki pod’lara bu subnetten ip ataması yapar hale gelir. Subnet sahip olduğu delegated permission ile Azure resource’ları ve AKS cluster arasındaki iletişimi sağlar. AKS cluster’ı oluştururken virtual nodes seçeneğini etkinleştirdiğinizde bu delegasyon işlemleri otomatik olarak tanımlanır.

Virtual node seçeneği etkinleştirildiğinde, network konfigürasyonu adımında artık basic network seçeneğinin seçilemediği görülmektedir. Şekilde işaretlediğim yerde bunun virtual node seçeneğinden kaynaklandığı da belirtilmektedir.

Cluster kurulumunun ardından ilk kontroller yapıldığında network üzerinde virtual node için bir subnet oluşturulduğu görünür. Ayrıca aşağıdaki şekilde subnetin delegate edildiği servisin Azure Container Instance(ACI) olduğunu da görebilirsiniz.

Bu işlemin ardından kubernetes cluster’a bağlanıp node’ları listelediğinizde virtual node’un listelendiğini görebilirsiniz.

Virtual node entegrasyonu bu akdar basit. :) Şimdi bir adet test pod’u virtual node üzerinde schedule edelim.

Schedule işlemi

Test işlemi olarak aşağıdaki örnek yaml’ı kullanarak virtual node’un üzerinde bir pod schedule edebiliriz.

Resimde işaretlediğim kısımlar pod’un virtual node üzerinde schedule olabilmesi için gerekli node selector ve tolerations ayarlarıdır. Eğer cluster içerisinde bir pod’u direk virtual node üzerinde schedule etmek isterseniz, siz de kendi pod’larınız için bu ayarları yapılandırabilirsiniz.

Pod’u deploy ettikten sonra aşağıdaki komut ile pod’un schedule işlemine ilişkin durumunu görüntüleyebilirsiniz.

Kısa süre içinde pod aşağıdaki gibi running durumuna geçecektir. Burada dikkat etmenizi istediğim kısım, ip adresinin virtual node’un kullanması için oluşturulan subnetten alındığıdır ve bu pod artık per/saniye olarak çalıştığı süre boyunca ücretlendirilecektir.

Platform üzerinden Azure container instance(ACI) kontrol edildiğinde, ilgili pod’u çalıştıracak olan ACI resource’unun deploy edildiğini görebilirsiniz.

Oluşturulan container instance resoure’unun overview kısmı bize çalıştırılan pod hakkında ayrıntılı bilgi verecektir. Örneğin aşağıdaki resimde alınan IP’nin private olduğu ve pod içerisinde bir adet container çalıştığını görebilirsiniz.

Uygulamayı örnek olarak internete açmak için, Kubernetes cluster üzerinde loadbalancer tipinde bir service oluşturabiliriz. Burada göstermek istediğim service Kubernetes üzerinde internetten expose edilirken, arkasındaki podların sorunsuz şekilde Azure Container Instance(ACI) üzerinde çalıştığı ve erişilebilir olduğudur.

İlgili IP’ye browser üzerinden gidildiğinde virtual cluster üzerindeki uygulamanın servis arkasında sorunsuz çalıştığı görülmektedir.

Peki virtual node’un limitasyonları var mı?

Mimari bakımından bize çok esneklik sağlasada şu anda bazı limitasyonları bulunuyor. Ancak bu limitasyonlar hızlı şekilde ortadan kaldırılıyor diyebilirim. Özellikle dikkat edilmesi gereken durumlar;

  • Azure AD service principal authentication desteklenmiyor. Bu yüzden önerilen service principal’ların cluster içerisinde secret olarak saklanması.
  • Network konfigürasyonunda peering, Kubernetes network policy ve internete yapılan outbound trafik üzerinde uygulanmış nsg’ler desteklenmiyor.
  • Init container kullanılan pod’lar desteklenmiyor.
  • Host Alias desteklenmiyor.
  • DaemonSet’ler virtual node üzerine pod olarak deploy edilemiyor.
  • Windows Server node’lar virtual node ile birlikte kullanılamıyor.

Kısa bir özetlersek:

Azure Container Instance(ACI) resource’u sayesinde ek bir infrastructure kaynağına ihtiyaç duymadan container’larınızı AKS cluster’a deploy edebilirsiniz. Üstelik deploy ettiğiniz bu virtual node private network’ünüz üzerindeki özel bir subnet’ten pod’larınıza ip ataması yapar. Bu sayede de AKS cluster ile ACI arasındaki iletişim güvenli bir biçimde sağlanmış olur. Bu mimaride virtual node üzerinde çalışan node’larınız per/second olarak ücretlendirilir.

Bir sonraki bölümde görüşmek üzere.

Kaynak: https://docs.microsoft.com/bs-latn-ba/azure/aks/virtual-nodes-portal

Kaynak 2: https://github.com/Azure-Samples/virtual-node-autoscale

--

--