Kubernetes Yaml Dosyası Nasıl Yazılır ? | Kubernetes Dersleri 3

Merhabalar, önceki dersimizde kubernetes konseptlerinden bahsetmiştim. Simdi ise bu konseptlerin nasıl kullanılacağını anlatacağım.

Yazdığımız uygulamaları veya yardımcı uygulamaları kubernetes’e deploy etmemiz gerekiyor bunun icin yaml dosyaları yazıyoruz.

Yaml dosyaları 3 bolümden oluşur.

Yaml File Bölümleri

  • Metadata ==> Deployment, Service vb.) adını ve label’lari içeren bolum
  • Specifications ==> Konsepte özel olarak tanımlanan değişkenler container ayarları image vb.)
  • Status ==> Otomatik olarak Kubernetes tarafından yönetilen kisim. Kubernetes istenilen ayarlar ile o anki ayarları karşılaştırarak aksiyon alır.
Kubernetes yaml file

Yukarıdaki resimde bir deployment görüyoruz. Deployment ReplicaSet’i, ReplicaSet ise pod’u yönetir.

Peki Kubernetes Deployment ‘in hangi ReplicaSet’i yöneteceğini nerden biliyor ? veya ayni şekilde ReplicaSet hangi pod’u yöneteceğini nerden biliyor ?

Label’lar sayesinde yönetim sağlanmaktadır. (Her şeyi karıştıran ayni zamanda yöneten basımıza dert olabilecek gerekli kısımlar (okumaya devam edin blog sonunda label ‘lardan kurtulabileceğimiz bir yol var :))) Uygulamanın düzgün çalışabilmesi icin Label’lar düzgün şekilde verilmelidir. İstenilen değer verilebilse de o değerin diğer yerlerde de kullanılacağını unutmamak gerekir.

Bir örnek üzerinden yaml dosyalarını inceleyelim Örneğe “Kubernetes Excel” Reposuna giderek erişebilirsiniz.

apiVersion: apps/v1
kind: Deployment  # konsept
metadata:  # BOLUM 1 METADATA
  name: backenddeployment  # deploymen adi  gorunecek ad
  labels:
    app: backenddeployment  # replicaset, pod ve service ile eslesecek olan label
spec: # BOLUM 2 SPECIFICATIONS
  replicas: 1  # Kac adet replicasi olusturlacagini belirler
  selector:
    matchLabels:
      app: backenddeployment # deployment ve pod ile eslecek olan label
  template:  # pod ayarlarini icerir 
    metadata:
      labels:
        app: backenddeployment  # replicaset ile eslecek olan label
    spec:
      containers:
      - name: backendpod
        image: localhost:5000/excel_backend:0.0.1 # local image repository
        ports:
        - containerPort: 9000
        env: # sistem degiskenlerinin verildigi yer direk verebilir ya da asagidaki gibi configmap veya secretdan alinabilir
        - name: DATABASE_USER
          valueFrom:
            secretKeyRef:
              name: postgresql-secret
              key: postgresql-root-username
        - name: DATABASE_PASSWORD
          valueFrom: 
            secretKeyRef:
              name: postgresql-secret
              key: postgresql-root-password
        - name: DATABASE_NAME
          valueFrom: 
            configMapKeyRef:
              name: postgresql-configmap
              key: database_name
        - name: DATABASE_HOST
          valueFrom: 
            configMapKeyRef:
              name: postgresql-configmap
              key: database_host
        - name: DATABASE_PORT
          valueFrom: 
            configMapKeyRef:
              name: postgresql-configmap
              key: database_port
        - name: SECRET_KEY
          valueFrom:
            configMapKeyRef:
              name: django-configs
              key: django_secret_key
        - name: STATIC_URL
          valueFrom:
            configMapKeyRef:
              name: django-configs
              key: django_static_url
--- # tek sayfada birden fazla konsept tanimlamak icin kullanilir
apiVersion: v1
kind: Service # konsept
metadata:
  name: backend-deployment-service
spec:
  selector:
    app: backenddeployment  # deployment ile eslesecek olan label servis deployment'a baglanacak
  type: NodePort  
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000
      nodePort: 30001

Yukarida ki yaml dosyasini incelersek eger:

Deployment ve Service konseptlerini görüyoruz. Deployment ‘in ReplicaSet’i yönetmesi veya ReplicaSet ‘in Pod’u yönetmesi icin “app: backenddeployment” ibaresi kullanılmıştır.

Ayni ibareyi Servisi Deployment’a bağlamak icin kullandığımıza dikkat edelim. Burada bir diğer dikkat etmemiz gereken konu label specifications içerisinde “selector: matchLabels:” olarak karsımıza çıkmasıdır.

Diğer ayarlara göz gezdirirsek container ‘in adi, imajı, hangi portu kullandığı ve containera verilen sistem değişkenlerini görmekteyiz. Sistem değişkenleri ConfigMap ve Secret’den alınarak kullanılmıştır

ConfigMap ve Secrets dosyalarına “Kubernetes Excel” Reposuna giderek erişebilirsiniz.

Eğer sistem değişkenini direk vermek isterseniz aşağıdaki şekilde verebilirsiniz.

env:
  - name: SERVICE_PORT
    value: "80"

Diğer Kubernetes Konseptleri ‘de benzer mantıkta yazılır. Fakat her birinin kendisine özel bazı değişkenleri var.

Kubernetes yaml dosyası yazmanın kolay bir şey olmadığını anlamış olmalısınız her bir konsept icin bir sıfırdan bir dosya oluşturmanız gerekiyor ama merak etmeyin her şeyde olduğu gibi bunun da kolay yolu var Helm!

Bir sonraki yazımda Helm Nedir, Nasıl Kullanılır, Neleri Kolaylaştırır ? gibi konulara yer vereceğim.

Bir sonraki yazıda görüşmek üzere!

Add a Comment

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir