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.
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.