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
۱۱.۱۲ بهترین تجربیات
- هر سرویس Namespace خود. isolation منطقی.
- Resource limits ضروری. هیچ pod بدون محدودیت.
- Liveness و Readiness probes.
- Rolling updates با maxUnavailable=0.
- Pod Disruption Budget. برای maintenance.
- Anti-affinity. pod ها روی node های متفاوت.
- NetworkPolicy. ترافیک بین pod ها را محدود کنید.
- RBAC. هر service account فقط دسترسی لازم.
- Secret management بیرونی. Vault، AWS Secrets Manager.
- HPA. برای scaling.
- Helm یا Kustomize. برای multi-env.
- GitOps با ArgoCD. در فصل بعد.
۱۱.۱۳ خلاصه فصل
آنچه آموختیم:
- Architecture k8s و object های اصلی
- Deployment و Service برای stateless
- StatefulSet برای DB ها
- Ingress برای دسترسی HTTP خارجی
- ConfigMap و Secret
- HPA برای auto-scaling
- دستورات kubectl کاربردی
- Helm برای package management