Tekton Pipelines Hakkında Kısa Bir İnceleme
Bu yazının Agile takımlar hakkındaki yazılarıma denk gelen arkadaşları şaşırtacak bir başlığı var, diğer sevdam DevOps hakkında. Umarım keyifle okursunuz :)
CI/CD ortamlarımızın artık bize darboğaz oluşturmaya başladığı bugünlerde, karşımıza çıkan yeni ve Kubernetes-severler açısından nokta atış bir proje olan Tekton’dan bahsedeceğim. Uzun zamandır mükemmelleşen tasarımlara imza atan yazılım camiası, artık kendi kullandığı araçların da devrim geçirmesi ihtiyacını duyuyor. Tam da bu sırada karşımıza köklerini Knative’e dayandıran, esnekliği ve Cloud-Native özellikleri ile bir anda dikkatleri üzerine çeken Tekton çıkıyor. Bir yandan da Linux Foundation’ın yeni oluşumu Continuous Delivery Foundation’ın kurucu projelerinden ve hatta Graduate statüsüne erişti bile! Linux Foundation’ın sürekli bir başka Foundation doğurması döngüsüne başka bir yazıda girme hedefiyle, Tekton’a bir bakalım.
Tekton; Kubernetes tabanlı, açık kaynak bir CI/CD framework’üdür. Farklı platformlarda deployment otomasyonunu (Kubernetes, serverless, VM gibi) alt yapıdaki detayları soyutlayarak mümkün kılar. Bunu da CI/CD pipeline’ının her adımını, bir container içerisinde çalıştırarak yapar.
- Container olarak çalıştığı için, ihtiyaca göre ölçeklenebilir.
- Pipelinelar üzerinde yaşanan performans sorununa çözüm getirilmiş olur. Bunu da farklı adımların bağımlılıklarını önceden tanımlatıp, pipeline’ın adımlarını aynı anda yani paralel olarak çalıştırarak yapar.
- Merkezi bir CI/CD server ihtiyacı kalmaz, CI/CD server bulundurmak ve yönetmekten kaynaklı serverless sorunlarına çözüm olur.
- Pipeline’lardaki bütün objeleri kodla tanımlamanıza ve projeleriniz arasında yeniden kullanılabilir şekilde paylaşmanıza olanak tanır.
- Kubernetes tarzı pipeline yönetimi yapabiliriz. yaml’lar ile pipeline’ları tanımlar, Kubernetes temelli nesneler ile pipeline’larımızı oluşturabiliriz.
Github sayfasında kendilerini nasıl tarif ettiklerine bir bakalım:
Tekton Cloud Native’dir:
- Kubernetes tarzı pipeline tanımlamayı sağlar.
- Kubernetes cluster’lardaki tüm operasyonları destekler.
- Yapı taşları olarak container’ları kullanır.
Tekton bağımsızdır:
- Bir pipeline herhangi bir Kubernetes cluster’ına deployment için kullanılabilir.
- Pipeline’ları oluşturan tasklar tamamen ortamdan izole edilebilir.
- Pipeline’ların kullandığı resource’lar, farklı koşumlar arasında değiştirilebilir.
Tekton belirli tiplidir:
- Belirli tipli bir resource’un çalışmasını, kolayca farklı uygulamalara çevirebilirsiniz. (Örn; image’ları kaniko ile build ederken buildkit’e çevirmek gibi)
Avantajları:
1. Pipeline’lar, üzerinde bulunduğu altyapıdan tamamen yalıtılmış olarak çalışır. Bu da standart bir CI/CD pipeline ortamı kullanıp, serverless deployment yaptığımızda yaşanan sorunların üstesinden gelmemizi sağlar. Bunun yanında herhangi bir platforma rahatlıkla deployment yapmamıza olanak tanır.
2. Farklı bir CI/CD ortamı yönetmek yerine, Kubernetes ve Openshift gibi varolan ortamlarımızın üzerinde pipelinelarımızı, ek bir araca ihtiyaç olmadan yönetebiliriz.
3. Test, UAT, Prod veya farklı projeler arası pipeline tanımlarının paylaşılmasını, yeniden kullanılabilirlik ve zamandan tasarruf sağlar.
4. Pipeline adımları arasındaki bağımlılıkların tanımlanması halinde, adımların paralel çalışması ve bu anlamda da tüm pipeline’ın hızlanması mümkündür.
5. Yazılım ekipleri tarafından pipeline yönetimi sağlanması çok daha kolay hale gelecektir.
Dezavantajları:
1. Varolan pipeline’ları çevirebilmek için, önce temel pipeline bileşenlerinin oluşturulması (Step, Task ve Pipeline) gerekiyor. Bu da bir overhead’le geliyor. Daha sonra bu bileşenler projeler arası yeniden kullanılabileceği için, bu aşamadan sonra süreç oldukça hızlanacaktır.
2. Ürünün yeni olmasından kaynaklı, kullanmadan farketmeyeceğimiz ancak gelişim alanı olan noktalar olabilir.
3. Kubernetes’e, API ve nesnelerine hakimiyet gerektirebilir.
Tekton’un en yoğun kullanılacak bileşenlerine gelirsek:
- Pipelines: Pipeline’ları oluşturup çalıştırdığımız ana proje. https://github.com/tektoncd/pipeline
- Dashboard: Tekton Pipelines için kullanılan web arayüzüdür. Kullanıcıların Tekton Pipelines nesnelerini izleme ve yönetmelerini sağlar. https://github.com/tektoncd/dashboard
- CLI: Tekton’la iletişim kurmak için kullanılabilecek bir command line interface’tir. https://github.com/tektoncd/cli
- Triggers: CI/CD akışlarını tetikleyen event mekanizmalarıdır. https://github.com/tektoncd/triggers
- Hub: Geliştiricilerin Tekton’da tanımlanmış pipeline nesnelerini paylaşabilecekleri, alıp kullanabilecekleri ve pipeline nesneleri üzerinde katkıda bulunabilecekleri bir platformdur. Halen geliştirme halindedir. https://github.com/tektoncd/hub
Tekton’u kullanabilmek için Pipelines kurulması yeterlidir, Triggers, CLI ve Dashboard opsiyoneldir.
Model
Tekton aşağıdaki temel bileşenlerden oluşur:
Step
CI/CD akışındaki operasyonlardan biridir. Tekton her step’i verdiğiniz bir container image’ı ile çalıştırır. Step’e örnek olarak; bir Python web uygulamanızın unit testlerini çalıştırmayı ya da Go programınızın lokal makinanızda yapıyormuşçasına resmi Go image’ını kullanarak compile etmeyi verebiliriz.
Aşağıdaki tanımı görülen step, bir Node script çalıştırır:
steps:
- image: node # contains node
script: |
#!/usr/bin/env node
console.log(“Hello from Node!”)
Task
Sıralı steplerden oluşan bir koleksiyondur. Tekton bir task’a ait adımları, tek pod içerisinde containerlar halinde çalıştırır. Böylece birbiriyle ilişkili adımların çalıştığı ortak bir ortam oluşturulur ve bu ortamdaki kaynaklar paylaşılabilir. Örneğin; bir task içerisinde Kubernetes volume mount ettiğinizde, tüm adımlar tarafından erişilebilir olacaktır.
Aşağıda 2 adımlı bir Task göreceksiniz. results alanında current-date-unix-timestamp ve current-date-human-readable isimli 2 dosya tanımlar ve bu dosyaların içini doldurur.
apiVersion: tekton.dev/v1beta1kind: Taskmetadata:name: print-dateannotations:description: |A simple task that prints the datespec:results:- name: current-date-unix-timestampdescription: The current date in unix timestamp format- name: current-date-human-readabledescription: The current date in human readable formatsteps:- name: print-date-unix-timestampimage: bash:latestscript: |#!/usr/bin/env bashdate +%s | tee /tekton/results/current-date-unix-timestamp- name: print-date-humman-readableimage: bash:latestscript: |#!/usr/bin/env bashdate | tee /tekton/results/current-date-human-readable
TaskRun
Bir task’ın, pipeline dışında tek başına yaptığımız spesifik bir koşumudur. Aşağıda bir örneğini bulabilirsiniz.
apiVersion: tekton.dev/v1beta1kind: TaskRunmetadata:name: read-repospec:taskRef:name: read-taskresources:inputs:- name: workspaceresourceSpec:type: gitparams:- name: urlvalue: https://github.com/pivotal-nader-ziada/gohelloworld
Pipeline
Sıralı tasklardan oluşan bir akıştır. Tekton bütün taskları toplar ve hepsini düz tek yönlü bir akış içerisinde çalıştırır. Diğer bir ifadeyle, bir grup Kubernetes pod’u yaratır ve her bir pod’un başarılı bir şekilde çalıştığından emin olmaya çalışır. Tekton geliştiricilere bu akış üzerinde tüm kontrolü sağlamaktadır.
apiVersion: tekton.dev/v1beta1kind: Pipelinemetadata:name: pipeline-with-parametersspec:params:- name: contexttype: stringdescription: Path to contextdefault: /some/where/or/othertasks:- name: build-skaffold-webtaskRef:name: build-pushparams:- name: pathToDockerFilevalue: Dockerfile- name: pathToContextvalue: "$(params.context)"
PipelineRun
İsminden de anlaşılacağı üzere, bir pipeline’ın spesifik bir koşumu anlamına gelmektedir. Örneğin; günde 2 kez Tekton’a çalıştırması için verdiğiniz bir akışınız, her biri ayrı pipelineRun resource’u olarak izlenebilir olacaktır.
Örnek bir PipelineRun için;
apiVersion: tekton.dev/v1beta1kind: PipelineRunmetadata:name: mypipelinerunspec:pipelineRef:name: mypipelinepodTemplate:securityContext:runAsNonRoot: truevolumes:- name: my-cachepersistentVolumeClaim:claimName: my-volume-claim
Önemli bir nokta: Tasklar, pipelinelar ve pipelineResourcelar Kubernetes cluster üzerinde custom resource olarak yaratılmaktadır.
PipelineResource
Bir pipeline ya da task’a verilen input veya outputlardır. Bir compilation task’ı örneğin, bir git reposunu input olarak alıp, output olarak bir container image’ı üretir. Aslında pipelineResource’lar sayesinde, task ve pipeline’larımızı yeniden kullanabilir oluruz. Aynı pipeline’a verilen farklı resource’lar bize bu esnekliği sağlamaktadır.
Tekton pekçok farklı tip resource desteklemektedir:
· git: Git repositoryleri,
· Pull Request: Bir git repository içerisindeki spesifik bir pull request,
· Image: Bir container image’ı,
· Cluster: Bir Kubernetes cluster’ı,
· Storage: Bir blob store üzerindeki bir obje veya klasör,
· CloudEvent: Bir CloudEvent’i resource olarak kullanılabilir.
TaskRun ve PipelineRun Kavramları
taskRun da benzer olarak bir task’ın, pipeline dışında tek başına yaptığımız spesifik bir koşumudur.
taskRun ve pipelineRun kavramları resourcelar ile task ve pipeline nesnelerini birbirine bağlar. taskRun veya pipelineRun içerisinde kaynakların gerçek adreslerinin bulunması gerekir, örneğin repoların URL adresleri gibi. Böylece task ve pipeline’ları farklı input’lar ile tekrar tekrar kullanmamız mümkün olur.
taskRun ve pipelineRun’lar manuel ya da Tekton Triggers ile bir event ile tetiklenecek şekilde çalıştırılabilir. Örn; yeni bir pull request repository’nize merge olduğunda çalışacak şekilde bir pipelineRun otomatize edebilirsiniz.
Tekton Nasıl Çalışır?
Üst düzeyden bakarsak, Tekton her step’i sarmalayarak çalışır. Her step’teki container’a bir entrypoint binary’si enjekte eder, bu da verdiğiniz komutu hazır olduğunda çalıştırır.
Tekton’da Kubernetes Annotations kullanılarak pipeline’ın durumu takip edilir. Bu anotasyonlar, Kubernetes Downward API dosyaları kullanılarak her step’in container’ına yansıtılır. entrypoint binary’si bu dosyaları yakından izler ve beklediği anotasyon dosya olarak oluştuğu zaman verilen komutu çalıştırır. Örneğin; bir Tekton task’ında 2 step mevcut ise, 2. adımın container’ına enjekte edilen enrypoint binary’si 1. adımın container’ının tamamlandığı bilgisini alana kadar bekler.
Bunlara ek olarak, Tekton; step container’larınızın önünde ve arkasında çalışmak üzere bazı container’lar hazırlar. Böylece Tekton pipelines kendi içerisindeki bazı özellikleri, örneğin input resource’ları almak veya output resource’ları bir yerlere göndermek gibi işleri yapar. Bunların da durumları ayrıca takip edilebilir.
Muhtemelen bu noktaya kadar hala neden Jenkins’ten vazgeçmeniz gerektiğinden emin değilsiniz — ya da Tekton’dan önce zaten vazgeçmiştiniz :) (Şuraya minik bir kızgın Jenkins fanı çizelim). Elinizdeki CI/CD araçlarının böyle bir devrime neden ihtiyaç duyduğunu henüz farketmemiş de olabilirsiniz. Bu noktada tahminim, ya henüz size pipeline’larınız ciddi bir darboğaz yaratmamıştır ya da Cloud Native uygulamalardan çok Cloud Hosted uygulamalar ile meşgulsünüzdür. Tekton’un esnekliği ve gücünü aklınızın bir kenarına yazın, gerçekten ihtiyaç duyduğunuzda alet çantanızda olduğuna memnun olabilirsiniz.
Bir sonraki yazıda güzel bir deployment senaryosu ile görüşmek üzere.