###AWS Open Source Blog に投稿された「Managing Amazon EKS Clusters with Rancher」を参考に環境を構築してみます。
Managing Amazon EKS Clusters with Rancher
EKSクラスタの作成やIAMユーザへのロール設定などの項目も記載しました
####今回のゴール
- RancherでEKSクラスターを構築して、パブリックアクセス可能なアプリをデプロイしてみる
- GrafanaやInfluxDBなど他のオープンソースソフトウェアの組み合わせを使用して、リアルタイムの地理空間データを追跡するためのサンプルプロジェクトをデプロイします
#####前提条件
- Rancherサーバー用にグローバルIPアドレスでアクセス可能なホストVM、ラップトップ、またはサーバーが必要です
- 今回は AzureVM (West US 2) の CentOS 7 を使用しました
- dockerバージョンはNode Requirementsを参考にしてください
- Rancher Master用のVMに固定IPを採番し、Route53 パブリックZONEに登録したAレコードを使用しました
- TCP 22、80、および443でアクセス可能
- TCP:22の接続元IPは制限、TCP:80,443はPermit ANY AN
#####Amazon EKS の捜査権限を付与したAWSアカウントを作成します
- IAMでのAWSアカウント作成方法はこちらを参考にしてください
- 今回EKSを使用するために作成したIAMユーザに適用したPolicyの設定例です
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:*",
"iam:ListRoles",
"iam:CreateRole",
"iam:DeleteRole",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:GetRole",
"iam:PassRole",
"iam:CreateInstanceProfile",
"iam:AddRoleToInstanceProfile",
"iam:CreateServiceLinkedRole",
"iam:RemoveRoleFromInstanceProfile",
"iam:DeleteInstanceProfile",
"autoscaling:*",
"kms:RetireGrant",
"ec2:*",
"cloudformation:*"
],
"Resource": "*"
}
]
}
EKS クラスター VPC を作成する
- CloudFormation コンソールへアクセスします
- Oregonリージョンを選択します
- 「Create Stack」を選択します
- [Specify an Amazon S3 template URL (S3 テンプレート URL の指定)] を選択、s3からサンプルスタックのURLを設定して「NEXT」をクリック
-
https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2018-11-07/amazon-eks-vpc-sample.yaml
- 「Stack name」や「Worker Network Configuration」にワーカーノード用ネットワークのプリフィックスを設定し「NEXT」をクリック
- [オプション] ページで、スタックリソースへタグ付けして[NEXT]をクリック
- 次のページで設定内容を確認し「Create」を選択
- Rancher設定で使用するので、スタック作成が完了したら「Outputs」から [SecurityGroups] 、[VpcId]、[SubnetIds] を確認しておきます
Rancherサーバー用仮想マシンへSSHアクセスしてRancherコンテナを起動します
- Master用のVMにSSHアクセスして下記コマンドを実行します
docker run -d --restart=unless-stopped --name rancher --hostname rancher -p 80:80 -p 443:443 rancher/rancher:stable
- ブログでは:latest 指定しているのですが、今回はStable(v2.1.7 2019/03/31時点)を指定します
EKSクラスターを作成
- 前提条件の項で作成したAWS IAMユーザのAccess key ID と Secret access key を確認します
- Rancher にサインインし、「Clusters」画面で「Add Cluster」ボタンを選択します
- 下記内容を入力・選択します
- Cluster Name を入力
- EKS作成用に作成したIAMユーザの「Access Key ID」と「Secret Access Key」を入力
- 「Region」のプルダウンでEKS環境を作成するAWSリージョンを選択します
- 現在選択できるリージョンは「us-east-1」、「us-west-2」、「eu-west-1」
- 各種情報の選択・入力後「 Next: Select Service Role」を選択します
- 次の画面で「Standard Rancher generated service role」のチェックをいれて「Next: Select VPC & Subnet」を選択します
- 「Public IP for Worker Nodes:YES」、「VPC & Subnet」は「 Custom: Choose from your existing VPC and Subnets」で作成済みのEKS用 VPC を選択して「Next:Select subnets」に進みます
- 次の画面でsubnetを選択して「Next:Select Security Group」を選択します
- 次の画面で適応する Security Groupe を選択して「Next:Set Instance Options」を選択します
- 「Instance Type」はm5.large ,「Minimum ASG Size」は1「Maximum ASG Size」は3の初期値で設定して「Create」で環境を作成します
- コンソールにクラスタのステータスが「プロビジョニング」として表示されますので、10~15分ほど待ちましょう
- RancherはAWSバックエンドのCloudformationテンプレートを使用してインストールを開始します
- Cloudformationコンソールで環境構築の詳細なイベントをモニターできます
- EKSコンソールからもクラスターが作成されていることを確認できます
- クラスタのプロビジョニングが完了すると、Rancherコンソールのステータスが「Active:」に変わります。
- ワーカーノードとして m5.large のEC2 が3つ起動されています
- 次の画面で「Standard Rancher generated service role」のチェックをいれて「Next: Select VPC & Subnet」を選択します
EKSクラスターにnginxポッドを展開してみます
- 画面左上のプルダウンメニューから「Default」プロジェクトを選択します
- 表示された「workload」画面で「Deploy」を選択します
- ワークロードに名前を付けて、Docker Image に「nginx」を指定します
- 「Add Port」をクリックして、コンテナー・ポート「80」を公開設定します
- リスニング・ポートに「80」を指定し、プルダウンメニューからレイヤー4ロード・バランサーを指定します
- 上記設定でNginxnインスタンスへインターネットからアクセス可能になります
- ページ下部の「Launch」をクリックし、[ワークロード]タブと[ロードバランシング]タブのステータスが[アクティブ]になるまで確認して、ワークロードとロードバランサのプロビジョニングが完了するのを待ちます。
- ロードバランサがプロビジョニングを終了すると、クリック可能なリンクがワークロードの下に表示されます。 EKSクラスター用のDNSエントリーが作成され、伝播するのに数分かかることがあります
- リンクをクリックした後に404エラーが表示される場合は、Elastic Load Balancer DNSレコードが更新されるまでさらに数分待ってからやり直してください
- 「80 / tcp」のリンクをクリックすると、デフォルトのnginxページに移動します
- ACMからELBを確認してると Type:Classic で作成されていました
- 表示された「workload」画面で「Deploy」を選択します
nginxポッドを Scale up してみます
NYC Citi Bikeのリアルタイムデータを追跡するためのサンプルプロジェクトのデプロイしてみます
-
3つのポッドを準備してニューヨークのシティバイクの利用者をリアルタイムで追跡するためのRancherプロジェクトを展開します
-
Data ingestion pod:このポッドには、Citi Bikeによって公開されたリアルタイムデータをjson形式で定期的にクエリし、それをAPI経由でInfluxDBデータベースに保存するためのスクリプトが含まれています。
-
Time-series DB pod with InfluxDB: このポッドには、Citi Bikeサイトからリアルタイムで細流化するデータを処理するためにInfluxDBがインストールされています。InfluxDBは、クエリと検索の時系列に最適化された人気のあるオープンソースデータベースです。さらに、ポッドには、AWS EBS gp2ストレージクラスを使用して履歴データをアーカイブするために必要な永続的なボリュームを提供するローカルマウントポイントもあります。
-
Grafana pod:このポッドは、収集されたデータを視覚化するためのGrafanaが稼働しています
-
プロジェクトのためにKubernetes名前空間を作ります。左上隅にあるドロップダウンメニューから[Default Namespace]を選択し、[Namespaces]をクリックします
-
シェルウィンドウで「kubectl get nodes -o wide」と入力してワーカーノードのステータスが「準備完了」になっているか確認します
-
下記のコマンドを発行してプロジェクトを起動します
- curl 'https://raw.githubusercontent.com/aws-samples/managing-eks-clusters-with-rancher/master/run' | bash -
スクリプトをエディタなどで確認すると、必要な手順がコメントとして記載されています
-
スクリプトの実行が完了するまで数分待ちましょう
> curl 'https://raw.githubusercontent.com/aws-samples/managing-eks-clusters-with-rancher/master/run' | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1600 100 1600 0 0 7881 0 --:--:-- --:--:-- --:--:-- 7881
persistentvolumeclaim "influxdbvolclaim" created
deployment.apps "deploy-influxdb" created
Waiting for influxdb container to become available KERNEL-VERSION CONTAINER-RUNTIME
Waiting for influxdb container to become available x 2 4.14.62-70.117.amzn2.x86_64 docker://17.6.2
Waiting for influxdb container to become available x 2 4.14.62-70.117.amzn2.x86_64 docker://17.6.2
Waiting for influxdb container to become available x 2 4.14.62-70.117.amzn2.x86_64 docker://17.6.2
Waiting for influxdb container to become available
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1058 100 1058 0 0 6870 0 --:--:-- --:--:-- --:--:-- 6870
persistentvolumeclaim "citivolclaim" created
deployment.apps "deploy-citibike" created
service "grafana-svc" created
deployment.apps "deploy-grafana" created
Done !!
>
- 「Done !!] の表示を確認したら[Close]でシェル画面を閉じます
- 「Default Project]に3つのポッドがプロビジョニングされます
- ロードバランサーのDNSレコードが更新される[80/tcp]のリンクをクリックするとGrafanaにアクセス可能になります
- Grafanaのログインページで、ユーザー名「admin」、パスワード「admin」を入力してログインします
- データを視覚化するダッシュボードを設定する準備が完了しました
データソースを構成してみます
- 左側のペインで歯車のアイコンを選択し、「Data Sources」をクリックします
- 「Add data source」をクリックします
- データソースの名前(例えばcitibike)を入力し、タイプとしてinfluxDBを選択、データベース名として 'coordinates'を入力します
- URLフィールドには influxDBポッド のプライベートIPアドレスを確認し、http:// :8086 と入力して[Save & Test]をクリックします
- Rancherのデフォルトのネームスペースページに移動し、deploy-influxdbポッドをクリックすると、influxdbのプライベートIPアドレスを確認できます
ダッシュボードテンプレートをインポートします
-
下記URLのダッシュボードテンプレートjsonファイルをダウンロードしてデスクトップに保存します
-
[+] マークをクリックして[Import]を選択します
-
ウィンドウの右側にあるUpload json Fileをクリックして、デスクトップにダウンロードしたテンプレートを選択します
-
ニューヨーク中のすべてのシティバイクステーションのリアルタイムの状況を追跡し始めることができるようになりました
-
すべてのステーションの現在の使用可能自転車も色分けされたアイコンで地図上で表示されます
-
自転車ステーションのIDを選択すると折れ線グラフで需要の傾向を確認することができます
-
都市計画担当者はこの情報を使用して、日々の交通機関のニーズを自転車に頼っているニューヨーカーのために、自転車ステーションの収容能力を拡大/縮小を計画することができます
より大きいストレージ容量のが必要となった際に対応するためのAWS EBSとの統合
- 上記のプロジェクトコマンドを起動すると、EBS for InfluxDBのストレージタイプgg2と取り込みポッドを使用して2つの永続ボリューム(各50GB)が作成されます
- これらの永続ボリュームとその永続ボリュームの要求(PVC)を確認するには、デフォルトのネームスペースに移動して上部の[Volume]タブを選択します
- [Workloads]タブをクリックしてウィンドウの右端にある[deploy-citibike]コンテナのドロップダウンメニューをクリックし、[Execute Shell]をクリックしてインジェストポッドの内部を確認します
- 表示されたシェルプロンプトで ‘mount | grep citibike’ を実行します
- ボリュームデバイス/ dev / xvdxxがext4ファイルシステムを使って/ citibikeにマウントされていることを確認できます
- 「ls / citibike」を実行するとすべてのjsonファイルがアーカイブされている状態を確認できます
[root@deploy-citibike-5d4cb8967-mqwpx /]# mount | grep citibike
/dev/nvme1n1 on /citibike type ext4 (rw,relatime,data=ordered)
[root@deploy-citibike-5d4cb8967-mqwpx /]# ls -lh /citibike
total 33M
-rw-r--r-- 1 root root 3.6M Apr 14 04:47 1555217262.json
-rw-r--r-- 1 root root 3.6M Apr 14 04:59 1555217969.json
-rw-r--r-- 1 root root 3.6M Apr 14 05:11 1555218679.json
-rw-r--r-- 1 root root 3.6M Apr 14 05:23 1555219387.json
-rw-r--r-- 1 root root 3.6M Apr 14 05:34 1555220095.json
-rw-r--r-- 1 root root 3.6M Apr 14 05:46 1555220801.json
-rw-r--r-- 1 root root 3.6M Apr 14 05:58 1555221508.json
-rw-r--r-- 1 root root 3.6M Apr 14 06:10 1555222216.json
-rw-r--r-- 1 root root 3.6M Apr 14 06:22 1555222923.json
drwx------ 2 root root 16K Apr 14 04:36 lost+found
[root@deploy-citibike-5d4cb8967-mqwpx /]#
まとめ
- コンテナ化されているGrafanaやInfluxDBなどのオープンソースツールを使用して、ニューヨークのCiti Bikeのリアルタイム地理空間データを追跡するためのサンプルプロジェクトのデプロイをすることでRancherを使用したEKSクラスターの作成および管理をする方法を学びました
後片付けをします
- Rancher API用IAMユーザへ設定したロールが正しく設定されていれば、クラスターを削除することで検証環境をクリーンアップすることができます
- 念のため、AMCよりEC2やALB、Cloudformationスタックが削除されているか確認しましょう
- Rancherからの環境削除で CLB や EBS が残ってしまい、課金が継続していたことがありました。
- Rancherクラスターを削除する際にエラーが発生したらCloudformationの「Events」や「CloudTrail」ログをIAMユーザでフィルタ表示させるなどして、不足している権限を調査しましょう
参考文献
Managing Amazon EKS Clusters with Rancher
Amazon EKS ユーザーガイド Amazon EKS の使用開始
NYC Citi Bike