Bu eğitimde, Kubernetes kümesinde bir uygulamayı dağıtmak için adım adım bir kılavuz sağlayacağız. Kubernetes, uygulamaları verimli ve ölçeklenebilir bir şekilde dağıtmaya ve yönetmeye yardımcı olan fiili konteyner düzenleme aracıdır. Bu eğitimde, bir konteyner görüntüsü oluşturmaktan bir Kubernetes hizmetini yapılandırmaya kadar, bir uygulamayı Kubernetes kümesinde dağıtmanın adımlarını baştan sona size göstereceğiz. Başlayalım!
Kubernetes Kümesinde Bir Uygulamanın Dağıtılması
Bir Docker Konteyner Görüntüsü Oluşturun
Kubernetes bir konteyner düzenleme aracıdır. Bu nedenle uygulamanızı Kubernetes’te dağıtmadan önce onu bir konteyner görüntüsünde paketlemeniz gerekir.
Uygulamanızı dağıtmak için kendi özel görüntünüzü oluşturabilir veya Docker hub’ında halihazırda var olan görüntüleri kullanabilirsiniz.
Bu kılavuzda, daha önce oluşturduğumuz bir Nagios çekirdek konteyner imajını kullanarak Kubernetes kümesinde bir uygulamanın nasıl dağıtılacağını ve Nagios çekirdeğinin Docker konteyneri olarak nasıl dağıtılacağını göstereceğiz.
Görüntü oluşturuldu ve kendinden imzalı SSL/TLS sertifikalarıyla yapılandırılmış yerel görüntü kayıt defterine gönderildi.
Örneğin, aşağıdaki komutu kullanarak (K8s ana düğümünde çalıştırılan) yerel kayıt defterinde oluşturulan görüntülerin bir listesini alalım;
sudo apt install jq -y
curl -sk https://registry.kifarunix-demo.com/v2/_catalog | jq
örnek çıktı;
{
"repositories": [
"nagios-core"
]
}
İmaj etiketlerini kontrol edin;
curl -sk https://registry.kifarunix-demo.com/v2/nagios-core/tags/list | jq
{
"name": "nagios-core",
"tags": [
"4.4.9"
]
}
İmaj adı nagios-core:4.4.9’dur.
Kubernetes Dağıtımı ve Hizmet Listesini Oluşturun
Manifest, bir Kubernetes kümesinde bir uygulama oluşturmak, yönetmek ve çalıştırmak için yapılandırmaları içeren YAML veya JSON dosyasında bir Kubernetes uygulama kaynak dosyasıdır. Kaynak tanımlarından bazıları dağıtımları, hizmetleri, ConfigMaps’i, Secrets’ı vb. içerir.
Deployment manifest
Bir uygulamanın istenen durumunu, kopya sayısını ve Kubernetes’te bir uygulamayı dağıtmak için gereken diğer ayarları tanımlar.Service manifest
Bir uygulamanın nasıl sunulacağını ve diğer servislerin veya dış istemcilerin ona nasıl erişebileceğini tanımlar.Secrets
: kimlik bilgilerini depolamak için kullanılabilir.
Kubernetes Kümesini Kendi Kendine İmzalanmış SSL Sertifikalarıyla Yerel Docker Kayıt Defterine Güvenecek Şekilde Yapılandırın
Kendi Docker imajlarınızı depolamak için yerel Docker kayıt defterinizi mi kullanıyorsunuz?
Benim için evet. Aslında, demo bir ortam olduğu için kendi kendine imzalanmış SSL/TLS sertifikalarıyla.
Dolayısıyla, sizin için de durum böyleyse, Kubernetes kümenizin uygulama Docker görüntülerinizi yerel kayıt defterinizden çekebildiğinden emin olarak başlamanız gerekir. Kubernetes yalnızca güvenli bir kayıt defterine bağlanabildiğinden, Kubernetes’i yerel kayıt defterime kendi kendine imzalanmış SSL sertifikalarıyla güvenecek şekilde yapılandırmam gerekecek.
Eğer kamuya açık güvenilir CA’lar tarafından güvence altına alınmış Docker kayıtlarını kullanıyorsanız, bu adım sizin için gerekli değildir!
Kubernetes kümesini, kendinden imzalı SSL/TLS sertifikalarıyla yapılandırılmış yerel Docker kayıt defterine güvenecek şekilde yapılandırmak için;
- Ana düğümde, yerel kayıt defterinden SSL/TLS sertifikalarını indirin (ve bunları demo dizinimize kaydedelim);
mkdir ~/k8s-app-demo
openssl s_client -showcerts -connect \
registry.kifarunix-demo.com:443 </dev/null 2>/dev/null \
| openssl x509 -outform PEM > ~/k8s-app-demo/registry-ca-cert.crt
- SSL/TLS sertifikasını depolamak için kullanmak üzere Kubernetes Secret’ı oluşturun. Bu gizli depoyu yukarıda indirdiğiniz yerel sertifika dosyasından oluşturabilirsiniz;
cd ~/k8s-app-demo
kubectl create secret generic registry-ca-certs --from-file=registry-ca-cert.crt
cd ../
Parolaları şu şekilde listeleyebilirsiniz;
kubectl get secrets
Örnek çıktı;
NAME TYPE DATA AGE
registry-ca-certs Opaque 1 13s
Uygulamamızı dağıtmak için gereken imajı çekerken yerel Docker kayıt defteriyle güven oluşturmak için bu sertifika parolasını kullanacak şekilde K8s uygulama dağıtımımızı yapılandıracağız.
- Tüm Kubernetes küme düğümlerine Yerel Kayıt CA Sertifikasını yükleyin
Kümedeki her düğümde, ana düğüm de dahil olmak üzere, yerel Docker görüntü kayıt defteri CA’sını indirin ve yükleyin. Bu, düğümler ile yerel kayıt defteri arasında bir güvenin kurulmasını sağlar.
Bu sertifikayı, Ubuntu sistemleri için /usr/local/share/ca-certificates, CentOS ve benzeri türevlerde ise /etc/pki/ca-trust/source/anchors dizininde bulunan CA sertifikaları dizininde saklamanız gerekir.
Bu nedenle, Debian/Ubuntu’da
openssl s_client -showcerts -connect \
registry.kifarunix-demo.com:443 </dev/null 2>/dev/null \
| openssl x509 -outform PEM | sudo tee /usr/local/share/ca-certificates/registry-ca-cert.crt
CA sertifika deposunu güncelleyin;
sudo update-ca-certificates
CentOS/RHEL’de;
openssl s_client -showcerts -connect \
registry.kifarunix-demo.com:443 </dev/null 2>/dev/null \
| openssl x509 -outform PEM | sudo tee /etc/pki/ca-trust/source/anchors/registry-ca-cert.crt
CA sertifika deposunu güncelleyin;
sudo update-ca-trust
- Bu kurulumda containerd olan Container çalışma zamanını yeniden başlatın.
sudo systemctl restart containerd
Kubernetes artık yerel kayıt defterinden görüntüleri sorunsuz bir şekilde çekebilmelidir!
Ana Düğümde Kubernetes Uygulama Dağıtım Bildirimi Oluşturun
Sonra, uygulamanız için dağıtım bildirimi oluşturun. Bu, Nagios çekirdek uygulamasını Kubernetes’e dağıtmak için örnek dağıtımımızdır.
vim ~/k8s-app-demo/nagios-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nagios-core-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nagios-core
template:
metadata:
labels:
app: nagios-core
spec:
imagePullSecrets:
- name: registry-ca-certs
containers:
- name: nagios-core
image: registry.kifarunix-demo.com/nagios-core:4.4.9
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: NAGIOSADMIN_USER_OVERRIDE
value: "nagiosadmin"
- name: NAGIOSADMIN_PASSWORD_OVERRIDE
value: "password"
Dosyayı buna göre güncelleyip kaydedip çıkın.
Her şeyin yolunda olduğunu düşündüğünüzde uygulama dağıtım bildirimini uygulamaya geçin.
kubectl apply -f ~/k8s-app-demo/nagios-deployment.yaml
Dağıtım hakkında bilgileri şu komutları kullanarak görüntüleyebilirsiniz:
Dağıtımları listeleyin;
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nagios-core-deployment 3/3 3 3 15s
Veya belirli bir dağıtımı;
kubectl get deployments <name>
kubectl describe deployments nagios-core-deployment
Name: nagios-core-deployment
Namespace: default
CreationTimestamp: Sun, 21 May 2023 10:30:21 +0000
Labels:
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nagios-core
Replicas: 3 desired | 3 updated | 3 total | 0 available | 3 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nagios-core
Containers:
nagios-core:
Image: registry.kifarunix-demo.com/nagios-core:4.4.9
Port: 80/TCP
Host Port: 0/TCP
Environment:
NAGIOSADMIN_USER_OVERRIDE: nagiosadmin
NAGIOSADMIN_PASSWORD_OVERRIDE: password
Mounts:
Volumes:
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing True ReplicaSetUpdated
OldReplicaSets:
NewReplicaSet: nagios-core-deployment-694b75b55b (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 20s deployment-controller Scaled up replica set nagios-core-deployment-694b75b55b to 3
Podları listeleyin;
kubectl get pods
NAME READY STATUS RESTARTS AGE
nagios-core-deployment-77c4b8ddd5-jqtb9 1/1 Running 0 110s
nagios-core-deployment-77c4b8ddd5-xklk4 1/1 Running 0 110s
nagios-core-deployment-77c4b8ddd5-xsbhg 1/1 Running 0 110s
Her bir pod hakkında daha fazla bilgiyi kubectl describe pod komutunu kullanarak edinebilirsiniz;
kubectl describe pod nagios-core-deployment-694b75b55b-845mh
Bu size Pod’lar ve içindeki kaplar hakkında oldukça fazla bilgi verir;
Name: nagios-core-deployment-694b75b55b-845mh
Namespace: default
Priority: 0
Service Account: default
Node: node02/192.168.56.130
Start Time: Sun, 21 May 2023 10:30:22 +0000
Labels: app=nagios-core
pod-template-hash=694b75b55b
Annotations: cni.projectcalico.org/containerID: e5b22e41af92435bd1fb95aae196a4374502052479705954c07e5a54b02c6ec3
cni.projectcalico.org/podIP: 10.100.140.67/32
cni.projectcalico.org/podIPs: 10.100.140.67/32
Status: Running
IP: 10.100.140.67
IPs:
IP: 10.100.140.67
Controlled By: ReplicaSet/nagios-core-deployment-694b75b55b
Containers:
nagios-core:
Container ID: containerd://d31c41d4df5f8c84b8d5a77c4b92b40918d42b0ea48fc538ac581c6069c92396
Image: registry.kifarunix-demo.com/nagios-core:4.4.9
Image ID: registry.kifarunix-demo.com/nagios-core@sha256:fbd31bf11ab746de4437c93c2ce5e99b7acaa39d49a169a78616675c62de8d70
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Sun, 21 May 2023 10:30:53 +0000
Ready: True
Restart Count: 0
Environment:
NAGIOSADMIN_USER_OVERRIDE: nagiosadmin
NAGIOSADMIN_PASSWORD_OVERRIDE: password
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-hbw4f (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-hbw4f:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional:
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors:
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 73s default-scheduler Successfully assigned default/nagios-core-deployment-694b75b55b-845mh to node02
Normal Pulling 72s kubelet Pulling image "registry.kifarunix-demo.com/nagios-core:4.4.9"
Normal Pulled 42s kubelet Successfully pulled image "registry.kifarunix-demo.com/nagios-core:4.4.9" in 29.83093282s (29.830957408s including waiting)
Normal Created 42s kubelet Created container nagios-core
Normal Started 42s kubelet Started container nagios-core
Ana Düğümde Kubernetes Uygulama Hizmeti Bildirimi Oluşturun
Daha önce de belirtildiği gibi, servis bildirimi bir uygulamanın nasıl sunulacağını ve diğer servislerin veya harici istemcilerin ona nasıl erişebileceğini tanımlar.
Bir uygulamanın açığa çıkarılabileceği farklı yollar vardır. Bunlardan bazıları şunlardır;
ClusterIP
– Bu, varsayılan hizmet türüdür ve uygulamayı kümedeki dahili bir IP adresine sunar. Bu hizmet türüne yalnızca küme içinden erişilebilir.NodePort
– Bu tür hizmet, kümedeki her seçili Düğümün aynı bağlantı noktasında NAT kullanarak uygulamayı açığa çıkarır. Bu, hizmeti kümenin dışından <NodeIP>:<NodePort> kullanarak erişilebilir hale getirir. Varsayılan NodePort aralığı 30000-32767’dir.LoadBalancer
– Bu tür hizmet, geçerli bulutta (destekleniyorsa) harici bir yük dengeleyici oluşturur ve hizmete sabit, harici bir IP atar. Bu, hizmetin harici IP adresini kullanarak kümenin dışından erişilebilir olmasını sağlar. Harici IP adresi bulut sağlayıcısı tarafından atanır ve Kubernetes tarafından yönetilmez.
Örnek uygulama servis manifestomuz aşağıdadır;
vim ~/k8s-app-demo/nagios-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nagios-core-service
spec:
type: NodePort
selector:
app: nagios-core
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30000 # Choose an available port number
Bu, “nagios-core-service” adlı Hizmetin “app: nagios-core” etiketine sahip Pod’ları seçtiği ve bunları 80 numaralı portta (port: 80) açığa çıkardığı anlamına gelir. Bu hizmete, 30000/tcp portundaki herhangi bir küme düğümü IP’si üzerinden erişilecektir.
Dosyayı güncelleyip kaydedip çıkın ve aşağıdaki gibi uygulayın;
kubectl apply -f ~/k8s-app-demo/nagios-service.yaml
Hizmetleri listeleyin;
kubectl get services
Veya basitçe;
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15h
nagios-core-service NodePort 10.101.213.238 <none> 80:30000/TCP 6s
Hizmet hakkında daha detaylı bilgi edinin;
kubectl describe service nagios-core-service
Name: nagios-core-service
Namespace: default
Labels:
Annotations:
Selector: app=nagios-core
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.101.213.238
IPs: 10.101.213.238
Port: http 80/TCP
TargetPort: 80/TCP
NodePort: http 30000/TCP
Endpoints: 10.100.140.67:80,10.100.186.195:80,10.100.196.131:80
Session Affinity: None
External Traffic Policy: Cluster
Events:
Artık herhangi bir küme düğümü üzerinden servise erişebilmeniz gerekir;
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready control-plane 15h v1.27.2 192.168.56.110 Ubuntu 22.04 LTS 5.15.0-27-generic containerd://1.6.21
node01 Ready 15h v1.27.2 192.168.56.120 Ubuntu 22.04 LTS 5.15.0-27-generic containerd://1.6.21
node02 Ready 15h v1.27.2 192.168.56.130 Ubuntu 22.04 LTS 5.15.0-27-generic containerd://1.6.21
node03 Ready 15h v1.27.2 192.168.56.140 Ubuntu 22.04 LTS 5.15.0-27-generic containerd://1.6.21
Kubernetes Pod’ları/Konteyner Günlüklerini Kontrol Etme
Kubernetes Pod/konteyner loglarınızı kontrol etmek istiyorsanız;
- Pod isimlerini almak için aşağıdaki komutu çalıştırın;
kubectl get pods
- kubectl logs <pod-name> komutunu kullanarak pod’un günlüklerini kontrol edin.
kubectl logs nagios-core-deployment-694b75b55b-845mh
- Bir Pod’daki belirli bir konteyner için günlükleri kontrol edin
Öncelikle şu komutu kullanarak bir pod’daki konteynerlerin listesini alın;
kubectl get pods <pod-name> -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'.
kubectl get pods nagios-core-deployment-694b75b55b-845mh -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'.
Bu nedenle, bir Pod’daki belirli bir konteyner için günlükleri kontrol etmek için kubectl logs <pod-adı> -c <konteyner-adı> komutunu kullanın.
kubectl logs nagios-core-deployment-694b75b55b-845mh -c nagios-core
Daha fazlasını okuyun;
kubectl logs --help
Belirli bir Kubernetes Pod’una veya Pod’daki Konteynera Giriş Yapın
Docker’da docker exec -it <container> [sh|bash] komutunu nasıl kullanıyorsanız, aşağıdaki şekilde de giriş yapabilirsiniz;
kubectl exec -it <pod-name> -- bash
Belirli bir Kubernetes Pod konteynerine giriş yapmak için;
kubectl exec -it <pod-name> -c <container-name> -- bash
Kubernetes Uygulamasına Erişim
Uygulamamız artık Kubernetes kümesinde çalıştığına göre, artık 30000 numaralı bağlantı noktasındaki herhangi bir küme düğümü aracılığıyla kümenin dışına erişebilmelisiniz. Örneğin http://<node01>:3000

Ve Nagios Core uygulamamız artık Kubernetes kümesinde çalışıyor.

Ve Kubernetes Kümesi üzerinde bir Uygulama dağıtmak için anlatılacaklar bu kadar.
Yazının orijinalini buradan okuyabilirisniz.

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.