KUBERNETES DEPLOY with GITLAB CI/CD complete tutorial (Kaniko build)

sadece gitlab kullanarak ekstra bir ortam kullanmadan mevcut kubernetes ortamınıza nasıl build, deploy işlemi yapacağınızı anlatacağım.

Genelde projelerimde azure devops tercih edederim fakat son projelerimde gitlab ci la çalışmaya başladım.

CI ve CD de hiç bir ekstra host kullanmadan hepsini gitlab üzerinden yapıyorsunuz. Jenkinsin o özellikle variable ve karışık pipeline ı ile uğraşmaktan çok çok daha kolay olduğunu göreceksiniz.

gelin adım adım docker build + docker push + kubernetes deploy u nasıl yaptığımızı inceleyelim.

GITLAB PROJE

öncelikle bir repo açıp içine build alacağımız code u koyalım basit bir hello world seçelim. özellikle backend olarak çok tercih edilmesi yüzünden .net core kullanacağım.

gitlab üzerinde free bir üyelik açıp proje create edip githubdan daha önce forkladığım bir repoyu import edeceğim.

siz de kullanabilirsiniz.

GITLAB KUBERNETES CONNECTION

ikinci aşama olarak gitlab ile kubernetesi bağlayacağız bu neye yarıcak kubeconfig file alıp kubectl çalıştırana kadar bir agent yardımı ile kubernetes api üzerinden deploy yapacağız. ArgoCD mantığı diyebiliriz.

ben kubernetes olarak AKS kullanacağım.

ben mevcut proje üzerinden kubernetes connect olacağım. birden fazla projeniz varsa tek bir connectionı da diğer projelerde kullanabiliyorsunuz. yeterki projeler aynı group ya da subgroup altında olsun.

kubernetes clustera gitlab connect olacağı agent ı kurmak için bize herşeyi hazır olan helm komutunu veriyor. helm kubernetes için bir package managerdır. kuracağınız uygulamaların bütün bağımlılıklarını beraber kurmanıza yarar.

helm i kurmak için offical sitesinden faydalanabilirsiniz.

tek seferde agent kurulumu yapmış olduk ve agent podlar running olduğunu gördük.

gidip sayfaya baktığımızda clusterın yeşil olduğunu görebiliriz.

kubernetes clusterdan clusterrolebinding lere baktığınızda gitlab agent ın cluster-admin olduğunu görürsünüz.

pipelinelarda artık çok basit bir şekilde bu agent üzerinden clustera deploy yapabileceğiz.

GITLAB RUNNER

gitlab runner bildiğiniz ci/cd toollarındaki agent mantığında çalışır. yani build push deployu yapacak bir slavedir. shared runner kullanabildiğiniz gibi kendiniz bir host üzerinde bu runnerları çalıştırabilirsiniz.

bizim burda en büyük bağımlılığımız docker oluyor. çünkü code u Dockerfile yardımı ile bir image e çevirip (build dediğimiz işlem), daha sonra da bir image registry ye koymamız gerekiyor (push dediğimiz işlem) bu yüzden bir host açıp üstüne docker yükleyebiliriz. fakat ben yazının başında dediğim gibi başka herhangi bir yer kullanmayacağım.

gitlab runner ları kubernetes üzerinde kuracağım. burda challenge olarak kubernetes in artık docker altyapısını kullanmaması geliyor. bunu da KANIKO ile halledeceğim. docker olmadan docker build alacağız :) kulağa garip geliyor olabilir ama yapınca ne kadar basit olduğunu anlayacaksınız.

öncelikle runner kuralım.

size runner kurulumu için gereken tek şey registration code. ( eğer gitlab de organizationınız varsa onun URLi yoksa https://gitlab.com) onu da size hazırladığım values.yaml a girerek tek komutla kuracaksınız.

aşağıdaki values.yaml paylaşıyorum.

önemli yerleri detaylandırırsak;

concurrent:

aynı anda kaç job birlikte çalışacağını belirtiyorsunuz burayı dilediğiniz kadar artırabilirsiniz gitlab-runner çalışacak podlar açacaktır. fakat kaynaklarınızı dikkatli kullanmalısınız sonuçta kubernetes workloadlarınızın olduğu clusterda çalışacaksa limit koymalısınız yoksa kubernetes de bulduğu kaynağı kullanıyor build alırken.

runners:

burda runnerların hangi image çalıştıracağını ayarlayacağız alpine ya da ubuntu tercih edilebilir. önemli olan resourcelar concurrentde bahsettiğim gibi ne kadar cpu ve mem yiyecek bunlar belirtilmeli gerisi aynı bırakılabilir.

şimdi registration code alalım.

aldığımız code ile values ü güncelledikten sonra helm ile kurabiliriz.

helm install gitlab-runner --namespace gitlab-runner -f gitlab-runner-values.yaml gitlab/gitlab-runner --create-namespace

install sonrası project runnerlarında eklediğimiz runner ı görebiliyoruz. verdiğimiz tag sayesinde de pipeline üzerinde bu runnerı seçebileceğiz.

GITLAB CI/CD

gitlab üzerinde ci/cd mevcut reponuza bir yaml dosyası ekleyerek yapıyorsunuz.

bu hazır bir basit bir pipeline build ve deploy yapıyor. kaniko credentials ları gitlabci yaml daki variableden alacak. isterseniz bu variable ları güvenli olması sebebi ile CI/CD altında variables sekmesinden yapabilirsiniz. pipeline gene görecektir.

deployment yaml olarak da aşağıdakini kullanacağım. deploy anında sed ile yakalayıp tag i değiştiricem.

apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 2
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: hasanalperen/myapp:VERSION
ports:
- containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
name: app
spec:
selector:
app: app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP

repoya yaml file .gitlab-ci.yml olarak koyup commit ettiğiniz an otomatik pipeline oluşup job başlayacaktır.

pipeline başladığı anda kubernetes bir tane pod oluşturacak runner ın olduğu yerde.

bu pod içinde kaniko olan bir container ile build işlemini yapacak ve registry e pushlayacak.

build arkasında deploy çalışacak ve kubernetes e deployment yapacak.

daha sonra içinde kubectl olan bir image çağırıp context yani kubernetes bilgisini kurduğumuz agentdan alıp, repo içindeki deployment.yaml i kubernetes e deploy edecek.

kubernetes deploymentimiz tamamlandı.

SONUÇ

baştan sona sadece sadece gitlab ve kubernetes cluster kullanarak hem ci hem cd yapmış oldu.

agent için ayrı makine açmadık ayrıca docker bağımlılığından kurtulduk.

umarım faydalı bir yazı olur. gitlabci a başlayacaklar için basit bir şekilde anlatmaya çalıştım birebir uygularsanız sorunsuz çalışacaktır.

görüşmek üzere

h.a.s.

beni linkedinden takip etmek için: https://www.linkedin.com/in/hasanalperenselcuk/

SOURCE LINKS:

--

--