Tasuke Hubのロゴ

ITを中心に困っている人を助けるメディア

分かりやすく解決策を提供することで、あなたの困ったをサポート。 全ての人々がスムーズに生活できる世界を目指します。

実践的マイクロサービスのためのKubernetes入門ガイド

記事のサムネイル

マイクロサービスとKubernetesの相性が良い理由

分散システム管理の課題とKubernetesの解決アプローチ

マイクロサービスアーキテクチャは、アプリケーションを小さな独立したサービスに分割することで、開発速度と柔軟性を高める手法として広く採用されています。しかし、多数のサービスを管理・運用する複雑さも同時にもたらします。この課題に対して、Kubernetesは効率的な解決策を提供します。

TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

Kubernetesがマイクロサービスの運用に最適な理由には、以下のような点があります:

  • 宣言的な設定: インフラの状態を明示的に定義し、その状態を維持するシステム
  • 自動スケーリング: 負荷に応じてサービスを自動的にスケールアップ/ダウン
  • サービスディスカバリ: 動的に変化するサービスインスタンスの検出と接続
  • ローリングアップデート: ダウンタイムなしでのサービス更新
  • 自己修復機能: 障害検出と自動復旧メカニズム

Kubernetesの基本概念と構成要素

Kubernetesを理解するには、まず基本的な構成要素を把握することが重要です:

# 基本的なPodの定義例
apiVersion: v1
kind: Pod
metadata:
  name: simple-app
  labels:
    app: web
spec:
  containers:
  - name: web-container
    image: nginx:latest
    ports:
    - containerPort: 80

上記は単一のNginxコンテナを実行するPodの定義例です。Kubernetesでは、以下の主要な概念が重要となります:

  1. Pod: 最小デプロイ単位。一つ以上のコンテナの集合
  2. Deployment: Podのレプリカを管理し、更新戦略を定義
  3. Service: Podへのアクセスを抽象化するネットワークエンドポイント
  4. ConfigMap/Secret: 設定情報や機密情報の管理
  5. Namespace: リソースを論理的に分離する仕組み

マイクロサービス向けのKubernetesクラスター設計

クラスターアーキテクチャの基本パターン

マイクロサービスを効率的に運用するためのKubernetesクラスター設計には、いくつかの基本パターンがあります:

# マルチノードクラスターの基本構成
Master Node (Control Plane)
├── kube-apiserver
├── etcd
├── kube-scheduler
└── kube-controller-manager

Worker Nodes
├── kubelet
├── kube-proxy
└── Container Runtime (Docker/containerd)

環境に応じたクラスター設計のポイント:

  1. 開発環境: シンプルな単一ノードまたは小規模クラスター

    • Minikube, Kind, k3sなどの軽量ソリューションが適切
    • リソースを節約した設定(メモリ・CPU制限を低く)
  2. 本番環境: 高可用性を持つマルチノードクラスター

    • 複数のマスターノードによる冗長構成
    • ゾーン・リージョンをまたいだノード配置
    • 適切なリソース割り当てとバッファ

ネームスペースとリソース管理

マイクロサービスアーキテクチャでは、適切なネームスペース設計が重要です:

# ネームスペース定義の例
apiVersion: v1
kind: Namespace
metadata:
  name: payment-service
  labels:
    team: finance

効果的なネームスペース戦略:

  • 機能/ドメイン別分割: 関連するサービスをドメイン単位でグループ化
  • チーム別分割: 組織構造に合わせた分割
  • 環境別分割: 開発、ステージング、本番などの環境ごとの分離

リソース割り当てと制限の管理:

# リソース制限の設定例
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: payment-service
spec:
  hard:
    requests.cpu: "20"
    requests.memory: 10Gi
    limits.cpu: "40"
    limits.memory: 20Gi

マイクロサービスのデプロイメント戦略

効率的なコンテナイメージ管理

マイクロサービスのデプロイメントでは、コンテナイメージの管理が重要なポイントとなります:

# 効率的なDockerfileの例
FROM node:lts-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:lts-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
COPY package*.json ./
USER node
EXPOSE 3000
CMD ["node", "dist/main.js"]

イメージ管理のベストプラクティス:

  1. マルチステージビルド: ビルド環境と実行環境を分離
  2. 最小限のベースイメージ: Alpine Linuxなどの軽量イメージを使用
  3. レイヤーキャッシュの最適化: 変更頻度に応じたCOPY命令の配置
  4. イメージタグ戦略: セマンティックバージョニングや固定ダイジェストの活用

Deploymentとステートフル管理

ステートレスなマイクロサービスは通常、Deploymentリソースを使用して管理します:

# ステートレスサービスのDeployment例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-gateway
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-gateway
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: api-gateway
    spec:
      containers:
      - name: api-gateway
        image: company/api-gateway:1.2.3
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10

一方、状態を持つサービス(データベースなど)にはStatefulSetを使用します:

# ステートフルサービスの例
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: "postgres"
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:13
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

マイクロサービス間の通信パターン

サービスディスカバリとロードバランシング

Kubernetesは、マイクロサービス間の通信を容易にするためのサービスディスカバリとロードバランシングを提供します:

# サービス定義の例
apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP

サービスタイプの使い分け:

  1. ClusterIP: クラスター内部からのみアクセス可能(デフォルト)
  2. NodePort: 各ノードのポートを通じて外部からアクセス可能
  3. LoadBalancer: クラウドプロバイダのロードバランサーを使用
  4. ExternalName: 外部サービスへのエイリアス

Ingressを活用したAPI管理

複数のマイクロサービスへのアクセスをまとめて管理するには、Ingressが効果的です:

# Ingress定義の例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /users
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 80
      - path: /orders
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 80
  tls:
  - hosts:
    - api.example.com
    secretName: api-tls-cert

Ingressコントローラーの選択ポイント:

  • Nginx Ingress: 汎用性が高く、シンプルな設定
  • Istio/Kong/Traefik: より高度なトラフィック制御や機能が必要な場合
  • AWS ALB Ingress: AWSを使用している場合に最適化されたソリューション

モニタリングとログ管理

Prometheusとその活用法

マイクロサービスアーキテクチャでは、多数のサービスを効率的に監視することが重要です。Prometheusは、Kubernetesとの統合が優れたモニタリングシステムです:

# Prometheusで監視するサービスのアノテーション例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-service
spec:
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "8080"
        prometheus.io/path: "/metrics"
    spec:
      # コンテナ定義

基本的なPrometheusの監視項目:

  1. リソース使用状況: CPU、メモリ、ディスク、ネットワーク
  2. アプリケーションメトリクス: リクエスト数、レイテンシ、エラー率
  3. カスタムビジネスメトリクス: トランザクション数、ユーザーアクティビティなど

分散トレーシングの実装

マイクロサービス間のリクエストフローを可視化するには、分散トレーシングが不可欠です:

// Javaでの分散トレーシング実装例(Spring Boot + OpenTelemetry)
@RestController
public class OrderController {
    @Autowired
    private Tracer tracer;
    
    @GetMapping("/orders/{id}")
    public Order getOrder(@PathVariable String id) {
        Span span = tracer.spanBuilder("getOrder").startSpan();
        try (Scope scope = span.makeCurrent()) {
            span.setAttribute("order.id", id);
            // 他のマイクロサービスを呼び出すなどの処理
            return orderService.findById(id);
        } catch (Exception e) {
            span.setStatus(StatusCode.ERROR);
            span.recordException(e);
            throw e;
        } finally {
            span.end();
        }
    }
}

分散トレーシングの主要コンポーネント:

  • Jaeger/Zipkin: トレースデータの収集と視覚化
  • OpenTelemetry: 統一されたテレメトリデータの収集API
  • Service Mesh: Istioなどを使用した自動的なトレース機能

自動スケーリングと高可用性の確保

Horizontal Pod Autoscalerの設定

負荷に応じてPodの数を自動調整するHorizontal Pod Autoscaler(HPA)は、マイクロサービスの効率的な運用に欠かせません:

# HPAの設定例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: payment-service
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: payment-service
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

スケーリングポリシーの検討ポイント:

  1. 適切なメトリクス選択: CPU/メモリだけでなく、カスタムメトリクスも考慮
  2. 最小レプリカ数: 高可用性を確保するための適切な設定
  3. スケールアップ/ダウンの感度: 急激な負荷変動への対応バランス

障害検知と自動復旧の仕組み

Kubernetesには、マイクロサービスの障害を検知して自動復旧する機能が組み込まれています:

# ヘルスチェックの設定例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
spec:
  template:
    spec:
      containers:
      - name: order-service
        livenessProbe:
          httpGet:
            path: /health/live
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /health/ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

効果的なヘルスチェック設計:

  1. LivenessProbe: アプリケーションが動作中かを確認(クラッシュ検出)
  2. ReadinessProbe: アプリケーションがリクエストを処理できるかを確認
  3. StartupProbe: 起動時間が長いアプリケーションの初期化完了を確認

セキュリティ対策とベストプラクティス

RBAC(Role-Based Access Control)の実装

Kubernetes上のマイクロサービスをセキュアに運用するには、適切なRBACの設定が重要です:

# RBACの設定例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: payment-service
  name: service-reader
rules:
- apiGroups: [""]
  resources: ["pods", "services", "configmaps"]
  verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-payments
  namespace: payment-service
subjects:
- kind: ServiceAccount
  name: payment-service
  namespace: payment-service
roleRef:
  kind: Role
  name: service-reader
  apiGroup: rbac.authorization.k8s.io

RBACの設計原則:

  1. 最小権限の原則: 必要最小限の権限のみを付与
  2. サービスアカウントの分離: マイクロサービスごとに専用のサービスアカウント
  3. 定期的な権限レビュー: 不要になった権限の削除

シークレット管理と暗号化

マイクロサービスで使用する機密情報の管理は特に重要です:

# Secretの定義例
apiVersion: v1
kind: Secret
metadata:
  name: database-credentials
type: Opaque
data:
  username: dXNlcm5hbWU=  # base64エンコード済み
  password: cGFzc3dvcmQ=  # base64エンコード済み

---
# Secretの使用例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: customer-service
spec:
  template:
    spec:
      containers:
      - name: customer-service
        env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: database-credentials
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: database-credentials
              key: password

上級者向けのシークレット管理ソリューション:

  1. Vault: 高度なシークレット管理と動的シークレット生成
  2. Sealed Secrets: GitOpsワークフローでの暗号化されたシークレット
  3. クラウドプロバイダのキー管理サービス: AWS KMS、GCP KMSなど

まとめ:マイクロサービスとKubernetesの実践的活用

Kubernetesは、マイクロサービスアーキテクチャを効率的に運用するための強力なプラットフォームです。本記事で紹介した内容をまとめると:

  1. 適切なクラスター設計: 環境や規模に合わせたアーキテクチャ選択
  2. 効率的なデプロイメント戦略: コンテナイメージの最適化と更新戦略
  3. サービス間通信の管理: サービスディスカバリとIngress設定
  4. モニタリングとオブザーバビリティ: メトリクス、ログ、トレーシング
  5. 自動スケーリングと高可用性: 負荷対応と障害検知の自動化
  6. セキュリティ対策: 適切な権限管理と機密情報の保護

実際の導入にあたっては、組織の規模や技術スタック、チーム構造に応じたカスタマイズが必要です。段階的な導入と継続的な学習・改善のサイクルを確立することが、Kubernetesを用いたマイクロサービスの成功には不可欠です。

おすすめコンテンツ