Kubernetes

コンテナのデプロイ、スケーリング、管理を自動化するオープンソースのオーケストレーションプラットフォーム

コンテナインフラ
Kubernetes」の技術書を見る →

Kubernetes とは

Kubernetes (K8s) は、Google が Borg の知見をもとに開発したコンテナオーケストレーションプラットフォームである。CNCF がホスト。AWS では EKS (Elastic Kubernetes Service) で利用する。

主要なリソース

Kubernetes はいくつかのリソースを組み合わせてアプリケーションを管理する。Podコンテナの最小実行単位で、Deployment が Pod のレプリカ数管理とローリングアップデートを担う。Service が Pod へのネットワークアクセスを提供し、Ingress が外部からの HTTP ルーティングを制御する。設定データは ConfigMap、秘密情報は Secret で管理し、HPA (Horizontal Pod Autoscaler) が負荷に応じて Pod 数を自動調整する。

Deployment の定義

Deployment の定義の例を示す。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 3
  selector:
    matchLabels: { app: api }
  template:
    metadata:
      labels: { app: api }
    spec:
      containers:
        - name: api
          image: my-app:v1.42.0
          ports: [{ containerPort: 8080 }]
          resources:
            requests: { cpu: 100m, memory: 128Mi }
            limits: { cpu: 500m, memory: 512Mi }

イメージのタグを latest にしないことが実務の要点である。タグを省略するか :latest を指定すると imagePullPolicy が自動的に Always になり、Pod が作り直されるたびに最新イメージを取り直すため、同じマニフェストでも起動した時期によって中身が変わる。どのバージョンが動いているかを追えず戻す先も特定できないので、v1.42.0 のような意味のあるタグかダイジェストで固定する。requests はスケジューリング時に必要な空き容量の申告、limits は実行中の上限で、メモリが limits を超えたコンテナは停止させられ、CPU は上限まで絞られる (スロットリング) だけで停止はしない。

EKS vs ECS vs Lambda

EKS、ECS Fargate、Lambda の違いを以下にまとめる。

観点EKSECS FargateLambda
管理負荷高い低い最低
K8s エコシステムHelm や Operator をそのまま使える使えず、AWS 側の機能で代替する使えず、AWS 側の機能で代替する
コスト (アイドル)クラスタ費用タスク数ゼロ
実行時間無制限無制限最大 15 分
用途K8s が必要な場合コンテナイベント駆動

いつ Kubernetes を使うか

Kubernetes を選ぶ理由は「コンテナを動かしたい」ではなく、その周辺エコシステムまで必要かどうかにある。

場面選ぶ基盤理由
Deployment や Ingress、HPA といったリソース定義を活かしたいEKSこれらは Kubernetes 固有のリソースで、他の基盤では同じ定義を持ち込めず同等の仕組みを別の形で組み直すことになる
コンテナを動かしたいだけで Kubernetes 固有の機能は要らないECS FargateEKS は 3 つの中で管理負荷が最も高く、クラスタとマニフェスト群を維持し続ける必要がある。動かす対象が同じなら負荷の低い側で足りる
イベントを受けて短時間の処理を回すLambda実行時間の上限 (最大 15 分) に収まる範囲なら、コンテナを常駐させずリクエスト単位で処理できる
呼び出しが散発的で、待機中の費用を抑えたいLambda常駐するタスクもクラスタも持たないため、アイドル時に積み上がる固定費が発生しない

実務での活用方法は関連書籍にも詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事