コンテナ技術を本番環境で活用するうえで避けて通れないのが「Kubernetes(クバネティス、通称k8s)」です。複数のコンテナを効率よく配置・管理し、障害時には自動で復旧させる仕組みを提供するコンテナオーケストレーションツールとして、いまや多くの企業のインフラ基盤で採用されています。本記事では、Kubernetesの基本概念から実際の運用でよく使われるGitOpsの考え方まで、エンジニアが押さえておきたいポイントを体系的に解説します。
Kubernetesとは何か
KubernetesはGoogleが社内で培ったコンテナ運用のノウハウをもとに開発し、現在はCloud Native Computing Foundation(CNCF)がホストするオープンソースプロジェクトです。Dockerなどで作成したコンテナを「どのサーバーで」「いくつ」「どのように」動かすかを宣言的に定義し、実際の状態を宣言した状態に近づけ続けるという設計思想が特徴です。手動でサーバーにログインしてコンテナを起動するのではなく、あるべき姿をマニフェストファイルに記述し、Kubernetesがその実現を担当します。
覚えておきたい基本リソース
Kubernetesを理解するうえで、まず押さえておきたい代表的なリソース(オブジェクト)を紹介します。
- Pod:Kubernetesで管理する最小単位。1つ以上のコンテナをまとめたグループで、同じPod内のコンテナはネットワークやストレージを共有します。
- Deployment:Podの数や更新方法を管理する仕組み。ローリングアップデートやロールバックを宣言的に扱えます。
- Service:複数のPodへのアクセスを一つの窓口にまとめ、負荷分散や名前解決を提供します。
- ConfigMap / Secret:設定値や機密情報をコンテナの外側で管理し、環境ごとに切り替えられるようにする仕組みです。
- Namespace:クラスタ内をチームや環境(開発・検証・本番など)ごとに論理的に分割する単位です。
クラスタの全体構成
Kubernetesクラスタは大きく「コントロールプレーン」と「ワーカーノード」に分かれます。コントロールプレーンにはAPIサーバー、スケジューラ、コントローラマネージャ、クラスタの状態を保存するetcdなどが含まれ、クラスタ全体の意思決定を担います。一方ワーカーノードには、コンテナを実際に動かすkubelet、ネットワークを制御するkube-proxy、コンテナランタイムが配置され、実際のワークロードを実行します。この役割分担を理解しておくと、障害発生時にどのコンポーネントを調査すべきかの見当がつけやすくなります。
学習環境を手元に作る
本番相当のクラスタをいきなり構築する必要はありません。学習段階では、ノートPC上で手軽にクラスタを立てられるツールを使うのがおすすめです。代表的なものに、単一ノードで動かせるminikubeや、Docker上にクラスタを構築するkindがあります。これらを使えば、無料かつ短時間でKubernetesの挙動を試すことができます。
# kindでクラスタを作成する例
kind create cluster --name study-cluster
# ノードの一覧を確認
kubectl get nodes
# Podの一覧を確認
kubectl get pods --all-namespaces
マニフェストで「あるべき姿」を宣言する
Kubernetesの操作は基本的にYAML形式のマニフェストファイルで行います。以下はシンプルなDeploymentとServiceの例です。
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
spec:
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: sample-app
image: sample-app:1.0.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: sample-app-service
spec:
selector:
app: sample-app
ports:
- port: 80
targetPort: 8080
このファイルをkubectl apply -fで適用すると、指定した3つのレプリカが起動し、Service経由でアクセスできるようになります。障害でPodが1つ落ちても、Deploymentが自動的に新しいPodを起動し、常に3つの状態を維持しようとします。
Helmでマニフェストをテンプレート化する
アプリケーションが複雑になるほど、環境ごとに異なる設定値を持つ多数のYAMLファイルを管理する必要が出てきます。そこで役立つのがKubernetesのパッケージマネージャとして知られる「Helm」です。よく使われる設定をテンプレート化し、環境ごとの差分だけを値ファイルとして管理することで、マニフェストの重複を減らし、再利用性を高めることができます。
GitOpsによる運用
近年の運用スタイルとして定着しつつあるのが「GitOps」という考え方です。クラスタのあるべき状態をGitリポジトリで一元管理し、ArgoCDやFluxのようなツールがリポジトリの内容とクラスタの実際の状態を継続的に比較・同期します。手動でkubectl applyを実行する運用と比べて、変更履歴がすべてGitに残るため、誰が・いつ・何を変更したかを追跡しやすく、問題が発生した際にもGitの履歴から前の状態に戻しやすいという利点があります。
可観測性(オブザーバビリティ)を確保する
クラスタの数が増え、Podが動的に入れ替わる環境では、従来のサーバー単位での監視だけでは状況を把握しきれません。メトリクス収集にはPrometheus、可視化にはGrafana、ログ収集にはFluentdやLokiといったツールを組み合わせるのが定番の構成です。あわせて、CPUやメモリ使用率に応じてPod数を自動調整するHorizontal Pod Autoscaler(HPA)を設定しておくと、急なアクセス増にも柔軟に対応できます。
セキュリティ運用のポイント
- コンテナは可能な限り非rootユーザーで実行し、必要最小限の権限に絞る
- RBAC(Role-Based Access Control)でユーザーやサービスアカウントの権限を細かく制御する
- NetworkPolicyでPod間通信を必要な範囲に制限する
- SecretはGitに平文でコミットせず、外部シークレット管理サービスとの連携を検討する
- コンテナイメージは定期的に脆弱性スキャンを行い、ベースイメージを最新に保つ
学習を体系化するには資格取得も有効
独学だと知識が断片的になりがちな場合は、CNCFが提供するCKA(Certified Kubernetes Administrator)やCKAD(Certified Kubernetes Application Developer)といった認定資格を学習の指標にするのもおすすめです。試験範囲に沿って学習を進めることで、実務で使う機能を体系的にカバーできます。
まとめ
Kubernetesは学習コストが高いと敬遠されがちですが、Pod・Deployment・Serviceといった基本リソースの役割を理解し、minikubeやkindで実際に手を動かしてみることで、着実に理解を深めることができます。運用フェーズではHelmによるテンプレート化やGitOpsによる変更管理、Prometheus・Grafanaによる可観測性の確保など、周辺エコシステムと組み合わせることでその価値を最大限に発揮します。まずは手元の学習環境で、小さなアプリケーションをデプロイするところから始めてみてください。