Home TürkçeDevOps Tekton ile Kubernetes-native CI/CD

Tekton ile Kubernetes-native CI/CD

by Fatih Boy
0 comment

Tekton Pipelines, Continuous Foudation tarafından Kubernetes-native olarak açık kaynak kodlu geliştirilen, Sürekli Entegrasyon (Continuous Integration, CI) ve Sürekli Teslimat (Continuous Delivery, CD) sistemleri oluşturmaya yönelik bir framework’tür. Yenilenebilir, esnek ve parçalı mimarisi ile Kubernetes üzerinde koşması onu diğer CI/CD araçlarının önüne getirmekte.

Özellikle Jenkins kullanıyorsanız, aklınıza gelecek ilk soru neden Tekton pipeline’ına geçiş yapmak isteyebileceğinizdir. Sonuçta Jenkins ile zaten CI/CD süreçlerini işletebiliyorsunuz. Güzel soru… Bu sorunun cevabını anlatabilmem için bir adım geri çekilip anlatmaya başlamamda fayda olacaktır.

Konteynar’ların ve ardından Kubernetes’in gelişmesi ile birlikte monolith dünyadan hızla sıyrılarak uygulamaların birbirinden soyutlandığı, bağımlılıklarının ayrıldığı ve yatayda kolayca büyüyebildikleri bir dünyaya adım attık. Bu makaleyi okuduğunuza göre, bu dünyanın sizi de cezbettiğini söylemem doğru olacaktır. Bu yeni dünyaya geçişin ilk adımı uygulama mimarilerine olan bakış açısının değişmesidir. Durumlarını kendi üstlerinde tutmayan, tercihen durumsuz olan, daha çok da mikro-servis yönelikli uygulamalar geliştirmeye başladık.

Öte yandan, Jenkins kullanıyorsak, Kubernetes üzerinde koşacak uygulamalarınız için hazırladığımız CI/CD pipeline’larımız hala monolith. Yaptığımız tam olarak elektirikli arabaları buharlı makinelerle üretmek… Derleme ajanlarını sanal ya da gerçek sistemler üzerine kuruyoruz. Bir ya da bir kaç adımın gerekli bağımlılıkları ile koşacağı ajan sistemler kuruyoruz. Micro servislerimizin sayısı ve büyüklüğü artıyor. Yeni ekipler kuruyoruz. Tüm bunlar olup biterken oluşan yeni gereksinimleri karşılayacak CI/CD pipeline’larımızı yatayda büyütmenin yolu olarak hala yeni ajan sistemler oluşturmak. Bir taraftan güçlü bir lokomotiv bizi hızla ilerletirken bir kısım vagon’un el freni çekik…

Tekton pipeline’ın parladığı an işte tam da bu an. Konteynar’lara taşınmış pipeline’lar ile ajan sistemlere gereksinim olmaksızın, mevcut Kubernetes Cluster’ımızda CI/CD için yatayda hızlı büyüme sağlıyor. Üstelik Kubernetes yerlisi bir proje olarak, gerekli tüm yapılandırma ve adımları Kubernetes özel kaynak tanımları (Custom Resource Definitions, CRDs) sayesinde Kubernetes Cluster’ı üzerinde tutmakta. Tüm süreci kubectl ve yaml dosyaları ile oluşturabilir, yönetebilirsiniz.

Tekton Kurulumu

Kubernetes Üzerine Kurulum

Önceki paragraflar ardından Tekton Pipeline’ın farkını kafanızda netleştirebildiğimi umuyorum. Şimdi sırada kurulumda. Tek adımlık basit bir kurulum prosedürü olan Tekton Pipeline ön gereksinim olarak bir Kubernetes Cluster’ına ihtiyaç duymakta. Mevcut bir Kubernetes Cluster’ı üzerinde aşağıdaki komutu çalıştırarak kurulumu gerçekleştirebilirsiniz;

kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

Bu komut kubectl yardımıyla Tekton Pipeline’ı ve bağımlılıklarının Kubernetes Cluster’ında kurulmasını sağlayacaktır. Aşağıdaki komut kullanılarak Tekton pod’larının hazır duruma gelmesi beklenebilir;

kubectl wait --for='condition=Ready' pods -l app.kubernetes.io/name=tekton-pipelines -n tekton-pipelines

OpenShift Üzerine Kurulum

Kubernetes Cluster’ı üzerine kuruluma benzer şekilde Tekton Pipelines OpenShift Cluster’ı üzerine de kurulabilir. Bunun için OpenShift yöneticisi olarak başlattığınız oturumda öncelikle aşağıdaki komutla tekton-pipelines adıyla bir proje oluşturmalısınız;

oc new-project tekton-pipelines

Bu projede aşağıdaki şekilde gerekli politikayı oluşturmalısınız;

oc adm policy add-scc-to-user anyuid -z tekton-pipelines-controller

Son olarak gerekli bileşenleri aşağıdaki şekilde kurabilirsiniz;

oc apply --filename https://storage.googleapis.com/tekton-releases/latest/release.yaml

Komut Satırı Arayüzü Kurulumu (Seçimli)

Yukarıdaki kurulum adımına ek olarak isterseniz Tekton Pipelines komut satırı uygulamasını kurabilirsiniz. Bunun için öncelikle aşağıdaki komutu kullanarak güncel sürüm numarasını bulmalıyız;

export CLI_RELEASE=$(curl --silent "https://api.github.com/repos/tektoncd/cli/releases/latest" | grep -Po '"tag_name": "v\K.*?(?=")')

Güncel sürüm numarasını kullanarak Redhat ve Centos işletim sistemleri için aşağıdaki şekilde RPM paketini kurabilirsiniz;

rpm -Uvh https://github.com/tektoncd/cli/releases/download/v${CLI_RELEASE}/cli_${CLI_RELEASE}_Linux-64bit.rpm

Diğer linux dağıtımlarında aşağıdaki komut ile binary paketi indirilebilir;

curl -LO https://github.com/tektoncd/cli/releases/download/v${CLI_RELEASE}/tkn_${CLI_RELEASE}_Linux_x86_64.tar.gz

Ardından path’te tanımlı bir dizine aşağıda örneklediğim şekilde ayıklanır;

sudo tar xvzf tkn_${CLI_RELEASE}_Linux_x86_64.tar.gz -C /usr/local/bin/ tkn
Task CRD

Temel Tekton Kavramları

Tekton Pipelines’ın ana hedefi tekil ya da bir pipeline’ın parçası olan Task‘ı (görevi) çalıştırmaktır. Task bir ya da daha fazla sayıda step (adım) barındırabilir. Tekton her bir task için bir pod, task altındaki her bir step için pod içerisinde bir container oluşturur. Her bir step, task tarafından sırayla işletilecektir.

Pipeline CRD

Pipeline ise bir ya da daha fazla sayıda task’ın bir araya gelmesi ile oluşur. Task’lar farklı node’larda çalışabilir. Step’lerin task tarafından sırasıyla işletilmesinden farklı olarak task’lar pipeline’da 3 farklı şekilde işletilir;

  • Ardıl
  • Eş Zamanlı
    • Grafik

Bir task tek başına sadece adımlardan oluşan bir görev tanımıdır. Task’ın çalışması için TaskRun kaynak nesnesi oluşturulmalıdır. TaskRun, bağlı task’ın tüm step’leri tamamlanana ya da hata alana kadar adımları sırası ile işletecektir. Task’lar gibi pipeline’lar da tek başlarına sadece hangi task’ların çalışacağını ve sırasını belirleyen kaynaklardır. Bir pipeline’ın çalışması için PipelineRun kaynak nesnesi oluşturulmalıdır. Bir PipelineRun kaynak nesnesi oluşturulduğunda bağlı pipeline içerisindeki her bir task için bir TaskRun kaynak nesnesi otomatik olarak oluşturulacaktır.

Bir başka Tekton CRD’si ise PipelineResource’dur. PipelineResource, bir pipeline içerisideki task’lara ait girdi ya da çıktı tanımıdır. PipelineResource nesnesi sayesinde örneğin bir task’a git deposunun adresi girdi olarak verilebilir.

Basit Bir Tektone Pipeline’ı

Bu kadar teorik bilgi ardından aşağıdaki adımları takip ederek Tekton Pipeline’ında “merhaba dünya” örneğimizi yazalım. Örneğimiz bir Ubuntu container’ında echo komutunu kullanarak “merhaba dünya” çıktısını verecek basit bir akış olacak. İlk adımda task tanımını hazırlamalıyız. Teknik olarak baktığımızda Task’lar birer Kubernetes CRD nesnesidir. Dolayısıyla aşağıdaki komutla oluşturacağımız Task CRD dosyası ile işe başlıyoruz;

cat > enterprisecoding-merhaba-dunya-task.yaml <<EOF
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: task-merhaba-dunya
spec:
  steps:
    - name: echo
      image: ubuntu
      command:
        - echo
      args:
        - "Merhaba Dünya"
EOF

Oluşturduğumuz enterprisecoding-merhaba-dunya-task.yaml dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;

kubectl apply -f enterprisecoding-merhaba-dunya-task.yaml

Seçimli olarak; tek adımdan oluşan oluşan bu task’ı denemek amacıyla bir TaskRun CRD tanımı oluşturabilirsiniz. Bunun için aşağıdaki komutla ilgili yaml dosyası hazırlanmalıdır;

cat > enterprisecoding-merhaba-dunya-taskrun.yaml <<EOF
apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
  name: taskrun-merhaba-dunya
spec:
  taskRef:
    name: task-merhaba-dunya
EOF

Oluşturduğumuz enterprisecoding-merhaba-dunya-taskrun.yaml dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;

kubectl apply -f enterprisecoding-merhaba-dunya-taskrun.yaml

Eğer önceki adımlarda tariflediğim şekilde tekton komut satırı arayüzünü kurduysanız aşağıdaki komutu kullanarak taskrun tanımını görebilirsiniz;

tkn taskrun describe taskrun-merhaba-dunya

Benzer şekilde aşağıdaki komutla taskrun çıktısını görebilirsiniz;

tkn taskrun logs taskrun-merhaba-dunya

Oluşturduğumuz task’ı aşağıdaki komutla oluşturacağımız Pipeline CRD tanımına ekleyebilirsiniz;

cat > enterprisecoding-merhaba-dunya-pipeline.yaml <<EOF
apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
  name: pipeline-merhaba-dunya
spec:
  tasks:
  - name: merhaba-dunya
    taskRef:
      name: task-merhaba-dunya
EOF

Oluşturduğumuz enterprisecoding-merhaba-dunya-pipeline.yaml dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;

kubectl apply -f enterprisecoding-merhaba-dunya-pipeline.yaml

Pipeline’ı çalıştırmak için aşağıdaki komutla bir PipelineRun CRD nesnesi oluşturulur;

cat > enterprisecoding-merhaba-dunya-pipelinerun.yaml <<EOF
apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:
  name: pipelinerun-merhaba-dunya
spec:
  pipelineRef:
    name: pipeline-merhaba-dunya
EOF

Oluşturduğumuz enterprisecoding-merhaba-dunya-pipelinerun.yaml dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;

kubectl apply -f enterprisecoding-merhaba-dunya-pipelinerun.yaml

Eğer önceki adımlarda tariflediğim şekilde tekton komut satırı arayüzünü kurduysanız aşağıdaki komutu kullanarak pipelinerun tanımını görebilirsiniz;

tkn pipelinerun describe pipelinerun-merhaba-dunya

Benzer şekilde aşağıdaki komutla pipelinerun çıktısını görebilirsiniz;

tkn pipelinerun logs pipelinerun-merhaba-dunya

Aşağıdaki komutu kullanarak Tekton Pipelines’ın bizim için oluşturduğu pod’ları görebilirsiniz;

kubectl get pods

Alternatif olarak aşağıdaki komut yardımıyla Tekton Pipeline kaynaklarını görebilirsiniz;

kubectl get tekton-pipelines

Şu Yazıları da Sevebilirsiniz

Leave a Comment

* Bu formu kullanarak, verilerinizin bu web sitesi tarafından saklanması ve kullanılmasını kabul ediyorsunuz.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bunu kabul ettiğinizi varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul Et Daha Fazla Bilgi