Kubernetes Configmap Oluşturma ve Kullanma

Merhabalar, bu yazımızda sizlere “ConfigMap Nedir? Neden Kullanılır ve Nasıl Oluşturulur?” sorularının cevabını vermeye çalışacağız.

Configmap, uygulamalarımızda kullandığımız konfigurasyonların dışarıda bir noktaya konularak tek noktadan kolayca yönetilmesine olanak sağlayan bir kubernetes objesidir.

Günümüzde uygulamaların hemen hepsi belirli değişkenleri kullanmaya ihtiyaç duyar. Bu değişkenlerin doğrudan kod içine yazıldığına ise sıklıkla tanıklık ederiz. Fakat bu, bir değişiklik yapılması gerektiğinde oldukça fazla efor gerektirecektir. Üstelik güvenli de değildir. Değişiklikleri config dosyalarında yapıyor olmak, değişkeni kullandığımız tüm noktalarda tek tek düzenleme yapma külfetinden ve değiştirilmeyi unutulmuş değerler görmekten kurtarır.

Kubernetes ConfigMap’lerimizi farklı şekillerde kullanabiliyoruz.

1- Environment Variables (Ortam değişkeni olarak)

2- Configuration Files (Volume Olarak)

1.Environment Variables

Yaratılan her container’ın kendine ait bir enviroment’ı mevcut olduğundan, Dockerfile içinde ya da deployment-pod yarattığımız yaml file’larımızda bu container’ların ortam değişkenlerini değiştirebiliyoruz.

Bu örnekte container’larımızın ortam değişkenlerini bir configmap’ten okumasını sağlayacağız.

Hızlıca, ortam değişkenlerini içine koyabileceğimiz bir configmap yaratalım.

Configmap yaratmanın birden fazla yöntemi var, bunlara aşağıdaki linkten göz atabilirsiniz.

Örneğin basit birkaç key value pairs’dan oluşan yapılarımız için –from-literal parametresini kullanabiliriz.

kubectl create configmap my-config-map  - from-literal=car.brand=BMW

İçerisinde car.brand key’ine karşılık BMW bulunduran basit bir configmap yarattık.

podwithenv.yaml
kubectl apply -f https://raw.githubusercontent.com/DogusTeknoloji/K8SConfigMapExamples/master/podwithenv.yaml

komutu ile podumuzu oluşturalım.

Yukarıdaki örnek ile ortam değişkenimizi bir configmap üzerinden okuyarak podumuzu oluşturmuş olduk.

Şimdi oluşan bu podun loguna bakarak değişkenlerimizi kontrol edelim.

kubectl logs evironmentvariables-pod | grep BRAND

Bu şekilde hem statik verdiğimiz ortam değişkenini hem de configmap üzerinden okuduğumuz değişkeni görebildik.

Burada göz önünde bulundurmamız gereken birkaç unsur var.

Bildiğiniz gibi docker imajı yaratılırken Dockerfile içinde ortam değişkenini set edebiliyoruz ya da base imaj içinde set edilmiş enviroment variable’lar olabilir. Yukarıdaki yaml file’ımızda mevcutta bulunan bir env key’i kullanarak değer ataması yaparsak eski değerin değişmesine sebep olacaktır. Bu da imajınızın ayağa kalkmasına ya da doğru çalışmasına engel olabilir.

Bir diğer konu ise podumuz ayağa kalktığı takdirde değerleri configmap üzerinden değiştirmemiz mümkün değildir. Sıklıkla değiştirme ihtiyacı duyulmayan değerler için env var’ları kullanabiliriz.

NOT: Container ayağa kalkmadan önce configmap’imiz aynı namespace altında mevcut olmalıdır.

Benzer bir yöntem ile tüm key value eşlerimizi tek tek tanım yapmadan podumuzun içine alabiliriz.

Tekrar bir configmap yaratalım.

my-config-map-1.yaml
kubectl apply -f https://raw.githubusercontent.com/DogusTeknoloji/K8SConfigMapExamples/master/my-config-map-1.yaml

ile configmap’imizi oluşturduk.

environmentvariables-pod-1.yaml
kubectl apply -f https://raw.githubusercontent.com/DogusTeknoloji/K8SConfigMapExamples/master/environmentvariables-pod-1.yaml

ile podumuzu oluşturalım ve aşağıdaki komutla loglara bakalım.

kubectl logs pod/environmentvariables-pod-1 | grep

Bir diğer yaklaşımda terminallerde kullandığımız standart değişkenler olarak da set edebiliriz.

variables-pod.yaml
kubectl apply -f https://raw.githubusercontent.com/DogusTeknoloji/K8SConfigMapExamples/master/variables-pod.yaml

komutu ile pod oluşturulur.

Değişkenlerin oluşup oluşmadığı aşağıdaki komut ile kontrol edilir.

kubectl logs pod/variables-pod | grep -w 'BOEING\|BMW'

BOEING BMW şeklinde çıktımızı görüyor olacağız

2.Configuration Files

Bir diğer yaklaşımımız gerçekleştirdiğimiz örneklerimize göre daha sık kullandığımız configmap’lerin volume olarak podlara gösterilmesidir.

Configmap yaratırken — from-file parametresi ile bir folder altındaki tüm conf dosyalarımızı tek bir configmap içine alabiliyoruz.

Aşağıda bulunan 2 adet conf dosyamızı kullanarak bir config map oluşturuyoruz.

kubectl create configmap multiconffile-configmap --from-file=config-files/

Configmap oluşturuldu, şimdi içeriğine bir göz atalım.

kubectl get cm/multiconffile-configmap -o yaml

Şimdi oluşturduğumuz bu configmap’imizi volume olarak kullanalım.

configmap-as-volume.yaml
kubectl apply -f https://raw.githubusercontent.com/DogusTeknoloji/K8SConfigMapExamples/master/configmap-as-volume.yaml

komutu ile podumuzu oluşturduk.

kubectl logs pod/configmap-as-volume-pod

Configmap üzerinde yaptığımız bir değişikliğin o configmap’i kullanan containerları nasıl etkilediğine bakacak olursak;

Configmap üzerinde yapılan değişiklikler realtime olarak containerlar üzerine taşınmamakta,

Kubelet belirli periyotlarla gidip volume’den configmap’i okuyarak güncellenmesini sağlamakta,

Bu süre, kubelet kontrol için default 1 dakika ve configmap cache ttl süresi default 1 dakika olarak toplamda 2 dakika kadar sürebiliyor. Yani bu demek oluyor ki yaptığımız değişikliğin podlarımıza yansıması 2 dakika içinde gerçekleşecektir.

Şimdi configmap üzerinden bir değişkenimizi update edelim ve podumuzda neler oluyor gözlemleyelim.

kubectl edit configmap multiconffile-configmap

Örneğin domain key’inin karşılığı olan “google.com” yerine “youtube.com” olarak değişiklik yapalım.

Configmap’i kaydedelim ve container içinden izlemeye başlayalım.

kubectl exec -it configmap-as-volume-pod shcat /etc/settings/appsettings.json

ile aralıklarla değişimi izleyelim.

Çıktıdan da görüldüğü gibi kubelet değişiklikleri yakaladı ve configmapte yaptığımız değişikliğimiz otomatik olarak içeriye alındı.

Emekleri için Hasan Berk Ergün’e teşekkür ederiz.

Daha fazla bilgi ve öneri için aşağıdaki mail adresinden bizimle iletişime geçebilirsiniz.

mailto:DTUygulamaYonetimi@d-teknoloji.com.tr

Yeni yazılarımız için bizi takipte kalın!

--

--