こんにちは、サイオステクノロジーの前田です。
Kubernetesの構築ですが、最終目標はKubernetesを構築することではなく、Kubernetesを構築しアプリケーションをデプロイし提供することでしょう。超初心者入門4回目はEKS構築の後編として、EKSのワーカノードの構築とサンプルアプリケーションのデプロイ、デプロイしたアプリケーションの正常性確認について話していきます。初めてのKubernetes構築は大変だと思いますが、頑張っていきましょう。
- Kubernetes 超初心者入門
目的と目標
- 目的
- Kubernetesでアプリケーションをデプロイし公開、Kubernetesアプリケーションの構成を俯瞰できるようになる。
- 目標
- ワーカーノードの作成
- アプリケーションのデプロイ
- アプリケーションをグローバルネットワークからアクセス
- 作成されたAWSのリソースを確認
今回でEKSを構築してサンプルアプリケーションのデプロイが完了します。アプリケーションをデプロイしても詳しく理解してないこともたくさんあると思いますが、構いません。クラスター側とアプリケーション側の差異がわかるようになるだけで十分です。
インフラエンジニアの方は、サーバとアプリケーションで利用した状況が、Kubernetesクラスタのノードとコンテナと設定ファイルで分かれている状況を理解していただれば幸いです。
インフラエンジニア以外の方は、いろいろ(クラスターとノード(サーバ)、アプリケーション)設定することがあるのだなと全体像が把握していただければ幸いです。
EKSのワーカーノードなど
今回はEKSクラスターがマネージドするワーカーノード(EC2)を構築していきます。ほかにもセルフマネージドのワーカーノードやFargatetという完全なマネージドノードがあります。
EKSのワーカーノードの種類
EKSのワーカーノードは3種類あります。詳細は下記リンクからご覧ください。
管理が必要な度合いとしては、下記のようになります。
(管理作業が少ない) AWS Fargate > マネージド型ノードグループ >> セルフマネージド型ノード (管理作業が多い)
マネージド型ノードグループを最初期に選択して、管理運用業務を下げたい場合は AWS Fargateを利用する。全部管理したい場合や詳細なチューニングがしたいという場合はセルフマネージド型ノードを利用という選択をするのがおすすめです。
外部アクセスについて
外部アクセス可能にするにはKubernetesクラスタに設定を行う必要があります。主に2つありserviceリソースもしくはingressリソースで設定する方法です。規模が小さな場合はserviceで利用する場合が多く、規模が大きい場合はingressのほうが利用が多いというイメージをしてください。EKSのserviceリソースで外部アクセス可能な種類のserviceを作成するとLBが作成されます。
Kubernetesの利用を進めると外部との連携が増えてきます。最終的にはクラスターにinfraノードという(永続ストレージ、LBや、コンテナレジストリ)を構築する場合もあります。予算等で構成を変えることができるのがKubernetesの長所であり難しさでもあります。
作業概要
- IAMロールの作成
- EKS側でEC2を操作をするためのロールを作成します。
- ワーカーノードの作成
- ノードプールを設定してワーカーノードの起動状態を設定します。
- アプリケーションのデプロイ
- アプリケーションのデプロイと簡易な正常性確認を行います。
- サービスの設定
- Kubernetesのserviceというリソースを設定して、自動的ロードバランサーが連動して作成され外部からアクセスを可能な状態にします。
作業詳細
■IAMロールの作成
- IAM管理ページ
- IAM管理ページにアクセスします。
- ロール を選択します。
- ロールを作成 を選択します。
- ワーカーノード用のロール作成
- 信頼されたエンティティを選択 画面
- ユースケースで EC2 を選択します。
- 次へ を選択します。
- 許可を追加 画面
- 許可ポリシーで AmazonEC2ContainerRegistryReadOnly を検索し追加します。
- 許可ポリシーで AmazonEKSWorkerNodePolicy を検索し追加します。
- 許可ポリシーで AmazonEKS_CNI_Policy を検索し追加します。
- 次へ を選択します。
- 名前、確認、および作成 画面
- ロール名に testeksnoderole と(任意で)記載します。
- ロールを作成 を選択します。
- 信頼されたエンティティを選択 画面
- ロールが作成されるのを確認します。
■ワーカーノードの作成
- ノードグループ追加初期設定
- ノードグループ詳細設定
- 構築確認
- 構築まで待機(EC2を構築してKubernetesの設定をしているのでしばらくかかります)
- 構築完了が出ることを確認します。
ワーカーノードの作成という目標達成です。やったー
■アプリケーションのデプロイ
サンプルアプリケーションをデプロイしていきます。主にコマンドライン操作になります。クラスターに接続できる環境で操作してください。
- ノードの状態確認
- ネームスペースを作成
- namespaceを作成します。
kubectl create namespace testnamespace
- 作成されたnamespaceの確認します。
kubectl get namespace
- testnamespaceの存在を確認します。
- namespaceを作成します。
- アプリケーションのデプロイ
- アプリケーションをデプロイします。
-
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml -n testnamespace
-
- アプリケーションのデプロイが完了されるのを待ちます。
-
kubectl get all -n testnamespace
================================================================NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-66b6c48dd5-c8dt8 1/1 Running 0 14s
pod/nginx-deployment-66b6c48dd5-cw2l7 1/1 Running 0 14s
pod/nginx-deployment-66b6c48dd5-mm57h 1/1 Running 0 14s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 15s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-66b6c48dd5 3 3 3 16s
================================================================= - 上記のようにpodのSTATUSがRunningであることを確認します。
-
- サービスを作成します。
kubectl expose deployment nginx-deployment --name=nginx-service -n testnamespace
- サービスの作成確認をします。
- kubectl get svc -n testnamespace
- ngnix-service という名前のserviceを確認します。
- kubectl get svc -n testnamespace
- アプリケーションをデプロイします。
- 正常性確認(http応答)
- ポートフォワード設定(バックグラウンド実行)します。
kubectl port-forward service/nginx-service 8080:80 -n testnamespace &
- アクセス確認を実施します。
curl localhost:8080 -s | grep title
- 結果として下記表示を確認します。
- <title>Welcome to nginx!</title>
- nginxの画面が表示されていることを確認します。
- ポートフォワードの終了します。
- disown %1
- バックグラウンドで実行されていたポートフォワードが終了します。
- disown %1
- ポートフォワード設定(バックグラウンド実行)します。
アプリケーションの作成という目標達成です。GOOD
■サービスの設定
外部アクセスを可能にするサービスの設定を行います。
- kubernetesのサービスの設定
- 正常性確認
アプリケーションに外部アクセスという目標達成です。最高かよ
■作成されたリソースの確認
作成されたリソースを軽く確認をします。
- EC2
- ワーカーノードのみがEC2で作成されています。自作でクラスターを作成した場合はマスターノード側も作成が必要ですが、AWSのEKSの場合はマスター側はマネージドでAWS側が管理しているため表示されません。
- VPC
- KubernetesのコンテナのネットワークとクラスターのネットワークはCIDRが違います。そのため自作でクラスターを構築する場合にはIPのレンジとネットワークに気を付けなければいけません。
- Loadbalancer
loadbalacerはservice(ロードバランサーの種類)がある場合に作成されます。
■削除
- ネームスペースの削除
- kubectl delete namespace testnamespace
- ノードプール削除
- ワーカーノードを作成するEKSクラスターにアクセスします。
- コンピューティング を選択します。
- 削除したいノードグループを選択します。
- 削除を選択します。
- ノードグループ名を入力します。
- 削除を選択します。
- ノードが削除されるまでしばらく待ちます。
- クラスターの削除
- 全てのノードグループが削除されていることを確認してクラスターを削除を選択します。
- クラスター名を入力します。
- 削除 を選択します。
最後に
EKSを操作してアプリケーションをデプロイしてきました。Kubernetesのメリットを受けるのはここから先になります。
なぜなら、ここから先は開発者はネームスペース以下を考慮、運用者はクラスターについての考慮という風に作業分担が可能だからです。さらに、毎回クラスター構築&詳細なサーバ設定が必要なくなります。
一番大変な初期作業の認識を終えることができました。クラスターを構築できたことを誇ってください。今回は管理画面を利用した構築なので、設定等を変えて構築したりしてみてください。そうすればさらにKubernetesクラスターについて理解が深まります。
本記事がKubernets初心者の悩みを解決する一つになれば幸いです。