Docker & Kubernetes完全攻略 第7編:Kubernetesインストールとクラスター構成
Docker & Kubernetes Complete Guide Part 7: Kubernetes Installation and Cluster Configuration
序論: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について詳しく学んでいきます。