この記事では、最新のApple Silicon(M1, M2, M3チップ)を搭載したMacやMacBookを使用して、Kubernetesの基本を学び、手を動かしながら実際に体験する方法をステップバイステップでご紹介します。もちろん、LinuxやWindowsでも実施可能です。
Kubernetesとは何か?
Kubernetesは、コンテナ化されたアプリケーションのデプロイメント、スケーリング、管理を自動化するオープンソースのシステムです。Googleによって開発され、Cloud Native Computing Foundation (CNCF) に寄贈されました。複数のホスト上でコンテナを効率的に運用することを可能にし、大規模なアプリケーションの運用を容易にします。
なぜKubernetesが必要なのか?
近年、アプリケーション開発とデプロイメントのプロセスは、マイクロサービスアーキテクチャやコンテナ技術の採用によって大きく変化しました。これらの技術は、アプリケーションを小さく独立した部分に分割して開発し、各部分をコンテナとしてパッケージ化することで、アプリケーションの柔軟性、拡張性、ポータビリティを向上させます。しかし、これら多数のコンテナを効率的に運用し、スケールするには、自動化された管理システムが必要になります。ここでKubernetesが登場します。
Kubernetesとコンテナオーケストレーション
Kubernetesはコンテナオーケストレーションの一形態で、コンテナのライフサイクルを管理します。コンテナオーケストレーションとは、複数のコンテナをまとめて管理する技術です。アプリケーションのデプロイ、スケーリング、更新、可用性保証などを自動化し、これらのプロセスを簡単かつ効率的に行うことができます。Kubernetesを使用することで、エンジニアとオペレーションチームはコンテナの運用にかかる手間を大幅に削減し、より速く信頼性の高いアプリケーションの提供を実現できます。
Kubernetesがコンテナ管理を革新している方法
-
自動スケーリング
アプリケーションの負荷に基づいて、コンテナの数を自動的に増減させることができます。
-
自己修復能力
障害が発生したコンテナを自動的に再起動し、定義された状態を維持します。
-
ロードバランシング
複数のコンテナインスタンスへのトラフィックを自動的に分散します。
-
サービスディスカバリー
コンテナ間での通信を容易にし、各サービスを簡単に検出できるようにします。
-
環境一貫性の保証
開発、テスト、本番環境間での環境差異を最小限に抑えます。
Kubernetesは、コンテナ化されたアプリケーションの運用を簡素化し、効率化する強力なツールです。初めてKubernetesに触れる方でも、ハンズオンを通じて基本的な操作を学び、Kubernetesの提供する多様な機能と利点を実感することができます。苦手意識を持たず、まずは触ってみてください。
Kubernetesの基本コンセプト
Kubernetes(略してK8s)は、いくつかのコンピューターを使ってアプリを動かすためのツールです。このツールは、アプリを「コンテナ」と呼ばれる小さなパーツに分けて、それらを上手に管理・運用する手助けをしてくれます。
主なパーツって何?
引用元: クラスターのアーキテクチャ
-
ポッド (Pods)
ポッドはアプリの最小の部品で、1つまたは複数のコンテナを含んでいます。これらはチームのメンバーのように協力して動きます。一つの目的のために、それぞれが異なる役割を担いながらも、一緒に仕事を進める感じです。
-
サービス (Services)
サービスは、ポッドに簡単にアクセスできるようにするための「住所」みたいなものです。ポッドがどこにあるか心配する必要がなくなります。
-
デプロイメント (Deployments)
デプロイメントは、アプリを更新したり、必要な数だけアプリを動かしたりするときに役立ちます。例えるなら、スマートフォンのアプリ更新機能のように、新しいバージョンをスムーズに導入して、常に最適な状態を保ちます。また、アプリのコピーを増やしたり減らしたりして、使用状況に合わせて調整することができます。
-
レプリカセット (ReplicaSets)
レプリカセットは、アプリのコピーが常に指定した数だけ動いていることを保証します。「バックアップ」のように、一つがダウンしても大丈夫なようにします。
Kubernetesはどうやって動くの?
Kubernetesには、「マスターノード」と「ワーカーノード」という2種類のコンピューターがあります。
-
マスターノード
このコンピューターは、指揮を取る役割を持ちます。何をどこで動かすかを決めたり、クラスター全体を見守ったりします。
-
ワーカーノード
こちらのコンピューターは、実際にアプリを動かす場所です。マスターノードの指示に従って、アプリのポッドを動かしたり管理したりします。
Kubernetesが便利な理由
Kubernetesを使うと、アプリを簡単にスケールアップやスケールダウンできます。また、アプリの更新が簡単になり、万が一エラーがあっても自動で修正してくれるため、安心して運用できます。さらに、コンピューターが複数あっても、まるで1つの大きなコンピューターのように扱えるため、管理が楽になります。
Kubernetesを使うと、エンジニアとしてアプリのコードに集中でき、インフラの面倒な部分はKubernetesがうまくやってくれます。これが、Kubernetesが世界中で人気の理由です。
ハンズオン Minikubeを使ってKubernetesを体験
ローカルでKubernetesを動かすことができるMinikubeを使って、簡単なアプリをデプロイするハンズオンを実施します。KubernetesでNginx Webサーバーをデプロイし、サービスを公開してアクセスする基本的な操作について実践的な理解を深めることができます。
事前準備 必要なツール
- Minikube
- kubectl(Kubernetesのコマンドラインツール)
- Macのインストールコマンド
brew install kubectl
- Macのインストールコマンド
- Docker(オプションで、ローカルのコンテナランタイムとして使用)
- Docker Desktopは、Docker公式サイトからダウンロードしてインストールできます。
- 起動することを忘れないようにしてください。
Linuxユーザー向けのkubectl
インストール方法
Linuxでkubectl
をインストールする一般的な方法は、以下のコマンドを使用することです。
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/kubectl
kubectl version --client
詳細なインストール手順については、Kubernetesの公式ドキュメントを参照してください。 Install and Set Up kubectl on Linux.
Windowsユーザー向けのkubectl
インストール方法
Windowsにkubectl
をインストールするには、以下のPowerShellコマンドを使用する方法があります。
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/windows/amd64/kubectl.exe"
Move-Item .\kubectl.exe C:\some-directory-in-your-PATH\kubectl.exe
C:\some-directory-in-your-PATH\kubectl.exe
の部分は、kubectl.exe
を移動させたいPATH内のディレクトリに適宜変更してください。そして、そのディレクトリがシステムのPATH環境変数に含まれていることを確認してください。
詳細なインストール手順については、Kubernetesの公式ドキュメントを参照してください。 Install and Set Up kubectl on Windows.
ステップバイステップガイド
1. Minikubeのインストール
Macbook(Intel/M1/M2/M3)の場合、Homebrewを使用してインストールできます。
brew install minikube
WindowsやLinuxを使用しているときは、公式のMinikubeページからインストールガイドに従って、Minikubeをインストールします。
https://minikube.sigs.k8s.io/docs/start/
2. Minikubeクラスタの起動
ターミナルで以下のコマンドを実行して、Minikubeクラスタを起動します。
# デフォルトのvirtualboxでは動かないため、dockerを使用します。
minikube start --driver=docker
3. kubectlの設定
Minikubeは自動的にkubectlの設定を行います。以下のコマンドでクラスタの状態を確認できます。
kubectl get nodes
# 出力内容
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 66s v1.28.3
4.Nginxのデプロイメント
Nginx Webサーバーをデプロイします。
kubectl create deployment nginx --image=nginx
# 結果
deployment.apps/nginx created
5. アプリケーションへのアクセスを設定
デプロイしたNginxに外部からアクセスできるように、Serviceを作成します。
kubectl expose deployment nginx --type=NodePort --port=80
# 結果
service/nginx exposed
6. アプリケーションへアクセス
MinikubeのServiceを通じて、デプロイしたNginxにアクセスします。
minikube service nginx
|-----------|-------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------|-------------|---------------------------|
| default | nginx | 80 | http://192.168.49.2:31545 |
|-----------|-------|-------------|---------------------------|
nginx サービス用のトンネルを起動しています。
|-----------|-------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------|-------------|------------------------|
| default | nginx | | http://127.0.0.1:65192 |
|-----------|-------|-------------|------------------------|
デフォルトブラウザーで default/nginx サービスを開いています...
Docker ドライバーを darwin 上で使用しているため、実行するにはターミナルを開く必要があります。
このコマンドは自動的にブラウザを開き、Nginxのウェブページにリダイレクトします。この画面のまま動かなくなるので、Ctrl+Cを押すと、再度マンドを入力できるようになります。
ハンズオン2 アプリケーションのスケーリング
ポッド数を増やす
デプロイメント名がnginx
で、ポッド数を3に増やしたい場合、以下のコマンドを使用します。
kubectl scale deployment/nginx --replicas=3
# ポッド数を確認すると、次のように表示されます。
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-7854ff8877-6zspg 1/1 Running 0 5s
nginx-7854ff8877-hcwfr 1/1 Running 0 5s
nginx-7854ff8877-rmf57 1/1 Running 0 80m
このコマンドはnginx
デプロイメントのポッド数を3にスケーリングします。
ポッド数を減らす
同じデプロイメントのポッド数を1に減らすには、以下のコマンドを使用します。
kubectl scale deployment/nginx --replicas=1
# ポッド数を確認すると、次のように表示されます。
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-7854ff8877-rmf57 1/1 Running 0 81m
ハンズオン3 アップデートとロールバック
アプリケーションのアップデート
デプロイメントnginx
で使用されるコンテナイメージを新しいバージョンにアップデートするには、以下のコマンドを使用します。
kubectl set image deployment/nginx nginx=nginx:1.19.0
この例では、nginx
デプロイメント内のnginx
コンテナのイメージをnginx:1.19.0
に更新しています。
アップデートのロールバック
アップデート後に問題が発生した場合、最後の変更をロールバックして元の状態に戻すには、以下のコマンドを使用します。
kubectl rollout undo deployment/nginx
このコマンドは、nginx
デプロイメントに対する最後のアップデートを元に戻します。
ハンズオン4 環境のクリーンアップ
クリーンアップは、ハンズオンを終えた後にKubernetesクラスター内のリソースを整理し、不要なリソースを削除する重要なステップです。これにより、クラスターをクリーンな状態に保ち、リソースの無駄遣いを防ぐことができます。
クリーンアップ手順
以下のコマンドを使用して、デプロイメントとそれに関連するサービスを削除します。
デプロイメントの削除
デプロイメントを削除するには、以下のコマンドを使用します。例としてnginx
デプロイメントを削除する場合のコマンドを示します。
kubectl delete deployment nginx
このコマンドは、nginx
という名前のデプロイメントと、それによって管理されていたポッドをクラスターから削除します。
サービスの削除
サービスを削除するには、以下のコマンドを使用します。例としてnginx
サービスを削除する場合のコマンドを示します。
kubectl delete service nginx
# サービスを確認すると、次のように表示されます。
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 96m
このコマンドは、nginx
という名前のサービスをクラスターから削除します。サービスを削除すると、そのサービスを通じて行われていた外部からのアクセスが不可能になります。
Minikubeクラスタの停止
ハンズオンが完了し、Minikubeクラスタが不要になった場合は、クラスタを停止することができます。これにより、クラスタの実行に使用されていたリソースが解放されます。
minikube stop
# 次のように表示されれば、正常に停止しています。
「minikube」ノードを停止しています...
SSH 経由で「minikube」の電源をオフにしています...
1 台のノードが停止しました。
このコマンドはMinikubeクラスタの実行を停止します。後で再度クラスタを使用したい場合は、minikube start
コマンドで再開できます。
まとめ
このハンズオンでは、Kubernetesの基本を学び、実際にMinikubeを使用してローカルKubernetesクラスターをセットアップしました。Nginxのデプロイメントの作成から、アプリケーションへのアクセス設定、スケーリング、アップデート、そしてクリーンアップまでの一連のプロセスを通じて、Kubernetesでのアプリケーション管理の基本的な流れを体験しました。この記事を通じて、K8sはそんなに難しくない、むしろ楽しいと思っていただければ幸いです。
参考情報
https://kubernetes.io/docs/home/
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。