Serdar Çetin
Sahibinden Technology
5 min readJul 6, 2021

--

Redhat OpenShift SDN‘de yaşayan bir Pod‘un Citrix CIC ve Netscaler Load Balancer desteğiyle Internet dünyasıyla buluşması.

Günümüzde sanallaştırma; Podlar, Container’lar gibi SDN (Software Defined Networks) networklerinde oluşturulan micro servisler, sanal applicationlar gibi yapıları üzerinde barındıracak hale gelmiştir.

Openshift de Redhat tarafından kubernetes üzerine kurulmuş bir container platformudur, genel olarak SDN network yapısı ile çalışır ve üzerinde tanımlanan birazdan altta detaylı olarak anlatacağım pod, servis, route gibi anlık olarak sürekli silinip yeniden yaratılan sanal yapıları, gerçek local ve internet networkleri ile konuşturma ihtiyacı barındırır.

SDN networkünde yaşayan bu yapıları local-internet networkleri ile iletişime geçirip hizmet verebilir duruma getirmek ve büyük kapasiteli kullanıcı isteklerini karşılayabilmek için load balancer‘lar kullanıyoruz, bunlardan en etkilisi ise citrix netscaler ancak bu durumda da şöyle bir problem ile karşılaşıyoruz; SDN networkünde bulunan containerları, vlan-local networklerde bulunan SDN networkünü tanımayan ya da iletişim imkanı olmayan; olsa da SDN networkünde container platformunda sürekli oluşturulup ip hostname vb gibi tanımları sürekli değişen yapıların configlerini netscaler’da nasıl anlık olarak güncel tutabileceğiz? Burada devreye citrix‘in geliştirdiği CIC (citrix ingress controller) giriyor.

CIC, SDN networkünde yaşayan bir Operator-Pod yapısı kurarak bu aradaki iletişimi sağlaması ve config management yapması için tasarlamış.

CIC‘i Openshift ortamında kurmak için birkaç tane yöntemimiz var. Openshift içerisindeki Operator Hub, Helm ya da Yaml config dosyaları bunlardan bazıları. Operator Hub, openshift ile entegre çalışabilen ürünlerin bir listesini içeren ve sürekli güncellenen bir repository olarak düşünülebilir.

Ben CIC kurmak için Helm kullanacağım, öncelikle Openshift clusterımıza bağlanalım. Bunun için Openshift’in “oc” komutunu kullanıyoruz.

oc login -u kubeadmin -p MMTUc-TnXjo-NFyh3-aeWmC https://api.ocp4.example.com:6443

Sonrasında Helm repoya citrix ingress controller’ı nerede bulacağını söyleyelim.

helm repo add citrix https://citrix.github.io/citrix-helm-charts/

Netscaler login credential’larını alttaki openshift komutu ile tanımlamamız gerekiyor ki cic pod‘u Openshift cluster’ını takip ederek netscaler‘a ilgili configleri otomatik olarak gönderebilsin.

oc create secret generic nslogin — from-literal=username=’cic’ — from-literal=password=’mypassword’

Netscaler‘da kullanıcı oluşturmak ve gerekli hakları vermek için alttaki komutları çalıştırıyoruz.

add system user cic mypassword
add cmdpolicy cic-policy ALLOW “(^\S+\s+cs\s+\S+)|(^\S+\s+lb\s+\S+)|(^\S+\s+service\s+\S+)|(^\S+\s+servicegroup\s+\S+)|(^stat\s+system)|(^show\s+ha)|(^\S+\s+ssl\s+certKey)|(^\S+\s+ssl)|(^\S+\s+route)|(^\S+\s+monitor)|(^show\s+ns\s+ip)|(^\S+\s+system\s+file)|(^\S+\s+ns\s+feature)”
bind system user cic cic-policy 0

values.yaml dosyası bizim Openshift içinde kurduğumuz cic operator’ünün hangi netscaler ile hangi port authentication ile bağlantı kuracağını, config edeceğini ve otomatik olarak kurulan tanımlara nasıl bir prefix verileceğini, cic imajının nereden alınacağını vb. gibi detayları söyleyen config dosyamızdır.

Ve CIC operatörünü kuruyoruz.

helm install “citrix” citrix/citrix-cloud-native -f values.yaml

Artık cic-operator‘u kuruldu ve OpenShift Cluster’ını dinleyecek olan cic podunu oluşturdu.

OpenShift SDN network’ünde alttaki network ip bloklarını default olarak kullanıyor.

OpenShift kurulumu yapılmadan önce SDN config ile bu tanımlar, mevcut local networkler ile çakışmayacak şekilde değiştiriliyor.

oc get network/cluster -o yaml

komutu ile SDN tanımlamaları görülebilir.

Service tanımlamaları için: 172.30.0.0/16

Pod Network’ü için: 10.128.0.0/14

Artık basit bir uygulama kurarak bu uygulamaya ait SDN‘de bulunan pod, service tanımları ile Cluster’ın dış dünya ile iletişimini sağlayan route tanımlarını yapabilir ve uygulamamızın internet dünyasından erişilebilir duruma gelmesini sağlayabiliriz.

Openshift Service; podlar arasında internal software load balancing için Netfilter kullanırken OpenShift Route ise SDN dışındaki network ile konuşurken external software loadbalancing için HAproxy kullanır.

Alttaki komutlar ile basit bir “Hello Openshift” web uygulaması kuruyoruz.

oc create deployment example — image=openshift/hello-openshift — replicas=2
oc expose deployment example — port 80 — target-port 8080
oc expose service example — name unsecured-example-route — hostname my-unsecured-example.com — path=”/” — port 80

Uygulamamız 2 replica pod ile çalışacak .

Example isimli servisimizde yer alan podların HTTP 8080 portunu dinleyip internal software load balancer ile service tanımımıza aktaracak,

my-unsecuredroute-example.com route‘u ile HTTP 80 portunu dinleyip HAproxy olarak external load balancing yaparak podlarımızı client’lara cevap verir duruma getirecek.

Artık CIC netscaler’ımızı otomatik olarak güncel tutmaya, virtual service content switch‘den, service pod tanımlarına, hatta network route tanımlarını bizim için netscaler üzerinde yaparak Openshift içerisinde çalışan Podlarımızı, internet üzerinden cevap verebilir duruma getirecek.

Default olarak da cic operatörünü kurarken values.yaml dosyasında belirttiğimiz gibi netscaler’da her oluşturduğu entity’ye ose (OpenShift-Entity) prefix’i ekleyerek bize tüm yaptığı değişiklikleri rahat bir şekilde görebilme imkanı sağlayacak.

entityPrefix: ose

Bakalım uygulamamız çalışıyor mu?

Voila !!

Artık Openshift tarafında yaptığımız tüm tanımlar ve oluşturulan kaldırılan podlar, servisler, routelar otomatik olarak netscaler’a gönderilecek ve developerlarımız, test ekiplerimiz ya da tüm mühendislik ekiplerimiz Openshift üzerinde oluşturdukları projeleri live olarak netscaler üzerinden test edebileceklerdir.

Openshift ile Netscaler’ın fonksiyonlarını birleştirerek openshift HAproxy‘in infra node’lar üzerinden sağladığı SDN-local-internet erişimini CIC ve Netscaler kullanarak tüm node’lara yaymış ve network erişim patikasını kısaltmış oluyoruz.

Böylece sanallaştırma içerisinde, sanal bir networkte bulunan sanal uygulamalarımızı, local network veya internet üzerinden hizmet verebilir duruma getirmiş olduk.

Teşekkürler.

--

--