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.
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.
kubectl apply -f https://raw.githubusercontent.com/DogusTeknoloji/K8SConfigMapExamples/master/my-config-map-1.yaml
ile configmap’imizi oluşturduk.
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.
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.
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!