序論:Kubernetes環境構築の始まり

Kubernetesを学習し活用するための最初のステップは、適切な環境を構築することです。開発目的、テスト環境、プロダクションデプロイなど、使用目的に応じてさまざまなインストールオプションが存在します。この第7編では、ローカル開発環境からクラウドマネージドサービス、そして直接クラスターを構築する方法まで、Kubernetes環境構成に必要なすべてを解説します。

1. ローカル開発環境

ローカル開発環境は、Kubernetesを学習したり、アプリケーションを開発・テストするのに最適です。別途のクラウド費用なしに、自分のコンピュータでKubernetesクラスターを実行できます。

1.1 Minikube

MinikubeはローカルでシングルノードのKubernetesクラスターを実行するための最も人気のあるツールです。さまざまな仮想化ドライバーをサポートし、ほとんどのKubernetes機能をローカルでテストできます。

主な特徴:

  • さまざまなドライバーサポート(Docker、VirtualBox、Hyper-V、KVMなど)
  • Addonsによる拡張機能(Ingress、Dashboard、Metrics Serverなど)
  • マルチノードクラスターシミュレーションサポート
  • さまざまなKubernetesバージョンの選択が可能

1.2 Kind(Kubernetes in Docker)

KindはDockerコンテナをノードとして使用してローカルKubernetesクラスターを実行します。CI/CD環境で特に便利で、マルチノードクラスターを簡単に構成できます。

主な特徴:

  • Dockerさえあれば実行可能
  • 高速なクラスター作成と削除
  • マルチノードクラスター構成が容易
  • CI/CDパイプラインに適している

1.3 Docker Desktop

Docker DesktopはWindowsとmacOSでDockerとKubernetesを一緒に使用できるオールインワンソリューションです。設定でKubernetesを有効にするだけですぐに使用できます。

主な特徴:

  • 簡単なインストールと設定
  • DockerとKubernetesの統合環境
  • GUIによる簡単な管理
  • 自動アップデートサポート

2. クラウドマネージドサービス

プロダクション環境では、クラウドプロバイダーのマネージドKubernetesサービスを使用するのが一般的です。これらのサービスは、コントロールプレーンの管理をクラウドプロバイダーが担当するため、運用負担を大幅に軽減できます。

2.1 Amazon EKS(Elastic Kubernetes Service)

AWSが提供するマネージドKubernetesサービスです。AWSのさまざまなサービスと密接に統合されています。

主な特徴:

  • AWS IAMと統合された認証/認可
  • ELB、EBS、VPCなどAWSサービスとのネイティブ統合
  • Fargateによるサーバーレスコンテナ実行
  • AWSグローバルインフラの活用

2.2 Google GKE(Google Kubernetes Engine)

Kubernetesを作ったGoogleが提供するマネージドサービスです。最も成熟したマネージドKubernetesサービスの1つです。

主な特徴:

  • Autopilotモードでフルマネージド運用
  • 自動アップグレードと復旧
  • GCPサービスとの密接な統合
  • Anthosによるマルチクラウドサポート

2.3 Azure AKS(Azure Kubernetes Service)

Microsoft Azureが提供するマネージドKubernetesサービスです。Azureエコシステムと完全に統合されています。

主な特徴:

  • Azure Active Directory統合
  • Azure DevOpsとの連携
  • Azure Monitorによるモニタリング
  • Windowsコンテナサポート

3. kubeadmでクラスター構築

kubeadmはKubernetesが公式に提供するクラスターブートストラッピングツールです。ベアメタルサーバーやVMでプロダクショングレードのクラスターを構築する際に使用します。

3.1 事前要件

  • Linuxサーバー(Ubuntu、CentOSなど)
  • 最低2GB RAM、2 CPU
  • ネットワーク接続(各ノード間の通信が可能)
  • swapの無効化
  • コンテナランタイム(containerd、CRI-Oなど)

3.2 インストール手順

1. コンテナランタイムのインストール(containerd例):

# 必須パッケージのインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# containerdのインストール
sudo apt-get install -y containerd

# containerdの設定
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

2. kubeadm、kubelet、kubectlのインストール:

# Kubernetes aptリポジトリの追加
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# パッケージのインストール
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

3. クラスターの初期化(マスターノードで):

# クラスターの初期化
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# kubectlの設定
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4. CNIネットワークプラグインのインストール(Flannel例):

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

5. ワーカーノードの参加:

# マスターノードで生成されたjoinコマンドを使用
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

4. Minikubeのインストールと使い方

最もアクセスしやすいMinikubeを詳しく見ていきましょう。

4.1 インストール

Windows(PowerShell):

# Chocolateyを使用
choco install minikube

# または直接ダウンロード
New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force
Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe'
$oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable('Path', "$oldPath;C:\minikube", [EnvironmentVariableTarget]::Machine)

macOS:

# Homebrewを使用
brew install minikube

# または直接ダウンロード
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

Linux:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

4.2 基本的な使い方

# クラスターの起動
minikube start

# 特定のドライバーで起動
minikube start --driver=docker

# 特定のKubernetesバージョンで起動
minikube start --kubernetes-version=v1.29.0

# リソースを指定
minikube start --cpus=4 --memory=8192

# クラスター状態の確認
minikube status

# クラスターの停止
minikube stop

# クラスターの削除
minikube delete

# Kubernetesダッシュボードを開く
minikube dashboard

# Addonsの管理
minikube addons list
minikube addons enable ingress
minikube addons enable metrics-server

5. kubectlのインストールと設定

kubectlはKubernetesクラスターを管理するためのコマンドラインツールです。ほぼすべてのKubernetes作業に使用されます。

5.1 インストール

Windows:

# Chocolateyを使用
choco install kubernetes-cli

# または直接ダウンロード
curl.exe -LO "https://dl.k8s.io/release/v1.29.0/bin/windows/amd64/kubectl.exe"

macOS:

# Homebrewを使用
brew install kubectl

# または直接ダウンロード
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

Linux:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

5.2 自動補完の設定

# Bash
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

# Zsh
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
source ~/.zshrc

# エイリアスの設定
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc

6. kubeconfigファイルの理解

kubeconfigファイルは、kubectlがクラスターに接続するための設定を含んでいます。デフォルトの場所は~/.kube/configです。

6.1 kubeconfigの構造

apiVersion: v1
kind: Config
current-context: my-cluster

# クラスター情報
clusters:
- name: my-cluster
  cluster:
    server: https://192.168.1.100:6443
    certificate-authority-data: LS0tLS1...

# ユーザー認証情報
users:
- name: admin
  user:
    client-certificate-data: LS0tLS1...
    client-key-data: LS0tLS1...

# コンテキスト(クラスター + ユーザー + ネームスペースの組み合わせ)
contexts:
- name: my-cluster
  context:
    cluster: my-cluster
    user: admin
    namespace: default

6.2 コンテキスト管理

# 現在のコンテキストを確認
kubectl config current-context

# 利用可能なコンテキストリスト
kubectl config get-contexts

# コンテキストの切り替え
kubectl config use-context my-other-cluster

# 新しいコンテキストの作成
kubectl config set-context my-context --cluster=my-cluster --user=admin --namespace=my-namespace

# 複数のkubeconfigファイルを結合
export KUBECONFIG=~/.kube/config:~/.kube/config-cluster2
kubectl config view --merge --flatten > ~/.kube/merged-config

7. クラスター状態の確認

クラスターが正常に動作しているかを確認するさまざまな方法を学びます。

7.1 基本的な状態確認コマンド

# クラスター情報
kubectl cluster-info

# ノードリストと状態
kubectl get nodes
kubectl get nodes -o wide

# ノードの詳細情報
kubectl describe node <node-name>

# コンポーネントの状態確認
kubectl get componentstatuses

# すべてのネームスペースのPodを確認
kubectl get pods --all-namespaces

# システムPodを確認
kubectl get pods -n kube-system

7.2 リソース使用量の確認

# ノードリソース使用量(metrics-serverが必要)
kubectl top nodes

# Podリソース使用量
kubectl top pods

# 特定のネームスペースのPodリソース使用量
kubectl top pods -n my-namespace

8. ネームスペース管理

ネームスペースは、クラスター内でリソースを論理的に分離する方法です。チーム別、環境別(dev、staging、prod)、プロジェクト別にリソースを分離できます。

8.1 デフォルトネームスペース

  • default:ネームスペースを指定しない場合に使用されるデフォルトネームスペース
  • kube-system:Kubernetesシステムコンポーネントが実行されるネームスペース
  • kube-public:すべてのユーザーが読み取れる公開リソース用
  • kube-node-lease:ノードハートビート用のネームスペース

8.2 ネームスペース管理コマンド

# ネームスペースリスト
kubectl get namespaces
kubectl get ns

# ネームスペースの作成
kubectl create namespace my-namespace

# YAMLで作成
kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace
  labels:
    environment: development
EOF

# ネームスペースの削除(内部リソースもすべて削除される)
kubectl delete namespace my-namespace

# 特定のネームスペースで作業
kubectl get pods -n my-namespace
kubectl create deployment nginx --image=nginx -n my-namespace

# デフォルトネームスペースの変更
kubectl config set-context --current --namespace=my-namespace

8.3 ネームスペースリソースクォータ

# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: my-namespace
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "20"
    services: "10"
# リソースクォータの適用
kubectl apply -f resource-quota.yaml

# リソースクォータの確認
kubectl describe resourcequota my-quota -n my-namespace

結論

この第7編では、Kubernetes環境構築に必要なさまざまな方法を見てきました。ローカル開発環境ではMinikubeやKindを使用して素早く始めることができ、プロダクション環境ではクラウドマネージドサービスやkubeadmを通じて安定したクラスターを構築できます。

kubectlとkubeconfigの使い方を習得し、クラスター状態の確認やネームスペース管理方法を理解すれば、Kubernetes運用の基礎を固めることができます。次の第8編では、Kubernetesのコアリソースである Pod、Deployment、Serviceについて詳しく学んでいきます。