Dünya çapında pek çok kişi, docker soketini bağlamaya veya kümenizin güvenliğini tehlikeye atacak başka herhangi bir eylem gerçekleştirmeye gerek kalmadan Kubernetes’te konteyner görüntüleri oluşturmanın yollarını arıyor. İhtiyacın artmasıyla birlikte ünlü bir yazılım mühendisi olan Jessie Frazelle, Img görüntü oluşturucuyu tanıtma ihtiyacını gördü. Bu, açık kaynaklı, arka plan programı olmayan ve ayrıcalığı olmayan bir Dockerfile ve OCI uyumlu konteyner görüntü oluşturucusudur. Img, Img’ye gömülü bir yapı teknolojisi olan açık kaynaklı BuildKit’i çevreleyen bir sarmalayıcıdır.
img görüntü oluşturucuyla ilişkili birçok özellik vardır. Onlardan bazıları:
- Img CLI, Konteyner görüntüsü oluşturma, dağıtım ve görüntü işlemeyle uğraşırken Docker CLI komutlarına benzer bir dizi komut sağlayan duyarlı bir CLI.
- Rootless Builds: img, –privileged Docker bayrağına veya Kubernetes’teki eşdeğer ayrıcalıklı: gerçek güvenlik bağlamına ihtiyaç duymadan çalıştırılabilir.
- BuildKit: konteyner görüntüleri için yeni nesil yapı motorlarından biri olarak tanımlanır.
- Parallel Build Execution: BuildKit, derleme adımlarının dahili bir temsilini Yönlendirilmiş Döngüsel Grafik (DAG) olarak bir araya getirir ve bu, hangi derleme adımlarının paralel olarak yürütülebileceğini belirlemesine olanak tanır.
- Cross-Platform/OS Builds: tamamen farklı bir platformda farklı mimari ve işletim sistemi kombinasyonları için görüntüler oluşturmak mümkündür
Bu kılavuzda, img image builder’ı kullanarak Kubernetes’te konteyner görüntülerinin nasıl oluşturulacağına derinlemesine bakacağız.
Kurulum Önkoşulları
Bu kılavuz, Github ile Kubernetes’te img görüntü oluşturucuyu kullanarak Dockerfile’dan kapsayıcı görüntülerin nasıl oluşturulacağını gösterecektir. Yani ayrıca şunlara da ihtiyacınız olacak:
- Pod’ları, işleri ve hizmetleri oluşturma, listeleme, güncelleme ve silme izinleriyle Kubernetes kümesine erişim
- Dockerfile içeren Github deposu: repo URL’sini Dockerfile’ın yolu olarak kullanacağız
- Dockerhub hesabı: Docker görüntüsünün kimliğini doğrulayabilmek ve aktarabilmek için.
#1.Build Contexts Yapılandırma
Bu kılavuz için derleme bağlamımız olarak özel bir GitHub deposu kullanacağız. Gerekli Dockerfile ile yapılandırmamız gerekiyor.
Bu makalede kullanılan özel git havuzumun URL’si:
https://github.com/computingforgeeks/kubernetes-demo
Depoda aşağıdaki içeriğe sahip bir Docker dosyası oluşturacağım:
FROM ubuntu
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
Şimdi git hesabınıza bir Kişisel Erişim Jetonu edinin.
#2. Img Pod Bildirimini Oluşturun
İki konteynerimiz olacak:
- Git-sync: özel git deposunu klonlamak için bir init konteyneri
- img: bu, docker görüntüsünü oluşturur ve onu dcoker hub’ına iter
Bu iki konteyner /repo’da emptyDir olarak monte edilmiş bir git-repo hacmini paylaşıyor
Kapsül için bir bildirim oluşturun.
vim pod.yml
Aşağıdaki satırları manifest dosyasına ekleyin:
apiVersion: v1
kind: Pod
metadata:
labels:
run: img
name: img
annotations:
container.apparmor.security.beta.kubernetes.io/img: unconfined
spec:
securityContext:
runAsUser: 1000
initContainers:
- name: git-sync
image: k8s.gcr.io/git-sync:v3.1.5
volumeMounts:
- name: git-repo
mountPath: /repo
env:
- name: GIT_SYNC_REPO
value: "https://github.com/computingforgeeks/kubernetes-demo.git" ##Private repo-path-you-want-to-clone
- name: GIT_SYNC_USERNAME
value: "computingforgeeks" ##The username for the Git repository
- name: GIT_SYNC_PASSWORD
value: "ghp_JilxkjTT5EIgJCV........" ##The Personal Access Token for the Git repository
- name: GIT_SYNC_BRANCH
value: "master" ##repo-branch
- name: GIT_SYNC_ROOT
value: /repo
- name: GIT_SYNC_DEST
value: "hello" ##path-where-you-want-to-clone
- name: GIT_SYNC_ONE_TIME
value: "true"
securityContext:
runAsUser: 0
containers:
- image: r.j3ss.co/img
imagePullPolicy: Always
name: img
resources: {}
workingDir: /repo/hello
command: ["/bin/sh"]
args:
- -c
- >-
img build -t docker.io/<dockerhub_username>/helloworld . &&
img login -u <dockerhub_username> -p <dockerhub_password> &&
img push docker.io/<dockerhub_username>/helloworld
volumeMounts:
- name: cache-volume
mountPath: /tmp
- name: git-repo
mountPath: /repo
volumes:
- name: cache-volume
emptyDir: {}
- name: git-repo
emptyDir: {}
restartPolicy: Never
Yukarıdaki dosyada değerleri uygun şekilde değiştirin. Ayrıca git-sync’in hedef klasörünün img’nin çalışma dizini olduğunu da fark edebilirsiniz. Genel bir git deposu kullanıyorsanız Git deposu için Kişisel Erişim Simgesini sağlamanız gerekmeyebilir.
#3. Kubernetes’te img image builder’ı çalıştırma
Bildiriyi kullanarak şu komutu kullanarak bölmeyi çalıştırın:
kubectl apply -f pod.yml
Şimdi görüntü oluşturma ve gönderme işlemini şu komutla izleyin:
kubectl logs img --follow
Çıktı:
Yukarıdaki çıktıdan görüntünün DockerHub’a başarılı bir şekilde aktarıldığı sonucuna varabiliriz.
#4. Görüntüyü Çekin ve Test Edin
Artık aşağıdakileri kullanarak görüntüyü çekip test edebilirsiniz:
1. Docker
Sisteminizde Docker’ın kurulu olduğundan emin olun.
Şimdi şu komutu kullanarak görüntünün bulunduğu bir kapsayıcı çalıştırın:
docker run -it <user-name>/<repo-name>
Örneğin:
docker run -it klinsmann1/helloworld:latest
Örnek çıktı:
2. Kubernetes
Aktarılan görüntü Kubernetes’te hâlâ kullanılabilir. Görüntüyü aşağıdaki gibi çekip test edin;
$ vim deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
selector:
matchLabels:
app: hello
replicas: 1
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello-world
image: klinsmann1/helloworld:latest
Manifest’i uygulayın:
kubectl apply -f deploy.yml
Dağıtımın durumunu kontrol edin:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-7f68776d79-h4h4z 0/1 Completed 1 (4s ago) 6s
img 0/1 Completed 0 13m
Yürütmenin başarılı olup olmadığını doğrulayın.
$ kubectl logs hello-world-7f68776d79-h4h4z --follow
hello
Yazının orijinalini buradan okuyabilirsiniz.
Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.