Kubernetes入門|エンジニアが最初に理解すべき5つのコア概念とk8sの全体像

IT実務・技術メモ

Kubernetesを学ぼうと決めたものの、Pod、Deployment、Service、Namespace……という専門用語が次々と出てきて、どこから理解すればいいのか分からず、困っていませんか。

多くのエンジニアがこの状態に陥ります。Kubernetesの公式ドキュメントは包括的ですが、初心者には難しすぎることが多いです。結果として「何となく雰囲気は分かるが、実際には使えない」というジレンマに陥ってしまいます。

本記事では、エンジニアが実務でKubernetesを活躍させるために最初に理解すべき5つのコア概念を、実践的なコード例とともに解説します。この記事を読み終わる頃には、Kubernetesの全体像が明確に見えるようになるでしょう。

Kubernetesとは何か:k8sの位置付けを理解する

Kubernetesは、Googleが開発したオープンソースのコンテナオーケストレーションプラットフォームです。「k8s」という略称は、KubernetesのKとsの間に8文字あることに由来しています。

Dockerがコンテナを個別に管理するのに対し、Kubernetesはコンテナを大規模に、自動的に管理します。具体的には、以下のような役割を果たします。

  • 複数のマシン(ノード)に分散してアプリケーションを配置
  • 障害が発生したコンテナを自動的に再起動
  • トラフィックに応じて自動的にコンテナ数を増減(オートスケーリング)
  • ローリングアップデートで無停止デプロイ
  • ネットワークとストレージを統一管理

2024年時点で、Kubernetesはクラウドネイティブアプリケーションの標準プラットフォームとなっており、AWS EKS、Google GKE、Azure AKSなど主要クラウドプロバイダーでマネージドサービスとして提供されています。

Kubernetesの5つのコア概念:実務で必須の知識

1. Pod:Kubernetesにおける最小単位

Podは、Kubernetesでデプロイ可能な最小単位です。1つのPodは通常1つのコンテナを実行しますが、複数のコンテナを実行することもできます。

ここが初心者の最初の落とし穴です。「DockerのコンテナとPodは同じではない」と理解することが重要です。Podはコンテナのラッパーであり、ネットワークやストレージなどのリソースを共有する複数のコンテナをグループ化します。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: app
    image: nginx:latest
    ports:
    - containerPort: 80

上記のYAMLは、Nginxを実行する最もシンプルなPodです。しかし実務では、このPodを直接作成することはほぼありません。代わりにDeploymentという上位の概念を使います。

2. Deployment:本番環境で使う宣言的管理

Deploymentは、Podのライフサイクルを管理する最上位の概念です。Deploymentを定義すれば、Kubernetesが自動的に適切な数のPodを作成・管理・更新してくれます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

このDeploymentは、Nginxのコンテナを3つのレプリカとして実行します。1つのPodが落ちても、Kubernetesは自動的に新しいPodを立ち上げて、常に3つのPodを維持します。

Deploymentは宣言型の定義です。「このような状態にしてほしい」と記述すれば、Kubernetesが現在の状態とのギャップを埋めるための操作を自動実行します。これがGitOpsの基本思想であり、インフラストラクチャをコード化する重要な考え方です。

3. Service:ネットワーク通信を担当する概念

Podは動的に作成・削除されるため、Podが持つIPアドレスも頻繁に変わります。複数のPodを運用する場合、「どのPodに通信を送るか」という問題が発生します。ここで登場するのがServiceです。

ServiceはPodに対する固定のエンドポイントを提供し、トラフィックをPodに分散(ロードバランシング)します。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

このServiceは、「app: nginx」というラベルを持つすべてのPodに対するロードバランサーとして機能します。クライアントは、個別のPodのIPを知らなくても「nginx-service」という固定の名前で通信できます。

Serviceには3つの主要なタイプがあります:ClusterIPはクラスタ内部通信、NodePortは外部からのアクセス、LoadBalancerはクラウドプロバイダーのロードバランサーを使用します。

4. Namespace:クラスタをさらに分割する概念

1つのKubernetesクラスタを複数のチームで共有する場合、リソースの分離が必要です。Namespaceはクラスタを論理的に分割する仕組みです。

apiVersion: v1
kind: Namespace
metadata:
  name: production

---
apiVersion: v1
kind: Namespace
metadata:
  name: staging

上記のように、本番環境と開発環境を別のNamespaceに分割できます。各Namespaceは独立したリソースセットを持ち、名前衝突を防ぐことができます。

Namespaceはまた、リソースクォータとネットワークポリシーの単位にもなります。つまり「productionのNamespaceは最大20CPUまで」という制限を設定できます。

5. ConfigMap・Secret:設定情報の管理

アプリケーションの設定情報(データベース接続先、APIキーなど)をコンテナイメージに焼き込むべきではありません。Kubernetesはこれを解決するために、ConfigMapとSecretという仕組みを提供しています。

ConfigMapは非機密情報を、Secretは機密情報(パスワード、トークンなど)を保存します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_HOST: "postgres.default.svc.cluster.local"
  DATABASE_PORT: "5432"
  LOG_LEVEL: "info"

---
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  DATABASE_PASSWORD: cGFzc3dvcmQxMjM=  # base64エンコード

Podはこれらを環境変数またはファイルとしてマウントして使用します。この分離により、コンテナイメージは環境に依存しなくなり、同じイメージを開発環境・本番環境で再利用できます。

Kubernetesアーキテクチャ:マスターとワーカーの役割分担

Kubernetesクラスタは大きく分けて2つのコンポーネントで構成されています。

コントロールプレーン(マスターノード)は、クラスタ全体の状態を管理し、Deploymentなどのリソース定義に基づいて実際のPodをワーカーノードに配置する指令を出します。APIサーバー、etcdデータベース、スケジューラー、コントローラーマネージャーなどが含まれます。

ワーカーノードは、実際のコンテナを実行するマシンです。kubeletというエージェントがコントロールプレーンからの指令を受け取り、Dockerなどのコンテナランタイムでコンテナを起動・停止します。

コンポーネント 役割 配置
APIサーバー すべてのKubernetes操作の入り口 コントロールプレーン
etcd クラスタの全状態を保存するデータベース コントロールプレーン
スケジューラー Podをどのワーカーノードに配置するか決定 コントロールプレーン
kubelet ワーカーノード上でPodを実行・管理 ワーカーノード
kube-proxy ネットワークトラフィックをPodに転送 ワーカーノード

実践的なワークフロー:Kubernetesでアプリをデプロイする流れ

Kubernetesを使った典型的なワークフローは以下の通りです。

  1. Dockerイメージをコンテナレジストリ(Docker Hub、ECRなど)にプッシュ
  2. DeploymentやServiceなどのマニフェストファイル(YAML)を作成
  3. kubectlコマンドでマニフェストをKubernetesクラスタに適用
  4. Kubernetesが自動的にPodを作成・起動
  5. Serviceが外部からのアクセスを受け付ける
  6. ログ確認、モニタリング、トラブルシューティング

実際のコマンド例は以下の通りです。

# マニフェストをクラスタに適用
kubectl apply -f deployment.yaml

# Podの状態確認
kubectl get pods

# ログの確認
kubectl logs pod-name

# Podの詳細情報表示
kubectl describe pod pod-name

# Podに直接ログイン
kubectl exec -it pod-name -- /bin/bash

実務ではこれらのコマンドと、Perplexity AIのような技術調査ツールを組み合わせることで、Kubernetesのトラブルシューティングをより効率的に進められます。

Kubernetesを学ぶ際よくある間違いと対策

Kubernetesの学習過程で陥りやすい落とし穴を3つご紹介します。

間違い1:Podを直接管理しようとする。多くの初心者は、個別のPodマニフェストを書いて管理しようとします。しかし本番環境では必ずDeploymentを使用してください。Deploymentはローリングアップデートや自動復旧などの機能を提供し、Podの直接管理は非効率です。

間違い2:Serviceの種類を理解しないまま使う。ClusterIP、NodePort、LoadBalancerのそれぞれの違いを理解せず適切でないタイプを選択すると、セキュリティリスクやコスト増加につながります。外部からアクセス不要ならClusterIP、テスト環境ならNodePort、本番環境ならLoadBalancerが基本です。

間違い3:すべてを1つのNamespaceに詰め込む。複数の環境やチームでクラスタを共有する場合、必ずNamespaceで分割してください。分割しないと、リソースクォータの設定ができず、1つのチームの暴走が全体に影響する可能性があります。

ChatGPTを使う際も同じ落とし穴が存在します。正しい概念理解があれば、AIツールの回答もより正確に評価できるようになります。

おすすめ書籍・ガジェット

  • Kubernetes完全ガイド 第2版:Kubernetesの全体像を体系的に学べる国内最高峰の技術書。初心者から実務レベルまで対応しており、手元に置いておく価値があります。
  • Docker/Kubernetes実戦ガイド:DockerからKubernetesまでの流れを実践的に学べる書籍。演習問題が豊富で、学んだ知識をすぐに手を動かして確認できます。
  • HHKB Professional HYBRID:Kubernetesの学習には長時間のコーディングが必要。高級キーボードで快適性を確保することで、学習効率が向上します。

次のステップ:Kubernetesスキルを実務レベルまで高める

本記事で紹介した5つの概念を理解したら、次は実践的なスキルを磨くことが重要です。以下のステップを推奨します。

ステップ1:ローカル環境で実験する。minikubeやDocker Desktopに含まれるKubernetes機能を使い、自分のマシン上で実際にDeploymentを作成・更新・削除してみてください。

ステップ2:マネージドKubernetesサービスを試す。AWS EKS、Google GKE、Azure AKSなどの無料トライアルで、本物のマルチノードクラスタを体験してください。

ステップ3:Helmを学ぶ。Helmは複数のマニフェストをテンプレート化・パッケージ化するツールで、実務で必須です。

ステップ4:CI/CDパイプラインを構築する。GitLabCI、GitHub Actions、Jenkinsなどと組み合わせ、コードプッシュから自動デプロイまでの流れを実装してください。

Cursorなどの最新開発ツールを活用することで、Kubernetesマニフェストの記述やトラブルシューティングの効率を大きく改善できます。

よくある質問への回答

Kubernetesを学ぶには、Dockerの知識がどの程度必要ですか?

Dockerの基本的な使い方(イメージのビルド、コンテナの実行、レジストリへのプッシュ)を理解していることが望ましいです。Kubernetesはコンテナを管理するツールなので、コンテナ自体の概念を知らないと習得が難しくなります。ただしKubernetesの学習を進める中でDockerへの理解が自然と深まるため、完全な習得は不要です。

PodとDeploymentの違いを簡潔に説明してください。

Podはコンテナを実行する最小単位で、短命です。Deploymentは複数のPodを管理し、指定された数のPodを常に維持し、障害時に自動復旧する上位の概念です。本番環境ではPodを直接作成せず、必ずDeploymentで管理してください。

Namespaceとクラスタの関係は何ですか?

1つのKubernetesクラスタは複数のNamespaceを含むことができます。クラスタはハードウェアのグループ、Namespaceはソフトウェア的な分割です。複数のチームや環境を1つのクラスタで管理する場合、Namespaceで論理的に分離します。

ServiceがなくてもPodに直接アクセスできないのですか?

理論上は可能ですが、実務では避けるべきです。Podは動的に生成・削除されるため、IPアドレスが頻繁に変わります。Serviceを使うことで、固定のエンドポイントを通じた安定した通信が実現でき、ロードバランシングも自動的に行われます。

Kubernetesの習得期間はどのくらい必要ですか?

基本概念の理解には2~4週間、実務での活用スキルには2~3ヶ月が目安です。本記事で紹介した5つのコア概念を完全に理解できれば、簡単なアプリケーションのデプロイは即座に可能になります。複雑なシナリオへの対応能力は経験を積む中で段階的に向上します。

まとめ

Kubernetesは複雑に見えますが、Pod・Deployment・Service・Namespace・ConfigMapという5つのコア概念を理解すれば、全体像がはっきり見えてきます。

本記事で解説した内容は、Kubernetesで実務レベルの仕事をするための最低限の知識です。ここから出発して、Helm、Ingress、StatefulSet、DaemonSetなどへと学習を進めることができます。

Kubernetesはクラウドネイティブアプリケーション開発の事実上の標準です。これからのキャリアでインフラ構築やDevOpsに関わるなら、この知識は避けて通れません。AIツールを活用して業務効率化するエンジニアたちも、多くの場合Kubernetesで自動化されたパイプラインで仕事をしています。

今すぐローカル環境でminikubeを起動し、簡単なDeploymentを作成してみてください。その実践の中で、理論と実践が一致したとき、Kubernetesの真の価値を実感できるでしょう。

タイトルとURLをコピーしました