Kubernetes: init konteyner nasıl oluşturulur ve kullanılır?

K8s veya Kube olarak kısaltılan Kubernetes, başlangıçta Google tarafından geliştirilen ancak şu anda bir topluluk projesi olan etkili bir konteyner düzenleme aracıdır.  Bu araç, konteyner dağıtımını otomatikleştirmek ve ölçeklendirmek için kullanılır.  Son günlerde kalıpları, iş yükü türlerini ve davranışları tasarlama yeteneği sayesinde Kubernetes’in ve ekosisteminin popülaritesi büyük ölçüde arttı.

Taçtaki mücevherlerden biri de init konteyner özelliğidir.  Bu özellik iş yüklerinin başlatılmasında birçok avantaj sağlar.

Init ​​Konteyneri nedir?

Bir init konteyneri, değiştirilmiş operasyonel kurallara ve davranışa sahip bir konteyner olarak tanımlanabilir.  Normalde uygulama görüntüsünde bulunmayan yardımcı programları ve kurulum komut dosyalarını içerirler.  İnit konteynerlerinin en belirgin özelliği uygulama konteynerlerinden önce başlayıp bitmeleridir.

Tek bir bölmede, bir veya daha fazla init konteyneriyle çalışan birden fazla konteyner de olabilir.  Init kapsayıcıları, uygulama kapsayıcılarına benzer özelliklere ve alanlara sahiptir.  Bu özellikler birimleri, güvenlik ayarlarını ve kaynak sınırlarını içerir, ancak init kapsayıcılarındaki kaynak sınırları farklı şekilde ele alınır.

İnit konteynerleri ile normal konteynerler arasındaki temel farklar şunlardır:

  • Başlatma kapsayıcıları her zaman tamamlanana kadar çalışır.
  • Bir sonraki başlamadan önce her başlatma kabının başarıyla tamamlanması gerekir.

Yukarıdakilere ek olarak, init konteynerleri livenessProbe, readinessProbe, startupProbe veya lifecycle’ı desteklemez; çünkü kapsülün hazır olması için tamamlanmaya kadar çalışmaları gerekir.  Normalde, bir bölmede birden fazla başlatma kabı belirtildiğinde kubelet bunları sırayla çalıştırır.  Her konteynerin bir sonraki çalıştırmadan önce başarılı olması gerekir.

Bir başlatma bölmesi başarısız olduğunda Kubelet, başarılı olana kadar onu tekrar tekrar yeniden başlatır.  Bununla birlikte, bölmenin Hiçbir Zaman yeniden başlatma Politikası varsa ve başlatma Bölmesi başarılı bir şekilde çalışmazsa, genel bölme başarısız bir bölme olarak ele alınır.

Init konteynerleri aşağıdaki alanlarda kullanılır:

  • Kasadan şifrelenmiş sırları alın ve bunları bir dosya sistemine yazın
  • Kendisini benzerleri arasında kaydetmesi gereken bir blockchain uygulaması
  • Veritabanı geçişleri/tohum uygulama – Bir veritabanından alınan ve uygulamanın başlatıldıktan sonra çalıştırılması için önbelleğe alınan dinamik veriler
  • Kimlik sağlayıcıdan erişim belirteci alması gereken bir uygulama
  • Kimlik bilgileri gerektiren bir git deposundan veya bulut depolama alanından varlıklar getiriliyor.
  • Pod IP’si, atanmış harici IP, ana bilgisayar adı, harici giriş IP’si vb. gibi çalışma zamanı özelliklerini kullanarak yapılandırma dosyaları oluşturma.

Bu kılavuz, Kubernetes’te init kapsayıcılarının nasıl oluşturulacağı ve kullanılacağı hakkında genel bir bakış sağlar.

Başlamadan önce

Zaten bir Kubernetes kümesi kurulumunuzun olduğunu varsayıyorum.  Değilse Kubernetes kümesi kurmak için aşağıdaki kılavuzları kullanabilirsiniz.

Küme yapılandırıldıktan sonra onu yönetmek için kubectl yardımcı programını kullanabilirsiniz.  Aşağıdaki gibi yükleyin:

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin

Kümeyi yönetebilmek için yönetici yapılandırmasını dışa aktarın.

# For k0s
export KUBECONFIG=/var/lib/k0s/pki/admin.conf

Kubernetes’te Init Konteynerleri Oluşturma ve Kullanma

Init konteynerlerinin kullanılabileceği çeşitli yollar vardır.  Bunlardan bazıları şunlar olabilir:

  • Bir hizmetin kabuk komutunu kullanmaya başlaması bekleniyor:
for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
  • Uygulama kapsayıcısı başlatılmadan önce bir süre bekleniyor.
sleep 120
  • Bu Pod’u aşağı doğru API’den uzak bir sunucuya bir komutla kaydedin:
curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d 'instance=$(<POD_NAME>)&ip=$(<POD_IP>)'

Bu kılavuz, iki Init kapsayıcısıyla basit bir bölme oluşturarak daha pratik bir örnek sağlar. Normalde, init kapsayıcıları pod.spec.initContainers dizisinde tanımlanırken, uygulama kapsayıcıları “pod.spec.containers dizisinde” tanımlanır.

Burada servis bekleyen ilk init konteynerimiz ve veritabanını bekleyen diğer konteynerimiz olacak.

Yapılandırma dosyasını oluşturun.

vim application.yaml

Dosya aşağıdaki satırları içerecektir:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-service
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup service.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for service; sleep 2; done"]
  - name: init-db
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup database.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for database; sleep 2; done"]

Manifest’i uygulayın.

$ kubectl apply -f application.yaml
pod/myapp-pod created

Pod’un durumunu kontrol edin.

$ kubectl get -f application.yaml
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          23s

Alternatif olarak şunu kullanın:

$ kubectl get pod myapp-pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          65s

Çıktıda iki init konteynerimiz var.  Bölmeyi açıklayarak daha fazla ayrıntı görüntüleyebilirsiniz:

$ kubectl describe -f application.yaml
Name:         myapp-pod
Namespace:    default
Priority:     0
Node:         debian/192.168.205.4
Start Time:   Sun, 24 Apr 2022 10:29:34 +0000
Labels:       app=myapp
Annotations:  kubernetes.io/psp: 00-k0s-privileged
Status:       Pending
IP:           10.244.1.3
IPs:
  IP:  10.244.1.3
Init Containers:
  init-service:
    Container ID:  containerd://7ca9c41dbf829d3be660a68eb5dce4ebbe8902b6ae0562bbbd723453898ef9ce
    Image:         busybox:1.28
    Image ID:      docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      until nslookup service.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for service; sleep 2; done
    State:          Running
      Started:      Sun, 24 Apr 2022 10:29:38 +0000
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-l29rv (ro)
  init-db:
    Container ID:  
    Image:         busybox:1.28
    Image ID:      
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -c
      until nslookup database.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for database; sleep 2; done
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:    <none>
.......

Bölmedeki (uygulamam) başlangıç ​​kapsayıcılarının günlüklerini şu komutla inceleyin:

# Inspect the first init container
kubectl logs myapp-pod -c init-service 

# Inspect the second init container
kubectl logs myapp-pod -c init-db      

Çıktı, Init konteynerlerinin hizmet veritabanının ve hizmetinin çalışmasını beklediğini gösteriyor.

So we will create the two services as below:

vim service.yaml

Aşağıdaki satırları buna ekleyin.

---
apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
  name: database
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377

Hizmetleri şu komutla oluşturun:

$ kubectl apply -f service.yaml
service/service created
service/database created

Şimdi bölmenin durumunu kontrol edin.

$ kubectl get -f application.yaml
myapp-pod   1/1     Running   0          4m52s

İki Init kapsayıcısı başarıyla başlatıldı ve sonlandırıldı; bu, uygulama kapsayıcısının (myapp-pod) da başlatılmasına izin verdi.  Bu, Kubernetes’te init konteynerlerinin nasıl oluşturulacağı ve kullanılacağı hakkındaki bu kılavuzu finale getiriyor.  Artık toplanan bilgileri Kubernetes’te kendi Init konteynerlerinizi oluşturmak için kullanabilirsiniz.

 

Yazının orijinalini buradan okuyabilirsiniz.

 

 

 

 

Skip to content