Kubernetes Cluster Yönetimi
Kubernetes cluster kurulumu, yapılandırması ve yönetimi. Container orchestration için kapsamlı rehber.
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#
- Pod başlamıyor:
kubectl describe pod <pod-name> kubectl logs <pod-name> kubectl get events --sort-by=.metadata.creationTimestamp
- Service erişim problemi:
kubectl get endpoints kubectl describe service <service-name> kubectl port-forward pod/<pod-name> 8080:80
- 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.