Init Container
Init Container Nedir?
Bir podun içerisinde birden fazla konteyner çalıştırılması durumuna multi-container denir. Init Container’ın multi-container’dan farkı, adından da anlaşılacağı üzere initialization (başlatma/hazırlık) süreçleri için kullanılmasıdır.
Örnek senaryo
Bir WordPress uygulamanız var ve bir script yazdınız. Bu script internetten WordPress’in kullanması gereken bazı dosyaları indiriyor. Bu scripti bir Init Container olarak oluşturursunuz, WordPress ise normal (ana) konteyner olarak oluşturulur.
İşleyiş şu şekildedir:
- Öncelikle Init Container çalışır.
- Init Container işini bitirdiğinde (içindeki process sonlandığında) kapanır.
- Init Container kapandığı anda, asıl çalışması gereken ana konteyner başlatılır.
Örneğin WordPress’in çalışmasının mantığı yoktur eğer gerekli dosyalar internetten önceden indirilmemişse. Önce dosyalar indirilir, indirme tamamlandıktan sonra Init Container kapanır (çünkü içindeki process sonlanınca konteyner da kapanır), ardından WordPress çalışmaya başlar. Böylece WordPress için ortam hazırlanmış olur.
Bir başka örnek: Uygulamanın çalışabilmesi için önce bir registration (kayıt) işlemi yapılması gerekiyorsa, registration işlemini yapan konteyner işini bitirip kendini kapatır, sonrasında asıl çalışması gereken uygulama konteyneri başlar. Buna Init Container denir.
Init Container Özellikleri
- Uygulama (ana) container başlatılmadan önce ilk olarak init container çalışır.
- Init container yapması gereken işlemleri tamamlar ve kapanır.
- Uygulama container, init container kapatıldıktan sonra çalışmaya başlar.
- Init container işlemlerini tamamlamadan uygulama container başlatılmaz.
- Bir podda birden fazla init container tanımlanabilir; bunlar sırasıyla çalıştırılır.
Örnek Manifest: podinitcontainer.yaml
apiVersion: v1
kind: Pod
metadata:
name: initcontainerpod
spec:
containers:
- name: appcontainer
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: initcontainer
image: busybox
command: ['sh', '-c', "until nslookup myservice; do echo waiting for myservice; sleep 2; done"]Açıklama
apiVersion: v1, kind: Pod ile bir pod oluşturuyoruz, ismi initcontainerpod.
Ana container:
containers:
- name: appcontainer
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']Ana container basit bir “hello world” uygulamasıdır.
Init container:
initContainers:
- name: initcontainer
image: busybox
command: ['sh', '-c', "until nslookup myservice; do echo waiting for myservice; sleep 2; done"]Init container başladığında myservice adında bir servisi DNS üzerinden aramaya (nslookup) başlar:
- Eğer
myserviceiçin olumlu bir cevap alamazsa, "waiting for myservice" yazdırır ve 2 saniye bekler; bu döngü şeklinde devam eder. nslookup myserviceolumlu bir dönüş aldığı anda döngüden çıkar ve kendini kapatır.
Bu şekilde initContainers başlatılır, DNS sorgusu cevap alana kadar aramaya devam eder. Cevap aldığı andan itibaren konteynerin işi bitmiş olur ve konteyner kendini kapatır; ardından ana container çalışmaya başlar. Amaç: servise erişilemiyorsa ana container'ın boşuna ayağa kalkmasını engellemektir — servise erişilemiyorsa zaten o container'ın çalışmasının bir anlamı yoktur.
Get Özcan Kara’s stories in your inbox
Join Medium for free to get updates from this writer.
initContainers tamamlandığı (completed olduğu) anda diğer (ana) container çalışmaya başlar.
İlgili Service Manifest: service1.yaml
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376Terminal Üzerinde Uygulama Adımları
1. Pod’u oluşturma
kubectl apply -f podinitcontainer.yaml
pod/initcontainerpod createdkubectl get pods -o wide ile pod durumunu izlediğimizde initcontainerpod podunun Init:0/1 durumunda beklediğini görürüz (henüz init container tamamlanmadığı için ana container başlamamıştır).
2. Pod detaylarını inceleme
kubectl describe pods initcontainerpodÇıktıdan öne çıkan kısımlar:
Image ID:
Port: <none>
Host Port: <none>
Command:
sh
-c
echo The app is running! && sleep 3600
State: Waiting
Reason: PodInitializing
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mbssc (ro)
Conditions:
Type Status
Initialized False
Ready False
ContainersReady False
PodScheduled True
Volumes:
kube-api-access-mbssc:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 15s default-scheduler Successfully assigned default/initcontainerpod to docker-desktop
Normal Pulling 15s kubelet Pulling image "busybox"
Normal Pulled 13s kubelet Successfully pulled image "busybox" in 1.483s (1.483s including waiting)
Normal Created 13s kubelet Created container initcontainer
Normal Started 13s kubelet Started container initcontainerBurada State: Waiting, Reason: PodInitializing ve Ready: False görülüyor — çünkü ana container henüz init container'ın tamamlanmasını bekliyor.
3. Init container loglarını izleme
kubectl logs -f initcontainerpod -c initcontainerServis henüz oluşturulmadığı için myservice bulunamıyor ve döngü devam ediyor:
** server can't find myservice.default.svc.cluster.local: NXDOMAIN
** server can't find myservice.svc.cluster.local: NXDOMAIN
** server can't find myservice.svc.cluster.local: NXDOMAIN
** server can't find myservice.cluster.local: NXDOMAINwaiting for myservice
Server: 10.96.0.10
Address: 10.96.0.10:53** server can't find myservice.cluster.local: NXDOMAIN
** server can't find myservice.cluster.local: NXDOMAIN
** server can't find myservice.default.svc.cluster.local: NXDOMAIN
** server can't find myservice.svc.cluster.local: NXDOMAIN
** server can't find myservice.default.svc.cluster.local: NXDOMAIN
** server can't find myservice.svc.cluster.local: NXDOMAINwaiting for myservice
Bu noktada log takibi Ctrl+C (^C) ile durduruluyor, çünkü servis henüz oluşturulmadı.
4. Servisi oluşturma
ls
README.md podannotation.yaml podlife1.yaml podnamespace.yaml service1.yaml
objectbasetemplate.yaml podenv.yaml podlife2.yaml podmulticontainer.yaml
osman.yaml podinitcontainer.yaml podlife3.yaml podlabel.yaml
pod1.yaml podlife4.yamlkubectl apply -f service1.yaml
service/myservice createdkubectl get pods -o wide çıktısında initcontainerpod hâlâ Init:0/1 durumundadır; servis yeni oluşturulduğu için init container'ın bunu algılaması birkaç saniye sürer.
5. Init container loglarını tekrar izleme
kubectl logs -f initcontainerpod -c initcontainerServis oluşturulduktan kısa bir süre sonra DNS sorgusu artık cevap dönüyor:
** server can't find myservice.svc.cluster.local: NXDOMAIN
** server can't find myservice.cluster.local: NXDOMAIN
** server can't find myservice.default.svc.cluster.local: NXDOMAIN
** server can't find myservice.svc.cluster.local: NXDOMAIN
** server can't find myservice.default.svc.cluster.local: NXDOMAINwaiting for myservice
Server: 10.96.0.10
Address: 10.96.0.10:53** server can't find myservice.cluster.local: NXDOMAIN
** server can't find myservice.svc.cluster.local: NXDOMAIN
** server can't find myservice.svc.cluster.local: NXDOMAIN
** server can't find myservice.cluster.local: NXDOMAINName: myservice.default.svc.cluster.local
Address: 10.111.255.98waiting for myservice
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: myservice.default.svc.cluster.local ve Address: 10.111.255.98 satırları, nslookup myservice sorgusunun artık olumlu cevap aldığını gösterir. Bu cevabın alındığı andan itibaren until döngüsü sona erer, init container işini tamamlar ve kapanır. Init container kapandıktan sonra ana container (appcontainer) başlatılır ve kubectl get pods çıktısında pod artık Running (örn. 1/1) durumuna geçer.
Özet
- Ana container’dan önce bir (veya sırasıyla birden fazla) Init Container ayağa kaldırılır.
- Init Container(lar) tanımlanan hazırlık işlemlerini (dosya indirme, bir servisin/bağımlılığın hazır olmasını bekleme, registration vb.) yapar.
- İşlem tamamlanınca Init Container kendini kapatır.
- Init Container(lar) tamamlanmadan (completed olmadan) ana container başlatılmaz.
- Birden fazla Init Container tanımlanabilir; bunlar sırasıyla çalıştırılır.









