Bir Docker imajının belirli bir etikete sahip olmamanın, dağıtımın geri alınmasını zorlaştırdığına dikkat çekmek önemlidir. Bu örnekte, uygulamamızda her yeni güncellememiz olduğunda Docker imajlarımızı etiketleyeceğiz, onu Docker Hub'a göndereceğiz ve Kubernetes'e dağıtacağız.


Imajı etiketleme


Uygulamanızı güncellediğinizi varsayalım. Oluşturalım, etiketleyelim ve Docker Hub'a aktaralım.


IMAGE_TAG := $(shell git rev-parse --short HEAD)

.PHONY: docker
docker:
docker build -t you/address-finder-go:$(IMAGE_TAG) -f ./docker/go/Dockerfile .
docker push you/address-finder-go:$(IMAGE_TAG)

Yukarıda görebileceğiniz gibi, en son Git commit kodunu imaj etiketi olarak kullandık. GitHub sürümlerindeki v1.0.0 gibi sürüm etiketlerini de kullanabilirsiniz. Terminal çıktısının aşağıdaki gibi göründüğünü farzedelim.


Successfully built 11416713s43z
Successfully tagged you/address-finder-go:v225062
docker push you/address-finder-go:v225062
The push refers to repository [docker.io/you/address-finder-go]
dd6dc1v214r2: Pushed

Dağıtım


Dağıtım dosyamız aşağıdaki gibidir. Gördüğünüz gibi, resim etiketini latest olarak ayarladık, ancak şimdilik endişelenmeyin. Aşağıdaki komutla bu geçersiz kılınacaktır. Kafanızı karıştırırsa latest etiketini kaldırabilirsiniz.


apiVersion: apps/v1
kind: Deployment

metadata:
name: address-finder-deployment
labels:
app: address-finder

spec:
replicas: 1
selector:
matchLabels:
app: address-finder
template:
metadata:
labels:
app: address-finder
spec:
containers:
- name: go
image: you/address-finder-go:latest

IMAGE_TAG := $(shell git rev-parse --short HEAD)

.PHONY: k8s-setup
k8s-setup:
kubectl apply -f deploy/k8s/configmap.yaml
kubectl apply -f deploy/k8s/deployment.yaml
kubectl apply -f deploy/k8s/service.yaml

.PHONY: k8s-deploy
k8s-deploy:
kubectl apply -f deploy/k8s/configmap.yaml
kubectl set image deployment/address-finder-deployment go=you/address-finder-go:$(IMAGE_TAG)
kubectl apply -f deploy/k8s/service.yaml

kubectl set image komutunu aşağıdaki ile değiştirebilirsiniz çünkü her ikiside aynı işi görür.


kubectl patch deployment address-finder-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"go","image":"you/address-finder-go:$(IMAGE_TAG)"}]}}}}'

Kubernetes ortamımızı kuralım. Bu, ilk kez uygulama kurulum işlemi olarak gereklidir. Burada latest imaj etiketini kullanılacaktır.


$ make k8s-setup
kubectl apply -f deploy/k8s/configmap.yaml
configmap/address-finder-config created
kubectl apply -f deploy/k8s/deployment.yaml
deployment.apps/address-finder-deployment created
kubectl apply -f deploy/k8s/service.yaml
service/address-finder-service created

Bileşenlere hangi imaj etiketinin eklendiğini kontrol edelim. Görüldüğü gibi latest.


$ kubectl describe deployment.apps/address-finder-deployment | grep Image
Image: you/address-finder-go:latest

$ kubectl describe replicaset.apps/address-finder-deployment-68dd5b79b8 | grep Image
Image: you/address-finder-go:latest

$ kubectl describe pod/address-finder-deployment-68dd5b79b8-24ppp | grep Image
Image: you/address-finder-go:latest

Resmimizin Docker Hub'da v225062 ile etiketlendiğini zaten biliyoruz. Ayrıca uygulamamızın en son commit kodudur, bu yüzden onu iletelim.


$ make k8s-deploy
kubectl apply -f deploy/k8s/configmap.yaml
configmap/address-finder-config unchanged
kubectl set image deployment/address-finder-deployment go=you/address-finder-go:v225062
deployment.apps/address-finder-deployment image updated
kubectl apply -f deploy/k8s/service.yaml
service/address-finder-service unchanged

Değişiklikleri teyit edelim.


$ kubectl describe deployment.apps/address-finder-deployment | grep Image
Image: you/address-finder-go:v225062

$ kubectl describe replicaset.apps/address-finder-deployment-7887d5f54f | grep Image
Image: you/address-finder-go:v225062

$ kubectl describe pod/address-finder-deployment-7887d5f54f-phnf7 | grep Image
Image: you/address-finder-go:v225062