chatgpt devops

ChatGPT ile DevOps Süreçleri 🔍

Bu yazımda son zamanlarda epey adı duyulan ChatGPT'nin DevOps işlerinde neler yapabildiğini birlikte inceleyeceğiz. Öncelikle kısaca bir ChatGPT'ye değinelim.

ChatGPT nedir?
ChatGPT'yi mühendislik dahil olmak üzere çeşitli alanlardaki tüm bilgilere sahip olan ve sohbet arayüzü olan bir yapay zeka olarak düşünebilirsiniz. Sahip olduğu tüm bilgileri analiz edip işleyerek, alanında uzman gerçek bir insan gibi size çok insani yanıtlar verebiliyor.

Peki ya bu teknoloji nasıl ortaya çıktı?
ChatGPT, OpenAI adlı bir araştırma şirketi tarafından oluşturulmuştur. Şirketin misyonu yapay zekayı insanlığın yararına olacak bir şekilde geliştirmeye ve kullanmaya odaklanmıştır. Bu ürünün adı son günlerde epey duyulmaya başlamış olsa da şirketin kuruluşu 2015 yılına dayanıyor. Elon Musk ve Sam Altman'ın kurduğu open-source ve kâr amacı gütmeyen bu şirketin en büyük hedeflerinden birisi de insanlığın yapay zekayı kötüye kullanmasını engellemektir.

OpenAI, yapay zeka alanında birçok ürünü olan lider kuruluşlardan birisidir. GPT (Generative Pre-trained Transformer) ise insan benzeri metinler oluşturabilen bir dil oluşturma modelidir. ChatGPT de bu modeli temel alan bir uygulamadır. 30 Kasım 2022'de yayınlanan ise bu GPT'nin 3.5. sürümüdür. GPT-3’ün yeni sürümü bir UI ile birlikte yayınlandıktan sonra 5 günde 1 milyon kullanıcıya ulaştı. Bu büyük ilgi aktif olarak devam etttiğinden, ürünü kullanırken zaman zaman sorunlar ile karşılaşabilirsiniz, hatta bazen yoğunluktan dolayı hizmet veremez duruma geldiğini de gördüm.

ChatGPT, DevOps süreçlerinde neler yapabilir?

Çok uzatmadan gelelim asıl konumuza. ChatGPT'nin yazılım geliştirme süreçleriyle ilgili çeşitli bug-fix'ler yapabildiğini veya yeni kod yazabildiğini daha önce görmüştüm. Yabancı kaynaklardan yola çıkarak DevOps alanında neler yapabilir bunlara bir bakmak istedim. Aldığım sonuçları beğenince bunu sizlerle de paylaşmak istedim. Chat'e yazdığım cümleleri burada ayrıca belirteceğim ki kopyala-yapıştır yaparak tüm anlattıklarımı deneyimleyebilesiniz. Paralelde bu uygulamaları denemek isteyenler ChatGPT'ye giriş için buraya tıklayabilir. Direkt olarak yazdığım cümleleri ve çıktılarını yorumlayarak ilerleyeceğim.

Diyelim ki DevOps olarak bir şirkette çalışıyorsunuz ve nodejs bir uygulamanın CI/CD süreçlerini yapmanız bekleniyor. İster senior olun, ister junior, bu yapay zeka herkesin işine yarayacak gibi görünüyor. Hadi başlayalım;

Dockerfile yazma;


# nodejs bir uygulama için bir dockerfile yaz


dockerfile-chatgpt

Node.js uygulaması için bize örnek bir dockerfile verdi ve üstelik bununla kalmayıp bu dockerfile'ın ne iş yapacağının açıklamasını da yaptı. Bu dockerfile terimlerini anlamak için epey faydalı olacaktır.


# Dockerfile'daki WORKDIR'in ne anlama geldiğini tam olarak açıkla


workdir-acikla-chatgpt

Gördüğünüz gibi herhangi bir syntax'ı bilmiyorsunuz ve bunu açıklamasını istediniz; ve karşınızda güzel bir açıklama.

Diyelim ki projenizde npm değil de yarn paketleme aracı kullanılıyor, fakat ChatGPT size npm kullanarak bir dockerfile yazdı. Bunu değiştirmesini istersek çok mu şey isteriz acaba? Hadi gelin bakalım.


# dockerfile'da npm yerine yarn kullan


yarn-kullan-chatgpt

İşte sonuç; aynı dockerfile'ı yarn kullanarak yeniden yazdı. Şimdi ise onu biraz daha zorlayıp dockerfile üzerinde optimizasyon yaptırmayı deneyelim. Gördüğünüz gibi COPY .ile kök dizindeki tüm dosyaları içeriye kopyalamış. Bizim projemizde ise repo içerisinde gereksiz klasörler ve dosyalar da olabilir. Peki projemizi bilmeyen ChatGPT'den gereksiz dosyaları almamasını istersek sizce ne yapacak?


# şimdi ise dockerfile'da sadece ilgili uygulama dosyalarını kopyala


gerekli-dosyalar-chatgpt

Gördüğünüz gibi istediklerimizi yaptı, /src, /config, /views gibi standart klasörleri yazarak kopyaladı. Dikkat ettiyseniz bir önceki adımda yarn kullanmasını istemiştik ama bu adımda istediklerimizi yaparken tekrar npm'e döndü. Yani bu tarz istekleri yeni cümleler yazarken tekrar belirtmek gerekebiliyor.

Son olarak bu olayı artırıp dockerfile'ımda multi-stage yapı kullanmasını, bir image tag ayarlamasını, birkaç best practices ve bu image'ı nasıl kullanacağıma dair örnek komutlar vermesini isteyeceğim. Daha detaylı ve tüm isteklerimi içeren bir cümle ile son talebimi yapıyorum. 🙂


# yarn kullanarak multi-stage bir yapı ayarla, dockerfile'da sadece ilgili uygulama dosyalarını kopyala, image tag'ini 1.0.5 olarak ayarla, docker image'ında güvenlik best practices'i ayarla, image boyutunu küçült ve docker komut örnekleri ver


multistage-chatgpt

Bingo! Gerçekten iyi bir sonuç! Multi-stage yaparken # ile açıklama bile yapmış 🙂 Security istedim; non-root bir user açıp ona tanım yaptı ve istediğim gibi yarn kullandı. Burada en güzel özelliklerinden bir tanesi tüm yaptıklarını açıklamasıdır. Bu sayede hem kendinizi geliştirip hem iş yapabilirsiniz. Örneğin nasıl multi-stage bir pipeline yapıldığını bilmiyor olabilirsiniz veya güvenlik ile ilgili pratiklerin neler olduğunu da bilmiyor olabilirsiniz. Siz isteyin, ChatGPT yapsın. 🙂 Tabii tüm bunları yaparken bu tarz yapay zekaların bir gün hepimizi işsiz bırakabileceğini insan düşünmeden edemiyor. 😀 Bu noktada naçizane tavsiyem; yerinizde saymamanız olacaktır. Olabildiğince teknolojiyi takip edip sürekli yeni şeylerle uğraşmaya çalışın çünkü, bu tren çok hızlı...dockerfile-aciklama-chatgpt

Docker komut örnekleri istemiştik, aşağıda yaptığı açıklamada onları da iletti. Bu bilgiler ışığında dockerfile'ımızı yani uygulama image'ımızı hazırladık. Şimdi ise gelin bunu k8s ortamına deployment yapacak olalım. Bunun için ihtiyacımız olan deployment ve service manifest'lerimi isteyeceğim. Yine best practices'e uygun bir yaml hazırlaması için özellikle belirteceğim. Bakalım bize neler verecek.

K8s manifest hazırlama;


# bu docker image'ı için k8s deployment ve service manifest'ini oluştur, production ve güvenlik best practices'i ayarla


k8s-manifest-chatgpt

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000
      containers:
      - name: my-app
        image: my-app:1.0.5
        ports:
        - containerPort: 3000
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"
          requests:
            memory: "128Mi"
            cpu: "250m"

---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    port: 3000
    targetPort: 3000
  type: ClusterIP

Açıklaması;
Bu deployment manifest dosyası, 2 replika oluşturulmasını ve my-app adında bir etiket ile uygulamanın çalıştırılmasını sağlar. Container içinde güvenlik best practices'i olarak securityContext kullanılır ve limitler veya istekler için resources kullanılır. Ayrıca, service manifest dosyası, 3000 numaralı portu kullanarak uygulamayı ClusterIP türünde bir hizmet olarak çalıştırır. Bu konfigürasyon, uygulamanın production ortamında çalıştırılmasını sağlar ve güvenlik best practices'ini uygular.


Fena durmuyor, en azından deployment yapabilecek hale getirdi 🙂 Fakat production ve güvenlik best practice'leri istememe rağmen örneğin livenessProbe ve readinessProbe'ları yazmadığını görüyorum. Şimdi ise bunları söylemeden bir şeylerin eksik olduğunu belirtip neler yapacağını görmek istiyorum.


# bazı best practice'lerin eksik olduğunu görüyorum, lütfen deployment ve service manifest'ini production'a düzgün şekilde ayarlar mısın?


k8s-best-practices-chatgpt

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000
        # Enable AppArmor or SELinux profiles
        #apparmorProfile: runtime/default
        #seLinuxOptions:
        #  level: "s0:c123,c456"
      containers:
      - name: my-app
        image: my-app:1.0.5
        ports:
        - containerPort: 3000
        env:
        - name: NODE_ENV
          value: "production"
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"
          requests:
            memory: "128Mi"
            cpu: "250m"
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 10
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 3000
          initialDelaySeconds: 10
          periodSeconds: 10
        # Enable container security features
        #privileged: false
        #readOnlyRootFilesystem: true
        #capabilities:
        #  add: ["NET_BIND_SERVICE"]
        #  drop: ["ALL"]

---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    port: 3000
    targetPort: 3000
  type: ClusterIP
  # Enable session affinity
  #sessionAffinity: ClientIP
  # Enable external access
  #externalTrafficPolicy: Local

Açıklaması;
Bu yapılandırma, production ortamı için daha güvenli bir Kubernetes deployment ve service manifest dosyası oluşturur. Özellikle, securityContext içinde AppArmor veya SELinux profilleri etkinleştirilir, container içinde güvenlik özellikleri etkinleştirilir, container içinde liveness ve readiness probe'ları tanımlanır. Ayrıca, service manifest dosyası, sessionAffinity ve externalTrafficPolicy özelliklerini etkinleştirir, böylece uygulama dışarıya erişebilir ve isteklerin bir kullanıcıya bağlı olarak yönlendirilmesi sağlanır.


Evet! Şimdi ise eksiklikleri yakaladı, hatta ekstra opsiyonel olarak açabileceğim birkaç güvenlik satırı daha ekledi. Buradaki tanımları açıklatmak adına şöyle bir soru sormak istiyorum;


# Bu manifest'lerde yazan şeylerin ne işe yaradığını açıklar mısın?


explain-chatgpt

İşte sonuç; bu şekilde ekstra sorular sorarak bazı şeyleri açıklattıradabilirsiniz. Manifest'lerimizi de hazırladık. Sıra geldi CI&CD pipeline kısmına. 🙂 Şimdi de bu arkadaştan hazırladığımız uygulama için bir jenkinsfile yazmasını isteyelim.

Pipeline hazırlama;


# Şimdi ise yukarıdaki nodejs uygulaması için k8s'e deploy olacak şekilde bir jenkinsfile yazar mısın?


jenkinsfile-chatgpt

pipeline {
    agent any
    environment {
        REGISTRY = "docker.io"
        IMAGE = "my-app"
        TAG = "1.0.5"
        K8S_NAMESPACE = "production"
    }
    stages {
        stage('Checkout') {
            steps {
                git 'https://github.com/my-app.git'
            }
        }
        stage('Build') {
            steps {
                script {
                    sh 'docker build -t $REGISTRY/$IMAGE:$TAG .'
                }
            }
        }
        stage('Push') {
            steps {
                script {
                    sh 'docker push $REGISTRY/$IMAGE:$TAG'
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    sh "kubectl config set-context --current --namespace=$K8S_NAMESPACE"
                    sh 'kubectl apply -f k8s/deployment.yml'
                    sh 'kubectl apply -f k8s/service.yml'
                }
            }
        }
    }
}

jenkinsfile explain

NOT: İlk cümlelerimin emir kipi ile olması ve yaptığı işleri gördükten sonra son cümlelerde ricaya dönmem konusunda yorumları size bırakıyorum. 🙂

Gördüğünüz gibi deploy yapabilecek seviyede bir jenkinsfile da hazırladı. Burada da eksikleri talep edip daha fazla geliştirilebilir veya kendi CI/CD tool'unuz için pipeline hazırlatmayı da deneyebilirsiniz. Örneğin bir stage daha ekleyip slack notification adımı ekle diyebilir veya farklı şeyler de isteyebilirsiniz. Aynı zamanda bunu veya elinizdeki herhangi bir jenkinsfile'ı verip GitlabCI yaml karşılığını da alabilirsiniz. En güzel özelliklerinden biri ise geçmişteki yazdıklarınızı hafızasında tutup onlara yönelik konuşabiliyor olmanız. (Örneğin yukarıdaki uygulama için jenkinsfile yaz, gibi..) 
Yazıyı daha fazla uzatmamak için bunları denemeyi size bırakıyorum. Sizler denerken farklı sonuçların çıkabileceğini unutmayın. Burada amaç biraz ufuk genişletmek ve yol gösterebilmekti, umarım faydalı olmuştur.


1 Yorum

  1. Yazınızı çok faydalı buldum..Devamının dileğim ile.. iyi çalışmalar

    Yanıtla

Yorum Yapın