Kubernetes Kümesinde Bir Uygulamayı Dağıtmaya İlişkin Adım Adım Kılavuz

 

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

Step-by-Step Guide on Deploying an Application on Kubernetes Cluster

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

Step-by-Step Guide on Deploying an Application on Kubernetes Cluster

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

 

 

Yazının orijinalini buradan okuyabilirisniz.