Kubernetes چیست؟ از Container تا Production

معرفی Kubernetes، Container Orchestration و راه‌حل‌های مدیریت سیستم‌های درجه Production

اگر با Docker کار کرده باشید، احتمالاً خیلی زود به یک سؤال مهم می‌رسید:

وقتی تعداد Containerها زیاد شود، چه کسی باید آن‌ها را مدیریت کند؟

فرض کنید یک سرویس ساده دارید:

1Application
2    ↓
3Docker Container
4    ↓
5Server

در ابتدا همه‌چیز ساده است. یک Container اجرا می‌کنید، Port را باز می‌کنید و سرویس در دسترس قرار می‌گیرد.

اما وقتی سیستم بزرگ‌تر می‌شود، شرایط کاملاً تغییر می‌کند:

  • چندین سرویس دارید.
  • هر سرویس چند Replica دارد.
  • Containerها ممکن است Crash کنند.
  • باید بین چند Server توزیع شوند.
  • باید Load Balancing داشته باشید.
  • باید Deployment بدون Downtime انجام شود.
  • باید Storage پایدار داشته باشید.
  • باید Secretها را مدیریت کنید.
  • باید Health Check داشته باشید.
  • باید Scaling انجام شود.
  • باید وضعیت کل سیستم را Monitor کنید.

اینجاست که Kubernetes وارد می‌شود.


Kubernetes چیست؟

Kubernetes یک Container Orchestration Platform است که برای اجرای، مدیریت و مقیاس‌دهی workloadهای containerized طراحی شده است.

به زبان ساده:

Kubernetes سیستمی است که وضعیت مطلوب Application شما را تعریف می‌کند و تلاش می‌کند همیشه زیرساخت واقعی را به آن وضعیت نزدیک نگه دارد.

این مفهوم بسیار مهم است.

در Kubernetes شما معمولاً نمی‌گویید:

«این Container را روی این Server اجرا کن.»

بلکه می‌گویید:

«من می‌خواهم ۳ Replica از این Application همیشه در حال اجرا باشند.»

و Kubernetes مسئول رسیدن به این وضعیت است.


چرا Docker به‌تنهایی کافی نیست؟

Docker برای اجرای Container فوق‌العاده است، اما Docker به‌تنهایی مسئله‌ی orchestration در مقیاس بزرگ را حل نمی‌کند.

فرض کنید ۲۰ سرویس دارید و هر سرویس ۵ Replica دارد:

120 Services
2    ×
35 Replicas
4    =
5100 Containers

حالا چند سؤال ایجاد می‌شود:

اگر یک Container خراب شود چه؟

باید Container جدیدی جایگزین شود.

اگر یک Server از کار بیفتد چه؟

Containerهای آن Server باید روی Nodeهای دیگر اجرا شوند.

اگر Traffic افزایش پیدا کند چه؟

باید Replicaهای بیشتری ایجاد شوند.

اگر نسخه‌ی جدید Application آماده شد چه؟

باید Deployment انجام شود بدون اینکه سرویس قطع شود.

اگر نسخه‌ی جدید مشکل داشت چه؟

باید بتوانیم Rollback کنیم.

اگر یک Container بیش از حد CPU مصرف کرد چه؟

باید Resource Limit داشته باشیم.

اگر Application به Storage نیاز داشت چه؟

باید Persistent Storage در اختیار آن قرار گیرد.

حل این مسائل در مقیاس بالا با Scriptهای دستی بسیار سخت و شکننده می‌شود.

Kubernetes دقیقاً برای همین مشکلات ساخته شده است.


معماری کلی Kubernetes

یک Kubernetes Cluster معمولاً از دو بخش اصلی تشکیل می‌شود:

 1                 Kubernetes Cluster
 2                         │
 3          ┌──────────────┴──────────────┐
 4          │                             │
 5      Control Plane                  Worker Nodes
 6          │                             │
 7     ┌────┼────┐              ┌─────────┼─────────┐
 8     │    │    │              │         │         │
 9  API   Scheduler Controller  Pod      Pod       Pod
10 Server  Manager  Manager
11     │
12     ▼
13  etcd

Control Plane چیست؟

Control Plane مغز Kubernetes است.

اجزای اصلی آن عبارت‌اند از:

  • kube-apiserver
  • etcd
  • kube-scheduler
  • kube-controller-manager

در برخی معماری‌ها اجزای دیگری مانند Cloud Controller Manager نیز وجود دارند.


kube-apiserver

تمام ارتباطات اصلی Kubernetes از طریق API Server انجام می‌شود.

وقتی شما اجرا می‌کنید:

1kubectl get pods

در واقع kubectl مستقیماً با Kubernetes API ارتباط برقرار می‌کند.

مسیر کلی:

1kubectl
2   │
3   ▼
4kube-apiserver
5   │
6   ▼
7Kubernetes State

API Server نقطه‌ی مرکزی ارتباط با Cluster است.


etcd

etcd یک distributed key-value store است که Kubernetes از آن برای نگهداری state مربوط به Cluster استفاده می‌کند.

برای مثال اطلاعاتی مانند:

  • Podها
  • Deploymentها
  • Serviceها
  • ConfigMapها
  • Secretها
  • Nodeها
  • Desired State

در state مربوط به Kubernetes ذخیره می‌شوند.

به همین دلیل:

Backup مناسب etcd یکی از بخش‌های مهم Disaster Recovery در Kubernetes است.


kube-scheduler

Scheduler تصمیم می‌گیرد یک Pod روی کدام Worker Node اجرا شود.

فرض کنید سه Node داریم:

1worker-01
2worker-02
3worker-03

و یک Pod جدید ایجاد شده است.

Scheduler عواملی مانند موارد زیر را بررسی می‌کند:

  • CPU
  • Memory
  • Requests
  • Limits
  • Taints
  • Tolerations
  • Affinity
  • Anti-Affinity
  • Node Constraints

و در نهایت Node مناسب را انتخاب می‌کند.


Controller Manager

Kubernetes بر اساس مفهوم Desired State کار می‌کند.

مثلاً شما تعریف می‌کنید:

1replicas: 3

یعنی:

من سه Replica می‌خواهم.

اگر یکی از Podها Crash کند:

1Desired:
23 Pods
3
4Actual:
52 Pods

Controller متوجه اختلاف می‌شود و تلاش می‌کند:

12 Pods
2   ↓
3Create new Pod
4   ↓
53 Pods

این یکی از مهم‌ترین ویژگی‌های Kubernetes است:

Reconciliation


Worker Node چیست؟

Worker Node جایی است که Workloadهای واقعی اجرا می‌شوند.

اجزای اصلی Worker Node معمولاً شامل:

  • kubelet
  • Container Runtime
  • kube-proxy یا مکانیزم‌های شبکه‌ی معادل
  • Network Plugin / CNI

است.


kubelet

kubelet Agent مربوط به Node است.

وظیفه‌ی آن این است که وضعیت Workloadهای Node را مدیریت و گزارش کند.

به‌صورت ساده:

 1Control Plane
 2      │
 3      ▼
 4    kubelet
 5      │
 6      ▼
 7Container Runtime
 8      │
 9      ▼
10   Container

Container Runtime

Kubernetes برای اجرای Containerها به Container Runtime نیاز دارد.

یکی از Runtimeهای رایج:

1containerd

است.

در این معماری:

1Kubernetes
2     ↓
3kubelet
4     ↓
5CRI
6     ↓
7containerd
8     ↓
9Container

Pod چیست؟

Pod کوچک‌ترین واحد Deployable در Kubernetes است.

در ساده‌ترین حالت:

1Pod
2 └── Container

اما Pod می‌تواند چند Container نیز داشته باشد:

1Pod
2 ├── Application Container
3 └── Sidecar Container

Containerهای داخل یک Pod معمولاً:

  • Network Namespace مشترک دارند.
  • IP مشترک دارند.
  • می‌توانند از localhost یکدیگر استفاده کنند.
  • می‌توانند Volume مشترک داشته باشند.

چرا مستقیماً Container ایجاد نمی‌کنیم؟

Kubernetes معمولاً Application را با abstractionهایی مثل Deployment مدیریت می‌کند.

مثلاً:

 1apiVersion: apps/v1
 2kind: Deployment
 3
 4metadata:
 5  name: nginx
 6
 7spec:
 8  replicas: 3
 9
10  selector:
11    matchLabels:
12      app: nginx
13
14  template:
15    metadata:
16      labels:
17        app: nginx
18
19    spec:
20      containers:
21        - name: nginx
22          image: nginx:latest
23          ports:
24            - containerPort: 80

اینجا ما نگفته‌ایم:

روی Node شماره‌ی ۲ یک Container اجرا کن.

بلکه گفته‌ایم:

من سه Replica از nginx می‌خواهم.

Kubernetes بقیه‌ی کار را انجام می‌دهد.


Deployment چیست؟

Deployment یکی از مهم‌ترین Resourceهای Kubernetes است.

Deployment معمولاً برای مدیریت Stateless Applicationها استفاده می‌شود.

مثلاً:

1Deployment
2    │
3    ├── Replica 1
4    ├── Replica 2
5    └── Replica 3

اگر یکی از Replicaها از بین برود:

1Replica 1
2Replica 2
3Replica 3
4     X

Kubernetes تلاش می‌کند Replica جایگزین ایجاد کند.


Service چیست؟

Podها موجودیت‌هایی Dynamic هستند.

ممکن است Pod امروز روی:

110.244.1.10

باشد و بعد از Restart روی:

110.244.2.15

قرار بگیرد.

بنابراین نباید Applicationها را مستقیماً به IP Podها متصل کنیم.

اینجا Service وارد می‌شود.

1             Service
2                │
3       ┌────────┼────────┐
4       ▼        ▼        ▼
5     Pod 1    Pod 2    Pod 3

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


Ingress چیست؟

Service معمولاً برای دسترسی داخلی Cluster استفاده می‌شود.

برای HTTP/HTTPS ورودی از خارج Cluster، می‌توان از Ingress استفاده کرد.

مثلاً:

 1Internet
 2   │
 3   ▼
 4Ingress
 5   │
 6   ├── api.example.com
 7   │       ↓
 8   │     API Service
 9   │
10   └── app.example.com
11           ↓
12        Web Service

در معماری‌های جدیدتر Kubernetes، Gateway API نیز برای مدیریت ترافیک HTTP و L4/L7 مورد استفاده قرار می‌گیرد.


ConfigMap و Secret

Applicationها معمولاً به configuration نیاز دارند.

مثلاً:

1DATABASE_HOST
2DATABASE_PORT
3LOG_LEVEL

برای configuration غیرحساس می‌توان از ConfigMap استفاده کرد.

برای داده‌های حساس مانند:

1DATABASE_PASSWORD
2API_TOKEN
3PRIVATE_KEY

از Secret استفاده می‌شود.

البته Secret به‌تنهایی به معنی یک سیستم کامل Secrets Management نیست و در محیط‌های حساس Production باید encryption، access control و secret lifecycle نیز در نظر گرفته شود.


Kubernetes Storage

Containerها ذاتاً ephemeral هستند.

یعنی اگر Container از بین برود، filesystem داخلی آن را نباید محل مناسبی برای نگهداری داده‌ی دائمی در نظر گرفت.

برای داده‌های Persistent از abstractionهایی مانند:

  • PersistentVolume
  • PersistentVolumeClaim
  • StorageClass

استفاده می‌شود.

معماری:

 1Application
 2     │
 3     ▼
 4   Pod
 5     │
 6     ▼
 7   PVC
 8     │
 9     ▼
10StorageClass
11     │
12     ▼
13Storage Backend

در Production می‌توان backendهایی مانند:

  • Rook-Ceph
  • Longhorn
  • OpenEBS
  • Cloud Block Storage
  • Network Storage

را استفاده کرد.


Kubernetes Networking

Networking یکی از پیچیده‌ترین بخش‌های Kubernetes است.

در یک Cluster باید مواردی مانند این‌ها حل شوند:

  • Pod-to-Pod Communication
  • Pod-to-Service Communication
  • Service Discovery
  • External Traffic
  • NetworkPolicy
  • DNS
  • Load Balancing

این وظایف معمولاً با استفاده از CNI حل می‌شوند.

نمونه‌هایی از CNI:

  • Cilium
  • Calico
  • Flannel

Cilium با استفاده از eBPF قابلیت‌های پیشرفته‌ای برای Networking، Security و Observability فراهم می‌کند.


Kubernetes و High Availability

در محیط Production، یک Kubernetes Cluster نباید به یک Control Plane Node وابسته باشد.

معماری HA معمولاً به شکل زیر است:

1                Load Balancer
2                      │
3          ┌───────────┼───────────┐
4          ▼           ▼           ▼
5      Master-01   Master-02   Master-03
6          │           │           │
7          └───────────┼───────────┘
8                      │
9                    etcd

در کنار آن Worker Nodeهای متعدد قرار می‌گیرند.

هدف این است که failure یک Node باعث از دست رفتن کل Cluster نشود.


Kubernetes و GitOps

یکی از الگوهای مهم در محیط‌های مدرن، GitOps است.

در GitOps، Git به منبع اصلی Desired State تبدیل می‌شود.

مثلاً:

 1Git Repository
 2      │
 3      ▼
 4Kubernetes Manifests
 5      │
 6      ▼
 7GitOps Controller
 8      │
 9      ▼
10Kubernetes Cluster

ابزارهایی مانند:

  • Argo CD
  • Flux

می‌توانند این مدل را پیاده‌سازی کنند.

مزیت اصلی این مدل:

  • Auditability
  • Version Control
  • Reproducibility
  • Rollback
  • Review
  • Automation

است.


Kubernetes و Observability

Deploy کردن Application پایان کار نیست.

در Production باید بتوانیم بفهمیم:

سیستم الان چه وضعیتی دارد؟

سه سیگنال اصلی Observability:

1Logs
2Metrics
3Traces

معماری متداول:

 1Application
 2    │
 3    ├── Logs ──────→ Elasticsearch
 4    │
 5    ├── Metrics ───→ Prometheus
 6    │
 7    └── Traces ────→ Jaeger
 8                         │
 9                         ▼
10                      Grafana

OpenTelemetry نیز می‌تواند به‌عنوان لایه‌ی استاندارد جمع‌آوری و انتقال telemetry در این معماری قرار گیرد.


Kubernetes فقط یک ابزار نیست

یکی از اشتباهات رایج این است که Kubernetes را صرفاً یک ابزار برای اجرای Container بدانیم.

Kubernetes در واقع مجموعه‌ای از مفاهیم مهندسی را در اختیار ما قرار می‌دهد:

 1Desired State
 2      +
 3Reconciliation
 4      +
 5Scheduling
 6      +
 7Service Discovery
 8      +
 9Scaling
10      +
11Self Healing
12      +
13Rolling Deployment
14      +
15Declarative Configuration

به همین دلیل یادگیری Kubernetes فقط حفظ کردن دستورات kubectl نیست.


مسیر یادگیری پیشنهادی

اگر تازه وارد Kubernetes شده‌اید، پیشنهاد می‌شود این مسیر را طی کنید:

 1Linux
 2  ↓
 3Networking
 4  ↓
 5Git
 6  ↓
 7Docker
 8  ↓
 9Container Networking
10  ↓
11Kubernetes Fundamentals
12  ↓
13Pods
14  ↓
15Deployments
16  ↓
17Services
18  ↓
19Ingress
20  ↓
21ConfigMap / Secret
22  ↓
23Storage
24  ↓
25Networking
26  ↓
27Security
28  ↓
29Observability
30  ↓
31Helm
32  ↓
33Kustomize
34  ↓
35GitOps
36  ↓
37Production Kubernetes

بعد از این مرحله می‌توانید وارد مباحث پیشرفته‌تر شوید:

 1Kubernetes
 2    ↓
 3CNI / Cilium
 4    ↓
 5Service Mesh
 6    ↓
 7Advanced Scheduling
 8    ↓
 9Distributed Storage
10    ↓
11HA
12    ↓
13Disaster Recovery
14    ↓
15Cluster Security
16    ↓
17Platform Engineering

جمع‌بندی

Kubernetes پاسخی به یک مسئله‌ی ساده اما بسیار مهم است:

چگونه تعداد زیادی Workload را به‌صورت قابل اعتماد، قابل تکرار و خودکار اجرا و مدیریت کنیم؟

اما یادگیری Kubernetes نباید با حفظ کردن دستورات شروع و با اجرای یک Deployment تمام شود.

برای تبدیل شدن به یک Kubernetes Engineer واقعی باید لایه‌های مختلف سیستم را بشناسید:

 1Linux
 2 ↓
 3Networking
 4 ↓
 5Container
 6 ↓
 7Kubernetes
 8 ↓
 9Storage
10 ↓
11Security
12 ↓
13Observability
14 ↓
15Automation
16 ↓
17GitOps
18 ↓
19Production Engineering

و مهم‌تر از همه باید بتوانید با Failure کار کنید.

چون Kubernetes واقعی جایی است که:

 1Node Down
 2Pod Crash
 3Network Failure
 4Storage Failure
 5Registry Failure
 6Certificate Expired
 7High CPU
 8Memory Pressure
 9DNS Failure
10Deployment Failure

اتفاق می‌افتد.

مهندس واقعی کسی نیست که فقط بتواند سیستم را بالا بیاورد؛

مهندس واقعی کسی است که بتواند بفهمد چرا سیستم پایین آمده، چگونه آن را برگرداند و چگونه کاری کند که دفعه‌ی بعد همان اتفاق تکرار نشود.


در ادامه چه چیزهایی یاد می‌گیریم؟

در سری مقالات Kubernetes در گیتنامی، مرحله‌به‌مرحله وارد مباحث زیر می‌شویم:

  1. Kubernetes Architecture
  2. نصب Kubernetes با kubeadm
  3. Pod و Container Lifecycle
  4. Deployment و ReplicaSet
  5. Service و Service Discovery
  6. Ingress و Gateway API
  7. ConfigMap و Secret
  8. Kubernetes Networking
  9. CNI و Cilium
  10. Persistent Storage و CSI
  11. StatefulSet
  12. Resource Management
  13. Scheduling
  14. Kubernetes Security
  15. Monitoring با Prometheus و Grafana
  16. Logging با Elasticsearch
  17. Distributed Tracing با Jaeger و OpenTelemetry
  18. Helm
  19. Kustomize
  20. GitOps با Argo CD
  21. High Availability
  22. Backup و Disaster Recovery
  23. Troubleshooting Production Cluster
  24. Kubernetes در معماری‌های Production

گیتنامی — From Infrastructure to Production AI Engineering