Kubernetese: img image builder’ı konteyner imaj oluşturma

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.

Skip to content