~/icsd.ir — bash
SYSTEM_ONLINE

Kubernetes پایه

Kubernetes (k8s) استاندارد industry برای orchestration container هاست. توسط Google توسعه داده شد و الان پروژه CNCF است.

۱۱.۱ مقدمه

Kubernetes (k8s) استاندارد industry برای orchestration container هاست. توسط Google توسعه داده شد و الان پروژه CNCF است.

۱۱.۲ چرا Kubernetes؟

Docker Compose برای محیط dev و production کوچک کافی است. اما برای production در مقیاس بزرگ نیاز به feature های پیشرفته‌تر داریم:

  • Self-healing: restart خودکار container های crash شده
  • Auto-scaling: افزایش instance بر اساس CPU/Memory
  • Rolling updates: zero-downtime deployment
  • Service discovery built-in: DNS داخلی
  • Load balancing: توزیع ترافیک
  • Secret management: ذخیره امن credentials
  • Storage orchestration: mount volume از cloud providers
  • Multi-host: deployment روی چند سرور

۱۱.۳ مفاهیم کلیدی

Cluster Architecture


┌────────────── Control Plane ──────────────┐
│  ┌──────────┐  ┌──────────┐  ┌─────────┐  │
│  │ API      │  │ Scheduler│  │Controller│  │
│  │ Server   │  │          │  │ Manager │  │
│  └──────────┘  └──────────┘  └─────────┘  │
│              ┌──────────┐                  │
│              │   etcd   │ (state)          │
│              └──────────┘                  │
└────────────────────────────────────────────┘
                    │
        ┌───────────┼───────────┐
        ▼           ▼           ▼
   ┌────────┐ ┌────────┐ ┌────────┐
   │Worker 1│ │Worker 2│ │Worker 3│
   │ kubelet│ │ kubelet│ │ kubelet│
   │ Pods   │ │ Pods   │ │ Pods   │
   └────────┘ └────────┘ └────────┘
    

Object های اصلی

  • Pod: کوچکترین واحد deploy، یک یا چند container
  • ReplicaSet: چندین replica از یک pod
  • Deployment: declarative update برای ReplicaSet
  • Service: ابزار دسترسی به pod ها (load balancer داخلی)
  • Ingress: دسترسی HTTP از خارج cluster
  • ConfigMap: ذخیره configuration
  • Secret: ذخیره credentials
  • Namespace: isolation منطقی
  • StatefulSet: برای stateful applications (DB)
  • DaemonSet: یک pod روی هر node
  • Job/CronJob: task های یک‌بار/دوره‌ای
  • PersistentVolume: storage پایدار
  • HorizontalPodAutoscaler: auto-scaling

۱۱.۴ Deployment

Deployment ساده‌ترین راه برای deploy stateless application هاست.


# user-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
  namespace: shop
  labels:
    app: user
    tier: backend
spec:
  replicas: 3  # ۳ pod
  
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # حداکثر یک pod اضافه
      maxUnavailable: 0  # هیچ pod پایین نباشد
  
  selector:
    matchLabels:
      app: user
      tier: backend
  
  template:
    metadata:
      labels:
        app: user
        tier: backend
    spec:
      containers:
      - name: user
        image: shop/user-service:1.2.3
        imagePullPolicy: IfNotPresent
        
        ports:
        - containerPort: 8000
          name: http
        
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-secrets
              key: url
        - name: REDIS_URL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: redis_url
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        
        livenessProbe:
          httpGet:
            path: /health/live
            port: http
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 3
        
        readinessProbe:
          httpGet:
            path: /health/ready
            port: http
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 3
        
        startupProbe:
          httpGet:
            path: /health/live
            port: http
          failureThreshold: 30
          periodSeconds: 10
        
        # Graceful shutdown
        lifecycle:
          preStop:
            exec:
              command: ["sleep", "15"]  # zaman برای drain
      
      terminationGracePeriodSeconds: 60
    

۱۱.۵ Service

Service یک IP پایدار برای دسترسی به مجموعه‌ای از pod ها فراهم می‌کند.


apiVersion: v1
kind: Service
metadata:
  name: user-service
  namespace: shop
spec:
  type: ClusterIP  # داخلی
  selector:
    app: user
    tier: backend
  ports:
  - port: 80          # Service port
    targetPort: 8000  # Container port
    protocol: TCP
    name: http
    

انواع Service

  • ClusterIP: فقط داخل cluster (پیش‌فرض)
  • NodePort: روی port مشخص هر node (30000-32767)
  • LoadBalancer: از cloud LB استفاده می‌کند
  • ExternalName: alias به DNS خارجی
  • Headless: بدون load balancing، DNS مستقیم به pod ها

۱۱.۶ Ingress

Ingress برای routing HTTP/HTTPS از خارج cluster به service های داخلی استفاده می‌شود.


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop-ingress
  namespace: shop
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - api.shop.com
    secretName: shop-tls
  rules:
  - host: api.shop.com
    http:
      paths:
      - path: /api/users
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 80
      - path: /api/products
        pathType: Prefix
        backend:
          service:
            name: product-service
            port:
              number: 80
      - path: /api/orders
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 80
    

۱۱.۷ ConfigMap و Secret

ConfigMap — تنظیمات غیرحساس


apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: shop
data:
  redis_url: "redis://redis:6379/0"
  log_level: "info"
  feature_new_search: "true"
  app_settings.json: |
    {
      "max_upload_size": 10485760,
      "allowed_origins": ["https://shop.com"]
    }
    

Secret — credentials


apiVersion: v1
kind: Secret
metadata:
  name: db-secrets
  namespace: shop
type: Opaque
stringData:
  url: "postgresql://user:pass@postgres/db"
  password: "supersecret"
    

برای کار با secret های واقعی، از Sealed Secrets، External Secrets Operator، یا HashiCorp Vault استفاده کنید — secret های raw نباید در Git قرار گیرند.

۱۱.۸ Horizontal Pod Autoscaler

افزایش/کاهش خودکار تعداد pod ها بر اساس CPU/Memory یا custom metrics.


apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: user-hpa
  namespace: shop
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-service
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
      - type: Pods
        value: 2
        periodSeconds: 60
      selectPolicy: Max
    

۱۱.۹ StatefulSet — برای DB ها

برای application های stateful که نیاز به identity ثابت و persistent storage دارند.


apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:16-alpine
        env:
        - name: POSTGRES_DB
          value: shop
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: fast-ssd
      resources:
        requests:
          storage: 50Gi
    

۱۱.۱۰ دستورات کاربردی kubectl


# لیست resources
kubectl get pods -n shop
kubectl get all -n shop
kubectl get pods -l app=user

# جزئیات
kubectl describe pod user-xyz
kubectl describe deployment user-service

# لاگ‌ها
kubectl logs -f user-xyz
kubectl logs -f deployment/user-service
kubectl logs --previous user-xyz  # crash قبلی

# اجرای دستور در pod
kubectl exec -it user-xyz -- bash
kubectl exec user-xyz -- env

# Port forward برای debug
kubectl port-forward pod/user-xyz 8000:8000
kubectl port-forward svc/user-service 8000:80

# Scale دستی
kubectl scale deployment/user-service --replicas=5

# Apply
kubectl apply -f deployment.yaml
kubectl apply -f .  # کل پوشه

# Update image (rolling)
kubectl set image deployment/user-service user=shop/user-service:1.2.4

# Rollout
kubectl rollout status deployment/user-service
kubectl rollout history deployment/user-service
kubectl rollout undo deployment/user-service  # rollback!

# Delete
kubectl delete pod user-xyz  # restart می‌شود (deployment)
kubectl delete deployment user-service

# Config
kubectl config get-contexts
kubectl config use-context production
kubectl config set-context --current --namespace=shop
    

۱۱.۱۱ Helm — Package Manager Kubernetes

به جای YAML های جداگانه، Helm Chart ها templating قدرتمندی فراهم می‌کنند.


# نصب چارت آماده
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install postgres bitnami/postgresql 
    --set auth.postgresPassword=secret 
    --namespace shop

# نصب chart خود
helm install user-service ./charts/user-service 
    --values values.production.yaml 
    --namespace shop

# upgrade
helm upgrade user-service ./charts/user-service

# rollback
helm rollback user-service 1

# لیست
helm list -n shop
    

۱۱.۱۲ بهترین تجربیات

  1. هر سرویس Namespace خود. isolation منطقی.
  2. Resource limits ضروری. هیچ pod بدون محدودیت.
  3. Liveness و Readiness probes.
  4. Rolling updates با maxUnavailable=0.
  5. Pod Disruption Budget. برای maintenance.
  6. Anti-affinity. pod ها روی node های متفاوت.
  7. NetworkPolicy. ترافیک بین pod ها را محدود کنید.
  8. RBAC. هر service account فقط دسترسی لازم.
  9. Secret management بیرونی. Vault، AWS Secrets Manager.
  10. HPA. برای scaling.
  11. Helm یا Kustomize. برای multi-env.
  12. GitOps با ArgoCD. در فصل بعد.

۱۱.۱۳ خلاصه فصل

آنچه آموختیم:
  • Architecture k8s و object های اصلی
  • Deployment و Service برای stateless
  • StatefulSet برای DB ها
  • Ingress برای دسترسی HTTP خارجی
  • ConfigMap و Secret
  • HPA برای auto-scaling
  • دستورات kubectl کاربردی
  • Helm برای package management
در فصل بعد: Observability — Logging، Metrics، Tracing.

نمایش سایت

رنگ سایت
حالت نمایش
اندازهٔ متن
خوانایی

این تنظیمات فقط روی مرورگر شما ذخیره می‌شود.