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

Many people around the world look for ways to build container images in Kubernetes without the need to mount the docker socket or perform any other action that compromises security on your cluster. With the increased need, a famous software engineer, Jessie Frazelle saw the need to introduce Img image builder. This is an open-source, daemon-less, and unprivileged Dockerfile and OCI compatible container image builder. Img is a wrapper around the open-source BuildKit, a building technology embedded within Img.

There are many features associated with the img image builder. Some of them are:

  • Img CLI, a responsive CLI that provides a set of commands similar to Docker CLI commands when dealing with container image building, distribution, and image manipulation.
  • 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