Kaniko ile container image build/push

--

docker kullanmadan kaniko ile image nasıl build edeceğiz bunu anlatacağım. basit bir ci/cd ile kubernetes deployment yapacağız.

çoğu production ortamı pipelinelarında build ve push aşamasında genelde jenkins podu ya da docker olan bir sunucu kullanıyor yani build ve push aşaması için docker bağımlılığı var.

geleneksel yapıda jenkins docker daemon çalışan bir node a applicationın buildini aldırıp push ettirir böylece daha sonra deploy aşamasında kullanabiliriz.

bunu yaparken docker çalışan sunucuda docker sock a erişim ihtiyacı duyar bu da belli bir güvenlik sorunlarını da beraberinde getiriyor. ayrıca bir host a ihtiyaç duyması sebebiyle serverless bir çözüm sunmuyor.

bildiğiniz gibi kubernetes docker ile olan bağını 1.24 ile beraber tamamen kesecek bu yüzden kubernetes clusterları artık sadece container runtime olan containerd ile çalışıyor olacak. bu sebeple artık geleneksel yapının olmadığı ci/cd yapıları kurmamız gerekiyor burada yardıma kaniko yetişiyor.

KANIKO

kaniko google tarafından geliştirilmiş container image build ve push tooludur. docker daemon a access olmadan bunu yapar. ve bunu serverless şekilde yapması sebebiyle management ı çok daha kolaydır.

kanikoyu herhangi bir yerde çalıştırabilirsiniz, amazonda bir ecs olabilir remote bir kubernetes cluster olabilir. öncelikle bir jenkins kuralım hepsi bir arada olması için kuberentes clusterıma helm ile kuracağım.

kubernetes olarak kubeadm ile kurduğum 1 master 1 worker olan cluster kullanacağım. en son kurulum bilgileri için aşağıdaki yazımdan faydalanabilirsiniz. ben aynı clusterı kullanacağım.

cluster a bakacak olursak.

jenkins install

şimdi helm ile jenkins kuracağız ben genelde helm kullanırken values değerlerini dışarı çekip orda değişiklik yaparak daha sonra o şekilde kuruyorum.

helm repo add jenkinsci https://charts.jenkins.io
helm repo update
helm show values jenkinsci/jenkins > jenkins.yaml

sırayla komutları çalıştırıp değerleri set edelim daha sonra da kurulum yapacağız.

helm install jenkins jenkinsci/jenkins --values jenkins.yaml -n jenkins --create-namespace

jenkins kurduktan sonra nodeport olan 31843 den erişebileceğiz.

jenkins pipeline

jenkins agent olarak kubernetes kullacağız ve pod için aşağıdaki builder yaml kullanacağız, podun içinde 2 tane container çalışacak bir tanesi build ve push için kaniko, diğeri de kubernetes deployment için kubectl olacak. pipeline çalıştığında kubernetes bu pod ayağa kalkarak bütün işleri yapacak.

burada önemli kısım dockerhub credentials olacak.

apiVersion: v1
kind: Pod
metadata:
name: kaniko
spec:
containers:
- name: kubectl
image: joshendriks/alpine-k8s
command:
- /bin/cat
tty: true
- name: kaniko
image: gcr.io/kaniko-project/executor:debug
command:
- /busybox/cat
tty: true
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker
volumes:
- name: kaniko-secret
secret:
secretName: regcred
items:
- key: .dockerconfigjson
path: config.json

burada önemli olan dockerhub credentials olacak bunu kubernetes e eklerken aşağıdaki şekilde secret olarak yapıyoruz.

kubectl create secret docker-registry regcred --docker-server=https://index.docker.io/v1/ --docker-username="your username" --docker-password="your password" --docker-email="your email" -n jenkins

yarattım.

application için basit bir flask kullanacağız.

requirements.txt içinde sadece “Flask>=1.0.0” olacak ve dockerfileımız.

FROM python:alpine3.15

WORKDIR /usr/src/app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

CMD ["python", "./app.py"]

deployment fileımız ise aşağıdaki gibi basit bir simple deployment.

jenkinsfile ımıza bakarsak,

2 basit stage den oluştuğunu görebilirsiniz. ilk stage verdiğimiz app.py ve dockerfile ile bir image oluşturacak ve pushlayacak.

ikinci stage de deployment file da bulunan TAG kısmı sed ile değişip kubernetese deployment olacak.

(manage pluginsden ansiColor yükledim outputlar daha iyi gözüksün diye)

burada kubeconfig file ı credentials olarak ekleyeceğiz.

yeni item yaratıp pipeline seçiyoruz, SCM seçip github reposunu yazıyoruz.

Kubernetes

kubernetes i agent olarak kullanmak için kubernetes plugin i yükleyip manage and cloud sekmesinden kubernetes i göstereceğiz.

bu konuyu anlamak için yazımdan faydalanabilirsiniz ben kurulmuş şekilde devam edeceğim.

ve çalıştırdıktan sonra basit 2 adımda ci/cd yi tamamlamış olacağız.

nodeport üzerinden gidip uygulamamıza bakarsak çalıştığını görürüz daha sonra code umuzu değiştirelim ve tekrar ci/cd başlatalım bittiğinde uygulamamızın değiştiğini görebilirsiniz.

dockersız build ve push gerçekten kaniko ile basit, daha az priveleged vererek daha az layerla ve stagele sıkıntısız halledebiliyoruz. ileride çok değerlenecek bir tool hızlıca deneylimleyin :)

görüşmek üzere

h.a.s.

--

--