はじめに
Kubernetes(クバネティス)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースのプラットフォームです。
このチュートリアルでは、Kubernetesの基本的な概念から、ローカル環境でのセットアップ、シンプルなアプリケーションのデプロイまでを解説します。
前提条件
- OS: Windows, macOS, または Linux
- 仮想化ソフトウェア: VirtualBox, VMware, または他のサポートされた仮想化ツール(Minikubeを使用する場合)
- 基本的なコマンドライン操作の知識
Kubernetesとは
Kubernetesは、コンテナ化されたアプリケーションの自動デプロイ、スケーリング、管理を行うオープンソースのプラットフォームです。
Googleによって開発され、現在はCloud Native Computing Foundation(CNCF)によって管理されています。
Kubernetesは、複数のホスト上で動作するコンテナを効率的に管理し、高い可用性とスケーラビリティを提供します。
主な特徴
- 自動デプロイとロールバック
- サービスディスカバリとロードバランシング
- ストレージオーケストレーション
- 自動スケーリング
- 自己修復機能
- シークレットと構成管理
Kubernetesアーキテクチャ
Kubernetesのアーキテクチャは、マスターコンポーネントとノードコンポーネントで構成されています。
以下の図は、Kubernetesクラスタの基本的な構成を示しています。
ローカル環境へのセットアップ
このチュートリアルでは、ローカルマシンにKubernetesクラスタをセットアップするためにMinikubeを使用します。
Minikubeは、ローカル開発環境でKubernetesを実行するためのツールです。
Minikubeのインストール
-
仮想化ソフトウェアのインストール
Minikubeは仮想マシン上でKubernetesを実行するため、仮想化ソフトウェアが必要です。
ここではVirtualBoxを例にします。- VirtualBoxのダウンロードからインストーラーをダウンロードし、インストールします。
-
Minikubeのインストール
-
macOS:
brew install minikube
-
Windows:
choco install minikube
-
Linux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
-
kubectlのインストール
kubectl
はKubernetesクラスタを操作するためのコマンドラインツールです。
-
macOS:
brew install kubectl
-
Windows:
choco install kubernetes-cli
-
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/
Minikubeの起動
Minikubeを起動してKubernetesクラスタを作成します。
※このときに、Dockerを起動しておいてください。
minikube start
起動が完了すると、kubectl
を使用してクラスタを操作できるようになります。
kubectl cluster-info
基本的な概念
Kubernetesを理解するためには、以下の基本的な概念を押さえておくことが重要です。
クラスタとノード
- クラスタ: Kubernetesの実行環境。複数のノード(物理または仮想マシン)で構成されます。
- ノード: クラスタ内の単一のマシン。各ノードはKubernetesのコンポーネント(kubelet、コンテナランタイムなど)を実行します。
Pod
PodはKubernetesにおける最小のデプロイメント単位で、1つ以上のコンテナを含みます。
コンテナは同じネットワーク名前空間とストレージを共有します。
Deployment
DeploymentはPodの宣言的な更新を管理します。
アプリケーションのバージョンアップやスケーリングを簡単に行うことができます。
Service
ServiceはPodへの安定したネットワークアクセスを提供します。
ロードバランシングやサービスディスカバリの機能を持っています。
Kubernetesリソースの関係
以下の図は、クラスタ内でのKubernetesリソース間の関係を示しています。
シンプルなアプリケーションのデプロイ
ここでは、シンプルな「Hello World」アプリケーションをKubernetesクラスタにデプロイします。
Hello Worldアプリの作成
まず、簡単なウェブサーバーアプリケーションを用意します。ここでは既存のDockerイメージを使用します。
# hello-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 2
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello-container
image: hashicorp/http-echo
args:
- "-text=Hello, Kubernetes!"
ports:
- containerPort: 5678
Deploymentの作成
上記のYAMLファイルを適用してDeploymentを作成します。
kubectl apply -f hello-deployment.yaml
Deploymentのステータスを確認します。
kubectl get deployments
kubectl get pods
Serviceの作成とアクセス
次に、Deploymentで作成されたPodにアクセスするためのServiceを作成します。
# hello-service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
type: NodePort
selector:
app: hello
ports:
- protocol: TCP
port: 80
targetPort: 5678
nodePort: 30007
Serviceを適用します。
kubectl apply -f hello-service.yaml
Serviceの詳細を確認します。
kubectl get services
Minikubeを使用している場合、以下のコマンドでサービスにアクセスできます。
minikube service hello-service
ブラウザが開き、「Hello, Kubernetes!」と表示されるはずです。
アプリケーションのスケーリング
Deploymentを使用すると、簡単にPodの数を増減させることができます。
例えば、Podの数を4にスケールアップするには以下のコマンドを実行します。
kubectl scale deployment hello-deployment --replicas=4
スケーリングの状態を確認します。
kubectl get deployments
kubectl get pods
アプリケーションの更新
Deploymentを使用すると、アプリケーションの新しいバージョンへのローリングアップデートが容易です。
例えば、異なるメッセージを表示するように更新します。
-
hello-deployment.yaml
を編集し、args
のテキストを変更します。args: - "-text=Hello, Kubernetes! Updated version."
-
更新を適用します。
kubectl apply -f hello-deployment.yaml
-
ローリングアップデートの進行状況を確認します。
kubectl rollout status deployment hello-deployment
-
アプリケーションにアクセスし、メッセージが更新されたことを確認します。
クリーンアップ
ローカル環境のクラスタとリソースを削除してクリーンアップします。
kubectl delete -f hello-service.yaml
kubectl delete -f hello-deployment.yaml
minikube stop
minikube delete
まとめ
このチュートリアルでは、Kubernetesの基本的な概念からローカル環境でのセットアップ、シンプルなアプリケーションのデプロイ、スケーリング、更新までを学びました。
Kubernetesは非常に強力で柔軟なプラットフォームであり、実際の運用環境ではさらに多くの機能やベストプラクティスがあります。
次のステップとして、Persistent Volumes、ConfigMaps、Secrets、Helmなどの高度な機能を学ぶことをお勧めします。
参考資料