Kubernetes Cluster Yönetimi

Kubernetes cluster kurulumu, yapılandırması ve yönetimi. Container orchestration için kapsamlı rehber.

8 min read
1.450 words

Kubernetes Cluster Yönetimi#

Kubernetes (K8s), konteynerleştirilmiş uygulamaları otomatik olarak dağıtan, ölçeklendiren ve yöneten açık kaynaklı bir konteyner orkestrasyon platformudur. Bu rehberde Kubernetes cluster kurulumu ve yönetimi konularını ele alacağız.

Kubernetes Nedir?#

Kubernetes, Google tarafından geliştirilen ve şu anda Cloud Native Computing Foundation (CNCF) tarafından yönetilen bir konteyner orkestrasyon sistemidir. Büyük ölçekli konteyner uygulamalarını yönetmek için tasarlanmıştır.

Temel Bileşenler#

Control Plane:

  • API Server: Kubernetes API'sini sunar
  • etcd: Cluster verilerini saklar
  • Scheduler: Pod'ları node'lara atar
  • Controller Manager: Cluster durumunu yönetir

Worker Nodes:

  • kubelet: Node agent'ı
  • kube-proxy: Ağ proxy'si
  • Container Runtime: Docker, containerd, CRI-O

Kubernetes Kurulumu#

Sistem Gereksinimleri#

Master Node:

  • 2 CPU, 2 GB RAM (minimum)
  • 4 CPU, 4 GB RAM (önerilen)
  • 20 GB disk alanı

Worker Node:

  • 1 CPU, 1 GB RAM (minimum)
  • 2 CPU, 2 GB RAM (önerilen)
  • 10 GB disk alanı

kubeadm ile Kurulum#

1. Tüm Node'larda Ön Hazırlık#

# Swap'ı devre dışı bırak sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # Kernel modüllerini yükle cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # Sysctl parametrelerini ayarla cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system

2. Container Runtime Kurulumu (containerd)#

# containerd kurulumu sudo apt-get update sudo apt-get install -y containerd # containerd yapılandırması sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # SystemdCgroup'u etkinleştir sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml # containerd'yi yeniden başlat sudo systemctl restart containerd sudo systemctl enable containerd

3. Kubernetes Bileşenlerini Yükle#

# Kubernetes repository ekle sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gpg curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list # Kubernetes bileşenlerini yükle sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # kubelet'i etkinleştir sudo systemctl enable kubelet

4. Master Node Kurulumu#

# Cluster'ı başlat sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<MASTER_IP> # kubectl yapılandırması mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # Network plugin kurulumu (Flannel) kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

5. Worker Node'ları Ekleme#

# Master node'dan join token'ı al kubeadm token create --print-join-command # Worker node'da join komutu çalıştır sudo kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

kubectl Temel Komutları#

Cluster Bilgileri#

# Cluster bilgilerini görüntüle kubectl cluster-info # Node'ları listele kubectl get nodes kubectl get nodes -o wide # Namespace'leri listele kubectl get namespaces # Tüm kaynakları listele kubectl get all --all-namespaces

Pod Yönetimi#

# Pod'ları listele kubectl get pods kubectl get pods -o wide kubectl get pods --all-namespaces # Pod oluştur kubectl run nginx --image=nginx:latest # Pod detaylarını görüntüle kubectl describe pod nginx # Pod loglarını görüntüle kubectl logs nginx kubectl logs -f nginx # Canlı takip # Pod içine erişim kubectl exec -it nginx -- /bin/bash # Pod sil kubectl delete pod nginx

YAML Manifestleri#

Pod Manifest#

# pod.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"

Deployment Manifest#

# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"

Service Manifest#

# service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP

Workload Yönetimi#

Deployments#

# Deployment oluştur kubectl create deployment nginx --image=nginx:1.21 # Deployment'ı ölçeklendir kubectl scale deployment nginx --replicas=5 # Rolling update kubectl set image deployment/nginx nginx=nginx:1.22 # Rollback kubectl rollout undo deployment/nginx # Rollout durumunu kontrol et kubectl rollout status deployment/nginx # Rollout geçmişini görüntüle kubectl rollout history deployment/nginx

Services#

# Service oluştur kubectl expose deployment nginx --port=80 --type=ClusterIP # Service türleri kubectl expose deployment nginx --port=80 --type=NodePort kubectl expose deployment nginx --port=80 --type=LoadBalancer # Service'leri listele kubectl get services kubectl get svc # Service detaylarını görüntüle kubectl describe service nginx

ConfigMaps ve Secrets#

# ConfigMap oluştur kubectl create configmap app-config --from-literal=database_url=mysql://localhost:3306/mydb # ConfigMap'i dosyadan oluştur kubectl create configmap app-config --from-file=config.properties # Secret oluştur kubectl create secret generic app-secret --from-literal=password=mysecretpassword # Secret'ı dosyadan oluştur kubectl create secret generic app-secret --from-file=secret.txt # ConfigMap ve Secret'ları listele kubectl get configmaps kubectl get secrets

Namespace Yönetimi#

# Namespace oluştur kubectl create namespace development kubectl create namespace production # Namespace'e kaynak oluştur kubectl create deployment nginx --image=nginx -n development # Varsayılan namespace'i değiştir kubectl config set-context --current --namespace=development # Namespace sil kubectl delete namespace development

Persistent Volumes#

PersistentVolume (PV)#

# pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv-storage spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: path: /mnt/data

PersistentVolumeClaim (PVC)#

# pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: manual

Pod ile PVC Kullanımı#

# pod-with-pvc.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-storage spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: "/usr/share/nginx/html" name: storage volumes: - name: storage persistentVolumeClaim: claimName: pvc-storage

Ingress Controller#

NGINX Ingress Controller Kurulumu#

# NGINX Ingress Controller yükle kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml # Ingress Controller durumunu kontrol et kubectl get pods -n ingress-nginx

Ingress Resource#

# ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80 tls: - hosts: - myapp.example.com secretName: tls-secret

Monitoring ve Logging#

Metrics Server#

# Metrics Server kurulumu kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # Resource kullanımını görüntüle kubectl top nodes kubectl top pods

Prometheus ve Grafana#

# Helm ile Prometheus kurulumu helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring --create-namespace # Grafana'ya erişim kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80

Centralized Logging (ELK Stack)#

# elasticsearch.yaml apiVersion: apps/v1 kind: Deployment metadata: name: elasticsearch spec: replicas: 1 selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: containers: - name: elasticsearch image: elasticsearch:7.14.0 env: - name: discovery.type value: single-node ports: - containerPort: 9200

Güvenlik#

RBAC (Role-Based Access Control)#

# role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: development name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- # rolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: development subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io

Network Policies#

# network-policy.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all namespace: production spec: podSelector: {} policyTypes: - Ingress - Egress

Pod Security Standards#

# pod-security.yaml apiVersion: v1 kind: Namespace metadata: name: secure-namespace labels: pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/warn: restricted

Backup ve Disaster Recovery#

etcd Backup#

# etcd snapshot oluştur ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key # Snapshot'ı doğrula ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot.db

Velero ile Backup#

# Velero kurulumu velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.7.0 \ --bucket velero-backups \ --secret-file ./credentials-velero # Backup oluştur velero backup create my-backup --include-namespaces production # Backup'ı restore et velero restore create --from-backup my-backup

Troubleshooting#

Yaygın Problemler#

  1. Pod başlamıyor:
kubectl describe pod <pod-name> kubectl logs <pod-name> kubectl get events --sort-by=.metadata.creationTimestamp
  1. Service erişim problemi:
kubectl get endpoints kubectl describe service <service-name> kubectl port-forward pod/<pod-name> 8080:80
  1. Node problemi:
kubectl describe node <node-name> kubectl get nodes -o wide journalctl -u kubelet

Debug Komutları#

# Cluster durumunu kontrol et kubectl get componentstatuses # Resource kullanımını kontrol et kubectl top nodes kubectl top pods --all-namespaces # Network bağlantısını test et kubectl run test-pod --image=busybox --rm -it -- /bin/sh

Sonuç#

Kubernetes cluster yönetimi, modern konteyner orkestrasyon için kritik bir beceridir. Bu rehberde ele aldığımız konular:

  • Kubernetes kurulumu ve yapılandırması
  • kubectl komutları ve YAML manifestleri
  • Workload ve service yönetimi
  • Storage ve networking
  • Monitoring ve güvenlik
  • Backup ve troubleshooting

Kubernetes'i etkili kullanmak için düzenli pratik yapın ve CNCF ekosistemindeki araçları keşfedin. Bir sonraki yazımızda Helm ile Kubernetes paket yönetimi konusunu ele alacağız.

Related Posts