๐Ÿ’ฐEnvironment Variables

Konuya bir รถrnekle baลŸlayalฤฑm. Misal, biz bir web uygulamasฤฑ geliลŸtiriyoruz. Ve bu web uygulamasฤฑ, bir veritabanฤฑ uygulamasฤฑna baฤŸlanarak verileri burada saklฤฑyor. Bu uygulamanฤฑn, baฤŸlandฤฑฤŸฤฑ veri tabanฤฑnฤฑn, sunucu adresi, kullanฤฑcฤฑ adฤฑ ve ลŸifre bilgilerini de bu uygulamanฤฑn iรงerisine gรถmdรผk diyelim. Daha sonra, bu uygulamayฤฑ container imajฤฑ haline getirdik ve artฤฑk istediฤŸimiz container platformunda bu uygulamayฤฑ รงalฤฑลŸtฤฑrmaya hazฤฑrฤฑz.

Bu senaryo da 2 sฤฑkฤฑntฤฑmฤฑz bulunmaktadฤฑr.

1 - Biz veritabanฤฑ baฤŸlantฤฑ bilgilerini, container imajฤฑ iรงerisine hardcoded olarak yazdฤฑk. Yani bir ลŸekilde, container imajฤฑ istemediฤŸimiz insanlarฤฑn eline geรงerse, bu imajฤฑn iรงerisinde bulunan bu bilgiler expose olur. Bu durumu asla istemeyiz.

2 - Bu(web) imajdan, container oluลŸturmak istediฤŸimiz zaman, bu container her defasฤฑnda, aynฤฑ veritabanฤฑna, aynฤฑ kullanฤฑcฤฑ adฤฑ ve ลŸifre ile baฤŸlanmaya รงalฤฑลŸacak. Veritabanฤฑ adresimiz, test ortamlarฤฑnda ayrฤฑ, prod ortamlarฤฑnda ayrฤฑ olabilir. Biz bu kullanฤฑcฤฑ adฤฑ ve ลŸifre bilgilerini zaman iรงerisinde gรผncellemiลŸ olabiliriz. Bu senaryo da ne yapacaฤŸฤฑz? Her ortam iรงin, her seferinde, yeni bilgilerle imaj oluลŸturacaฤŸฤฑz. yada her seferinde, container oluลŸturulduktan sonra, container 'a baฤŸlanฤฑp, bu bilgileri gรผncelleyeceฤŸiz. 2. seรงeneฤŸi seรงtiฤŸimizde bu sefer de, ลŸรถyle bir sorunumuz olacak. Kubernetes bir sorun anฤฑnda, containerฤฑ silip, yeniden oluลŸturabilir. Scale ediyoruz, geri alฤฑyoruz vb. Her seferinde oluลŸturulan, tรผm containerlara baฤŸlanฤฑp, bunu manuel mi dรผzelteceฤŸiz?

GรถrdรผฤŸรผnรผz gibi, bu tarz ortama gรถre deฤŸiลŸebilen, ve hassas bilgileri container imajฤฑ iรงerisine gรถmmek, oldukรงa fazla sorun รงฤฑkartฤฑr. Fakat bununda bir รงรถzรผmรผ var.

Bu tarz, รงalฤฑลŸtฤฑrdฤฑฤŸฤฑmฤฑz ortama gรถre deฤŸiลŸebilecek bilgileri container imajฤฑna hardcoded olarak eklemeyiz. Bunun yerine, uygulamalarฤฑmฤฑzda bu bilgileri, รงalฤฑลŸtฤฑrฤฑldฤฑklarฤฑ sistemden okuyacaklarฤฑ ลŸekilde, bir deฤŸiลŸken olarak tanฤฑmlarฤฑz. Yani Environment variables 'dan okunmasฤฑ iรงin tanฤฑm yaparฤฑz.

Yukarฤฑdaki รถrnekte uygulamamฤฑzฤฑn baฤŸlanacaฤŸฤฑ, veritabanฤฑnฤฑn adres ve kullanฤฑcฤฑ bilgilerini direkt uygulamaya gรถmmek yerine veritabanฤฑ adresini $database . Kullanฤฑcฤฑ adฤฑ bilgisini $username . Parola bilgisini de, $password isimli deฤŸiลŸkenlerin deฤŸerlerine bakacak ve oradan bu deฤŸerleri okuyacak ลŸekilde ayarlamasฤฑnฤฑ sรถyleriz.

Bu sayede, bu hassas bilgileri, bu imajlara gรถmmemiลŸ oluruz. Ne zaman bu imajdan, container oluลŸturmak istersek, o an hangi deฤŸerlerin atanmasฤฑ gerekiyorsa, bu deฤŸerlerin Container da Environment variable olarak tanฤฑmlarฤฑz. Bรถylecek Environment variables nedir ve Container ile ne alakasฤฑ var sorularฤฑnฤฑn cevaplarฤฑnฤฑn รผstรผnden geรงmiลŸ olduk.

ลžimdi bunlarฤฑ pod tanฤฑmฤฑna nasฤฑl ekleyeceฤŸimize bakalฤฑm.

apiVersion: v1
kind: Pod
metadata:
  name: envpod
  labels:
    app: frontend
spec:
  containers:
  - name: envpod
    image: nginx
    ports:
    - containerPort: 80
    env:
      - name: USER
        value: "Onur"
      - name: database
        value: "testdb.example.com"

Pod tanฤฑmlarฤฑ iรงerisinde, Environment variable'lar, container tanฤฑmฤฑ altฤฑnda, env parametresi ile tanฤฑmlanฤฑyor. env parametresi altฤฑnda list ลŸeklinde, tรผm Environment variable 'larฤฑmฤฑzฤฑ tanฤฑmlฤฑyoruz.

ร–ncelikle tanฤฑmlamak istediฤŸimiz Environment variable 'ฤฑn ismini giriyor ve ardฤฑndan da, value opsiyonu ile buna atamak istediฤŸimiz deฤŸeri giriyoruz.

Yukarฤฑdaki รถrnek pod tanฤฑmฤฑnda, "USER" isimli Environment variable tanฤฑmlayฤฑp, ve buna da, "Onur" deฤŸerini atadฤฑm.

Bir altฤฑndaki Environment variable 'da, "database" isimli Environment variable tanฤฑmlayฤฑp, buna da "testdb.example.com" deฤŸerini atadฤฑm.

Bu container oluลŸturulduฤŸunda, bu 2 Environment variable bu containerda tanฤฑmlanacak, Aynen az รถnceki รถrnekte belirttiฤŸim gibi bir web uygulamasฤฑ oluลŸturdum. Web uygulamasฤฑ iรงerisinde, Selamlama yapacaฤŸฤฑ kiลŸinin kim olacaฤŸฤฑnฤฑ, hardcoded olarak eklemek yerine, รงalฤฑลŸtฤฑฤŸฤฑ ortamdaki "USER" isimli Environment variable deฤŸeri ne ise, ondan bu deฤŸeri alฤฑp, selamlayacak.

root@medellin-master:/home/onur# curl 127.0.0.1:8080

<html>
<body style="background-color:gray;">

<center><h1 style="color:magenta;">
    <p>K8S Fundamentals</p>
    <p>Pod: envpod</p>
    <p>Hello Onur</p>
        </h1>
</center>

</body>

envpod isimli pod iรงerisinde bulunan Environment variable'larฤฑ listelemek,

kubectl exec envpod -- printenv

Bu bir web uygulamasฤฑ podu, normal bu pod'a dฤฑลŸ dรผnyadan eriลŸmek iรงin, ya loadbalancer yada nodeport ลŸeklinde bir servis tanฤฑmlamamฤฑz gerekir. Fakat kubernetes bize, ลŸu imkanฤฑda sunuyor. Biz kubectl kullanarak, herhangi bir pod 'a, deployment'a, service. vb. Kendi bilgisayarฤฑmฤฑzdan tรผnel aรงarak ilgili objenin portuna trafiฤŸi yรถnlendirebiliyoruz. Testlerde hฤฑzlฤฑ ลŸekilde, objelerimize baฤŸlanmak iรงin, kullanabildiฤŸimiz bu รถzelliฤŸe "port forward" diyoruz.

Syntax:

kubectl port-forward {obje tipi/obje adฤฑ} hostport:podport

ร–rnek:

Kubectl 'i รงalฤฑลŸtฤฑrdฤฑฤŸฤฑmฤฑz cihazฤฑn, 8080 portuna gelen tรผm istekleri, envpod isimli podun 80 portuna gรถnder/yรถnlendir.

kubectl port-forward pod/podenv 8080:80

Container tanฤฑmฤฑ altฤฑnda girdiฤŸimiz, Environment variable'larฤฑ, Bu container iรงerisinde,

farklฤฑ yerlerde dilediฤŸimiz ลŸekilde kullanabiliriz.

Last updated