Chuyển đến nội dung chính

レッスン 3: Kubernetes アーキテクチャとコア概念

Kubernetes アーキテクチャ (コントロール プレーン、ワーカー ノード)、コア リソース (ポッド、デプロイメント、サービス、ConfigMap、シークレット)、名前空間戦略、および Kubernetes がコンテナを自動的にオーケストレーションする方法。

🏗️ アーキテクチャ — レッスン 3 レッスン 3: Kubernetes アーキテクチャとコア コンセプト

クラウドネイティブのマイクロサービスアーキテクチャ

パート 1: クラウド ネイティブの基盤

xdev.asia

レッスン 3: Kubernetes アーキテクチャとコア概念

はじめに

Kubernetes (K8s) は、コンテナー ワークロードの標準オーケストレーション プラットフォームです。マイクロサービス システムを実装する前に、Kubernetes のアーキテクチャと中心的な概念を理解することが必須です。


1. Kubernetes アーキテクチャ

1.1 概要

┌────────────────────────────────────────────────────────────┐
│                    Kubernetes Cluster                       │
│                                                            │
│  ┌──────────────────── Control Plane ────────────────────┐ │
│  │                                                       │ │
│  │  ┌───────────┐  ┌──────────┐  ┌───────────────────┐  │ │
│  │  │ API Server│  │Scheduler │  │Controller Manager │  │ │
│  │  │ (kube-    │  │          │  │                   │  │ │
│  │  │ apiserver)│  │          │  │ - ReplicaSet      │  │ │
│  │  └─────┬─────┘  └──────────┘  │ - Deployment      │  │ │
│  │        │                      │ - Node            │  │ │
│  │  ┌─────▼─────┐               │ - Service Account │  │ │
│  │  │   etcd    │               └───────────────────┘  │ │
│  │  │ (cluster  │                                       │ │
│  │  │  state)   │  ┌──────────────────────────────────┐ │ │
│  │  └───────────┘  │ Cloud Controller Manager         │ │ │
│  │                 │ (LoadBalancer, Volume, Node)      │ │ │
│  │                 └──────────────────────────────────┘ │ │
│  └───────────────────────────────────────────────────────┘ │
│                                                            │
│  ┌──────── Worker Node 1 ──────┐  ┌── Worker Node 2 ────┐ │
│  │                              │  │                      │ │
│  │  ┌────────┐  ┌────────────┐ │  │  ┌────────┐         │ │
│  │  │kubelet │  │kube-proxy  │ │  │  │kubelet │  ...    │ │
│  │  └────────┘  └────────────┘ │  │  └────────┘         │ │
│  │  ┌────────────────────────┐ │  │                      │ │
│  │  │   containerd           │ │  │                      │ │
│  │  │  ┌─────┐ ┌─────┐      │ │  │                      │ │
│  │  │  │Pod A│ │Pod B│ ...  │ │  │                      │ │
│  │  │  └─────┘ └─────┘      │ │  │                      │ │
│  │  └────────────────────────┘ │  │                      │ │
│  └──────────────────────────────┘  └──────────────────────┘ │
└────────────────────────────────────────────────────────────┘

1.2 コントロール プレーンのコンポーネント

kube-apiserver — クラスターの「フロント ドア」:

  • すべての REST API リクエストを受信します
  • 認証(AuthN)と認可(AuthZ)
  • リソースを検証して etcd に永続化する
  • etcd と直接通信する唯一のコンポーネント

etcd — 分散キー値ストア:

  • クラスタ状態全体 (望ましい状態 + 実際の状態) を保存します
  • 強い一貫性 (Raft コンセンサス)
  • 定期的にバックアップする必要がある

kube-scheduler — ポッドを実行するノードを決定します。

  • リソースリクエスト、アフィニティ、汚染/容認を評価します。
  • スコアリングアルゴリズム: 最適なノードを選択します

kube-controller-manager — 望ましい状態 = 実際の状態であることを確認します。

  • ReplicaSet コントローラー: 正しい数のレプリカを確保します
  • デプロイメント コントローラー: ローリング アップデートを管理します。
  • ノード コントローラー: ノードの障害を検出します。
  • ジョブ コントローラー: 1 回限りのタスクを管理します

1.3 ワーカーノードのコンポーネント

kubelet — 各ノードで実行されているエージェント:

  • APIサーバーからポッドスペックを取得
  • ポッド内のコンテナが実行されていることを確認します。
  • ノードのステータスとポッドのステータスをレポートします

kube-proxy — ネットワーク プロキシ:

  • サービスネットワークルールの管理 (iptables/IPVS)
  • ポッドエンドポイントへのトラフィックの負荷分散

コンテナ ランタイム —containerd または CRI-O:

  • イメージのプル、コンテナの起動/停止
  • CRI (Container Runtime Interface) 準拠

2. コアリソース

2.1 ポッド — 最小単位

ポッドは、一緒に実行され、ネットワークとストレージを共有する 1 つ以上のコンテナです。

apiVersion: v1
kind: Pod
metadata:
  name: order-service
  labels:
    app: order-service
spec:
  containers:
    - name: order-service
      image: registry.example.com/order-service:1.0.0
      ports:
        - containerPort: 8080
      resources:
        requests:
          cpu: "250m"
          memory: "256Mi"
        limits:
          cpu: "500m"
          memory: "512Mi"
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: order-config
              key: db_host

注意: 運用環境では、ポッドを直接作成しないでください。常に「デプロイメント」を使用してください。

2.2 導入 — ライフサイクル管理

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  labels:
    app: order-service
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Thêm tối đa 1 pod khi update
      maxUnavailable: 0  # Không cho phép pod nào unavailable
  selector:
    matchLabels:
      app: order-service
  template:
    metadata:
      labels:
        app: order-service
        version: v1
    spec:
      containers:
        - name: order-service
          image: registry.example.com/order-service:1.0.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: "250m"
              memory: "512Mi"
            limits:
              cpu: "500m"
              memory: "1Gi"
          readinessProbe:
            httpGet:
              path: /health/ready
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /health/live
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
          startupProbe:
            httpGet:
              path: /health/started
              port: 8080
            failureThreshold: 30
            periodSeconds: 2

2.3 サービス — エクスポージャと負荷分散

# ClusterIP — Internal communication (default)
apiVersion: v1
kind: Service
metadata:
  name: order-service
spec:
  type: ClusterIP
  selector:
    app: order-service
  ports:
    - port: 8080
      targetPort: 8080

# DNS: order-service.default.svc.cluster.local
# Short: order-service (cùng namespace)

サービスの種類:

ClusterIP   → Internal only (default)
NodePort    → Expose qua port trên mỗi node (30000-32767)
LoadBalancer → Cloud provider tạo external LB
ExternalName → DNS CNAME alias

2.4 ConfigMap とシークレット

# ConfigMap — non-sensitive config
apiVersion: v1
kind: ConfigMap
metadata:
  name: order-config
data:
  db_host: "postgres-order.database.svc.cluster.local"
  db_port: "5432"
  db_name: "orders"
  log_level: "info"

---
# Secret — sensitive data (base64 encoded)
apiVersion: v1
kind: Secret
metadata:
  name: order-secret
type: Opaque
data:
  db_password: cGFzc3dvcmQxMjM=   # base64
  api_key: c2stbXlhcGlrZXk=

重要: Kubernetes Secret は Base64 でのみエンコードされ、エンコードされません。運用環境では、Sealed Secrets または External Secrets Operator + Vault を使用します。

2.5 イングレス — 外部アクセス

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    nginx.ingress.kubernetes.io/rate-limit: "100"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
    - hosts:
        - api.example.com
      secretName: api-tls
  rules:
    - host: api.example.com
      http:
        paths:
          - path: /api/orders
            pathType: Prefix
            backend:
              service:
                name: order-service
                port:
                  number: 8080
          - path: /api/payments
            pathType: Prefix
            backend:
              service:
                name: payment-service
                port:
                  number: 8080

3. 自動スケーリング

3.1 水平ポッド オートスケーラー (HPA)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: order-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: order-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  # Chờ 5 phút trước khi scale down
      policies:
        - type: Pods
          value: 1
          periodSeconds: 60           # Giảm tối đa 1 pod mỗi 60s

3.2 垂直ポッド オートスケーラー (VPA)

VPA は CPU/メモリ リクエストを自動的に調整します。

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: order-service-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: order-service
  updatePolicy:
    updateMode: "Auto"
  resourcePolicy:
    containerPolicies:
      - containerName: order-service
        minAllowed:
          cpu: "100m"
          memory: "128Mi"
        maxAllowed:
          cpu: "2"
          memory: "4Gi"

4. 名前空間戦略

Kubernetes Cluster
│
├── kube-system          # System components (CoreDNS, metrics-server)
├── kube-public          # Public resources
│
├── platform             # Shared infrastructure
│   ├── kafka
│   ├── redis
│   ├── postgresql
│   └── prometheus
│
├── gateway              # API Gateway (Kong/Traefik)
│
├── services-prod        # Production services
│   ├── order-service (3 replicas)
│   ├── payment-service (3 replicas)
│   ├── inventory-service (2 replicas)
│   └── notification-service (2 replicas)
│
├── services-staging     # Staging (1 replica each)
│
├── monitoring           # Observability stack
│   ├── grafana
│   ├── loki
│   ├── jaeger
│   └── alertmanager
│
└── argocd               # GitOps controller

名前空間ごとのリソース クォータ:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: services-prod-quota
  namespace: services-prod
spec:
  hard:
    requests.cpu: "20"
    requests.memory: "40Gi"
    limits.cpu: "40"
    limits.memory: "80Gi"
    pods: "100"

5. Kubernetes ネットワーキング モデル

5.1 ポッド間の通信

Kubernetes Network Rules:
1. Mọi Pod có thể giao tiếp với mọi Pod khác (không cần NAT)
2. Agents trên node (kubelet) có thể giao tiếp với tất cả Pods trên node đó
3. Mỗi Pod có IP riêng trong cluster CIDR

Pod A (10.244.1.5) ──────────▶ Pod B (10.244.2.3)
     Node 1                         Node 2
     │                              │
     └──── CNI Plugin (Calico/Cilium/Flannel) ────┘

5.2 CoreDNS によるサービス検出

Service DNS formats:
├── <service>.<namespace>.svc.cluster.local  (FQDN)
├── <service>.<namespace>.svc                (shortened)
├── <service>.<namespace>                    (shortened)
└── <service>                                (same namespace)

Ví dụ:
order-service gọi payment-service:
  curl http://payment-service:8080/api/pay           # same namespace
  curl http://payment-service.services-prod:8080     # cross namespace

6. まとめ

コンポーネント役割
コントロールプレーンクラスターの状態、スケジューリング、コントローラー ループを管理
ポッド最小のデプロイメントユニット、1 個以上のコンテナ
導入ReplicaSet の管理、ローリング アップデート、ロールバック
サービス安定したネットワーク エンドポイント、負荷分散
構成マップ/シークレット構成を外部化する
イングレス外部 HTTP(S) ルーティング
HPA/VPA水平方向と垂直方向の自動スケーリング
ネームスペース論理的分離、リソース割り当て

次の投稿: マイクロサービスの設計原則 — サービス境界を適切に定義するための SRP、DDD、境界コンテキスト。