Kubernetes(k8s)入門:初心者向けチュートリアルで基本をマスター
はじめに
現代のソフトウェア開発とデプロイメントにおいて、コンテナ技術は不可欠な存在となりました。中でも、Dockerはコンテナ化のデファクトスタンダードとして広く利用されています。しかし、コンテナ化されたアプリケーションを効率的に管理・運用するには、高度なオーケストレーションツールが必要です。そこで登場するのが、Kubernetes(クーバネティス、k8s)です。
Kubernetesは、コンテナ化されたアプリケーションのデプロイメント、スケーリング、管理を自動化するためのオープンソースのプラットフォームです。Googleによって開発され、現在はCloud Native Computing Foundation(CNCF)によって管理されています。この記事では、Kubernetesの基本的な概念から、実際に手を動かしてKubernetes環境を構築し、アプリケーションをデプロイするまでを、初心者にもわかりやすく解説します。
Kubernetesとは何か?
Kubernetesは、コンテナ化されたアプリケーションを大規模に運用するためのプラットフォームです。その主な機能は以下の通りです。
- コンテナのオーケストレーション: 複数のコンテナを連携させ、一貫した動作を保証します。
- 自動デプロイメントとロールバック: アプリケーションのデプロイメントとアップデートを自動化し、問題が発生した場合は迅速にロールバックできます。
- 自動スケーリング: トラフィックの変動に応じて、自動的にアプリケーションのインスタンス数を増減させます。
- 自己修復: コンテナが異常終了した場合、自動的に新しいコンテナを起動し、アプリケーションの可用性を維持します。
- サービスディスカバリとロードバランシング: アプリケーションのコンテナを自動的に検出し、トラフィックを分散します。
- ストレージオーケストレーション: アプリケーションが必要とするストレージを自動的にプロビジョニングします。
これらの機能により、Kubernetesはアプリケーションの運用コストを削減し、可用性と信頼性を向上させることができます。
なぜKubernetesを使うのか?
Kubernetesは、従来の仮想マシン(VM)ベースのインフラストラクチャと比較して、多くの利点があります。
- リソースの効率的な利用: コンテナはVMよりも軽量であり、より少ないリソースで実行できます。これにより、インフラストラクチャのコストを削減できます。
- 開発とデプロイメントの迅速化: コンテナ化されたアプリケーションは、環境に依存しないため、開発、テスト、デプロイメントのサイクルを迅速化できます。
- 高い可用性と信頼性: Kubernetesの自己修復機能により、アプリケーションの可用性を高めることができます。
- スケーラビリティ: Kubernetesは、トラフィックの変動に応じて、アプリケーションを自動的にスケーリングできます。
- 移植性: Kubernetesは、オンプレミス、クラウド、ハイブリッドクラウドなど、さまざまな環境で実行できます。
- エコシステムの充実: Kubernetesは、CNCFによって管理されており、活発なコミュニティと豊富なエコシステムを持っています。
これらの利点により、Kubernetesは、現代のソフトウェア開発とデプロイメントにおいて、不可欠なツールとなっています。
Kubernetesの基本的な概念
Kubernetesを理解するためには、いくつかの基本的な概念を理解する必要があります。
- Pod: Kubernetesにおける最小のデプロイ可能なユニットです。1つ以上のコンテナをグループ化し、共有ストレージ、ネットワーク、およびコンテナの実行方法に関する仕様を定義します。
- Node: Kubernetesクラスタ内のワーカマシンです。Podを実行するためのリソース(CPU、メモリ、ストレージ)を提供します。
- Cluster: Kubernetesによって管理されるNodeの集合です。
- Namespace: Kubernetesクラスタ内のリソースを論理的に分離するためのメカニズムです。
- Deployment: Podのレプリカセットを管理し、アプリケーションのデプロイメントとアップデートを自動化します。
- Service: Podのグループに対して安定したIPアドレスとDNS名を提供し、外部からのアクセスを可能にします。
- Ingress: 外部からのHTTP/HTTPSトラフィックをServiceにルーティングするためのAPIオブジェクトです。
- Volume: Pod内のコンテナが利用できる永続的なストレージです。
- ConfigMap: 設定ファイルをPodに注入するためのAPIオブジェクトです。
- Secret: パスワード、APIキーなどの機密情報を安全にPodに注入するためのAPIオブジェクトです。
これらの概念を理解することで、Kubernetesのアーキテクチャと動作をより深く理解することができます。
Kubernetesのアーキテクチャ
Kubernetesクラスタは、通常、以下のコンポーネントで構成されています。
- Control Plane: Kubernetesクラスタの頭脳です。APIサーバー、スケジューラ、コントローラマネージャー、etcdなどのコンポーネントで構成されています。
- API Server: Kubernetes APIを公開し、クラスタ内のすべてのコンポーネント間の通信を処理します。
- Scheduler: 新しいPodをどのNodeで実行するかを決定します。
- Controller Manager: クラスタの状態を監視し、必要なアクションを実行して、目的の状態を維持します。
- etcd: クラスタのすべての設定データと状態を保存する分散キーバリューストアです。
- Node: ワーカマシンです。kubeletとkube-proxyという2つの主要なコンポーネントで構成されています。
- kubelet: Control Planeからの指示を受け取り、Node上でPodを実行します。
- kube-proxy: Node上でネットワークプロキシを実装し、Serviceへのアクセスを可能にします。
これらのコンポーネントが連携して、Kubernetesクラスタの機能を実現しています。
Kubernetes環境の構築
Kubernetes環境を構築するには、いくつかの方法があります。
- Minikube: ローカルマシンにシングルノードのKubernetesクラスタを構築するためのツールです。開発やテストに最適です。
- Kind: Dockerを使用してローカルマシンにKubernetesクラスタを構築するためのツールです。Minikubeよりも高速で、より高度な設定が可能です。
- kubeadm: 本番環境向けのKubernetesクラスタを構築するためのツールです。
- Managed Kubernetes Service: クラウドプロバイダー(AWS、Azure、GCPなど)が提供するマネージドKubernetesサービスを利用する方法です。
ここでは、Minikubeを使用してKubernetes環境を構築する方法を解説します。
Minikubeのインストール
Minikubeをインストールするには、以下の手順に従ってください。
- Minikubeの公式サイト (https://minikube.sigs.k8s.io/docs/start/) から、お使いのOSに合ったMinikubeのバイナリをダウンロードします。
- ダウンロードしたバイナリをPATHの通ったディレクトリに移動します。
minikube version
コマンドを実行して、Minikubeが正しくインストールされていることを確認します。
kubectlのインストール
kubectlは、Kubernetesクラスタを操作するためのコマンドラインツールです。kubectlをインストールするには、以下の手順に従ってください。
- Kubernetesの公式サイト (https://kubernetes.io/docs/tasks/tools/) から、お使いのOSに合ったkubectlのバイナリをダウンロードします。
- ダウンロードしたバイナリをPATHの通ったディレクトリに移動します。
kubectl version
コマンドを実行して、kubectlが正しくインストールされていることを確認します。
Minikubeクラスタの起動
Minikubeをインストールしたら、以下のコマンドを実行してMinikubeクラスタを起動します。
bash
minikube start
このコマンドを実行すると、Minikubeは仮想マシンを作成し、その中にKubernetesクラスタを起動します。クラスタの起動には数分かかる場合があります。
kubectlの設定
Minikubeクラスタが起動したら、kubectlを設定して、Minikubeクラスタにアクセスできるようにします。以下のコマンドを実行してください。
bash
kubectl config use-context minikube
このコマンドを実行すると、kubectlはMinikubeクラスタをデフォルトのクラスタとして使用するように設定されます。
Minikubeクラスタの確認
kubectlが正しく設定されていることを確認するために、以下のコマンドを実行します。
bash
kubectl get nodes
このコマンドを実行すると、Minikubeクラスタ内のNodeの情報が表示されます。Nodeの状態がReady
になっていることを確認してください。
アプリケーションのデプロイ
Kubernetes環境が構築できたら、実際にアプリケーションをデプロイしてみましょう。ここでは、NginxのDockerイメージを使用して、シンプルなWebアプリケーションをデプロイする方法を解説します。
Deploymentの作成
まず、NginxのDeploymentを作成します。以下の内容のnginx-deployment.yaml
ファイルを作成してください。
yaml
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:latest
ports:
- containerPort: 80
このファイルは、以下の内容を定義しています。
- apiVersion: Kubernetes APIのバージョンを指定します。
- kind: 作成するリソースの種類を指定します(ここではDeployment)。
- metadata: Deploymentの名前を指定します。
- spec: Deploymentの詳細な設定を指定します。
- replicas: 実行するPodのレプリカ数を指定します(ここでは3)。
- selector: Deploymentが管理するPodを特定するためのラベルセレクタを指定します。
- template: Podのテンプレートを指定します。
- metadata: Podのラベルを指定します。
- spec: Podの詳細な設定を指定します。
- containers: Pod内で実行するコンテナを指定します。
- name: コンテナの名前を指定します。
- image: 使用するDockerイメージを指定します(ここではNginxの最新バージョン)。
- ports: コンテナがリッスンするポートを指定します(ここでは80番ポート)。
- containers: Pod内で実行するコンテナを指定します。
作成したnginx-deployment.yaml
ファイルを使用して、Deploymentを作成するには、以下のコマンドを実行します。
bash
kubectl apply -f nginx-deployment.yaml
このコマンドを実行すると、Kubernetesはnginx-deployment.yaml
ファイルの内容に基づいてDeploymentを作成します。
Podの確認
Deploymentが作成されたら、Podが正常に起動していることを確認します。以下のコマンドを実行してください。
bash
kubectl get pods
このコマンドを実行すると、クラスタ内で実行中のPodの一覧が表示されます。nginx-deployment
という名前のPodが3つ表示され、状態がRunning
になっていることを確認してください。
Serviceの作成
次に、NginxのServiceを作成します。以下の内容のnginx-service.yaml
ファイルを作成してください。
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
このファイルは、以下の内容を定義しています。
- apiVersion: Kubernetes APIのバージョンを指定します。
- kind: 作成するリソースの種類を指定します(ここではService)。
- metadata: Serviceの名前を指定します。
- spec: Serviceの詳細な設定を指定します。
- selector: ServiceがトラフィックをルーティングするPodを特定するためのラベルセレクタを指定します。
- ports: Serviceが公開するポートを指定します。
- protocol: プロトコルを指定します(ここではTCP)。
- port: Serviceがリッスンするポートを指定します(ここでは80番ポート)。
- targetPort: Pod内のコンテナがリッスンするポートを指定します(ここでは80番ポート)。
- type: Serviceの種類を指定します(ここではLoadBalancer)。
作成したnginx-service.yaml
ファイルを使用して、Serviceを作成するには、以下のコマンドを実行します。
bash
kubectl apply -f nginx-service.yaml
このコマンドを実行すると、Kubernetesはnginx-service.yaml
ファイルの内容に基づいてServiceを作成します。
Serviceの確認
Serviceが作成されたら、Serviceが正常に動作していることを確認します。以下のコマンドを実行してください。
bash
kubectl get service nginx-service
このコマンドを実行すると、nginx-service
という名前のServiceの情報が表示されます。EXTERNAL-IP
という欄にIPアドレスが表示されていることを確認してください。このIPアドレスは、Serviceにアクセスするための外部IPアドレスです。
アプリケーションへのアクセス
Serviceの外部IPアドレスがわかったら、WebブラウザでそのIPアドレスにアクセスして、Nginxのデフォルトページが表示されることを確認してください。
Minikubeを使用している場合は、以下のコマンドを実行して、ServiceのURLを取得できます。
bash
minikube service nginx-service --url
このコマンドを実行すると、ServiceのURLが表示されます。WebブラウザでそのURLにアクセスして、Nginxのデフォルトページが表示されることを確認してください。
Deploymentのスケーリング
Kubernetesは、トラフィックの変動に応じて、アプリケーションを自動的にスケーリングすることができます。ここでは、Deploymentを手動でスケーリングする方法を解説します。
Deploymentのレプリカ数を変更するには、以下のコマンドを実行します。
bash
kubectl scale deployment nginx-deployment --replicas=5
このコマンドは、nginx-deployment
という名前のDeploymentのレプリカ数を5に変更します。
コマンドを実行後、kubectl get pods
コマンドを実行して、Podの数が5つに増えていることを確認してください。
Deploymentのアップデート
Kubernetesは、アプリケーションのアップデートを安全かつ迅速に行うことができます。ここでは、NginxのDockerイメージを新しいバージョンにアップデートする方法を解説します。
DeploymentのDockerイメージをアップデートするには、以下のコマンドを実行します。
bash
kubectl set image deployment/nginx-deployment nginx=nginx:1.21
このコマンドは、nginx-deployment
という名前のDeploymentで使用されているDockerイメージをnginx:1.21
に変更します。
コマンドを実行後、Kubernetesはローリングアップデートを開始し、新しいバージョンのPodを順次起動していきます。アップデートが完了するまで、古いバージョンのPodと新しいバージョンのPodが混在する場合があります。
アップデートが完了したら、kubectl get pods
コマンドを実行して、すべてのPodが新しいバージョンになっていることを確認してください。
まとめ
この記事では、Kubernetesの基本的な概念から、実際にKubernetes環境を構築し、アプリケーションをデプロイするまでを解説しました。Kubernetesは、コンテナ化されたアプリケーションの運用を自動化し、可用性と信頼性を向上させるための強力なツールです。この記事を参考に、Kubernetesの学習を始め、あなたのアプリケーションの運用をより効率的にしてください。
次のステップ
- Kubernetesのドキュメントを読む: Kubernetesの公式サイトには、詳細なドキュメントが用意されています。
- Kubernetesのチュートリアルを試す: Kubernetesの公式サイトには、さまざまなチュートリアルが用意されています。
- Kubernetesのコミュニティに参加する: Kubernetesには、活発なコミュニティがあります。SlackやGitHubなどで質問したり、貢献したりすることができます。
- Kubernetesの認定資格を取得する: Kubernetesには、Certified Kubernetes Administrator (CKA)やCertified Kubernetes Application Developer (CKAD)などの認定資格があります。
これらのステップを踏むことで、Kubernetesの知識とスキルをさらに深めることができます。
付録:よくある質問
Q: Kubernetesは難しいですか?
A: Kubernetesは、最初は複雑に見えるかもしれませんが、基本的な概念を理解すれば、比較的簡単に使い始めることができます。この記事で紹介したチュートリアルを試したり、Kubernetesのドキュメントを読んだりすることで、Kubernetesの知識を深めることができます。
Q: Kubernetesはどのような場合に適していますか?
A: Kubernetesは、大規模なコンテナ化されたアプリケーションの運用に適しています。Kubernetesは、アプリケーションのスケーリング、自己修復、自動デプロイメントなどの機能を提供するため、アプリケーションの可用性と信頼性を向上させることができます。
Q: Kubernetesはどのような環境で実行できますか?
A: Kubernetesは、オンプレミス、クラウド、ハイブリッドクラウドなど、さまざまな環境で実行できます。
Q: Kubernetesは無料ですか?
A: Kubernetesは、オープンソースのプラットフォームであり、無料で利用できます。ただし、クラウドプロバイダーが提供するマネージドKubernetesサービスを利用する場合は、料金が発生する場合があります。
Q: Kubernetesの学習にはどのくらいの時間がかかりますか?
A: Kubernetesの学習にかかる時間は、あなたの経験や目標によって異なります。基本的な概念を理解し、簡単なアプリケーションをデプロイするだけであれば、数日から数週間で十分です。しかし、Kubernetesのすべての機能を理解し、複雑なアプリケーションを運用できるようになるには、数ヶ月から数年かかる場合があります。
この記事が、Kubernetesの学習を始めるあなたにとって、少しでも役立つことを願っています。