Amazon EKS 上に Istio / Prometheus / Grafana をデプロイ


前置き

この構成を今後使うかもしれないのでチュートリアルをやった
Kubernetes を触ったことが無かったため
まとめる意味も含め調べたことを一通り記す

Kubernetes

複数のコンテナを効率的に運用管理するためのオープンソースプラットフォーム

Production-Grade Container Orchestration - Kubernetes

Kubernetes を使う利点

コンテナ技術の利用

  • 開発環境の統一
  • 本番環境への適応
  • 単純構成
    • 高速
    • 軽量
    • コスト削減

コンテナの統合管理

  • 自動化
    • デプロイ
    • スケーリング
    • ヘルスチェック
    • 自己修復
    • 効率的なリソース使用
  • 稼働を維持しての変更
    • アップデート
    • 機能追加

Kubernetes の構成

Kubernertes の基本用語

用語自体は他にもあるが今回利用する範囲に留める

Cluster

  • Kubernetes のリソースをひとくくりにまとめたもの

Node

  • 物理マシン
    • AWS であれば EC2 インスタンス
  • Master Node と Node で区別がある
    • Master Node は Kubernetes を管理する
    • Node ではアプリケーションを動かす

Plane

  • Control Plane は Master Node が配置される
  • Data Plane には Node が配置される

Pod

  • コンテナの集合
  • デプロイする際の最小単位

ReplicaSet

  • 常に稼働している同一仕様の Pod の数
    • 冗長化

Deployment

  • デプロイ管理ができる
    • アップデート
    • ロールバック

Amazon EKS

AWS が提供している Kubernetes のマネージドサービス
主に Kubernetes における Master Node の部分を担ってくれる

Amazon EKS とは - AWS

EKS クラスターの作成

AWS の公式ドキュメントでも紹介されている eksctl というワンライナーで全て作成できるコマンドもあるらしいが
内部で何が起きているのかわからないため今回は通常の方法で作成する

環境

Windows 10

AWS CLI 1.16.191
AWS CLI のインストール - AWS

kubectl 1.14.8
kubectl のインストール - AWS

Helm 2.15.1
Installing Helm - Helm

Istio 1.3.4
Download the release - Istio

流れ

以下の手順で作成していく
1. ロール
2. VPC
3. EKS クラスター
4. ノード
5. EKS クラスターへのデプロイ

AWS マネジメントコンソール の開始方法 - AWS

構成図

ロール

サービスから EKS を入力しアクセスを許可するポリシーをあてたロールを作成

VPC

公式のサンプルを利用し CloudFormation で作成
https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-10-08/amazon-eks-vpc-sample.yaml

EKS クラスター

コンソールパネルからだとこの後の確認がうまくいかなかったためコマンドを使った

  • [cluster-name] は任意
  • [eks-role] は先ほど作成したロール
  • [subnet-ids] と [security-group-ids] は VPC の CloudFormation の出力を参照
  $ aws eks create-cluster --name [cluster-name] --role-arn [eks-role] --resources-vpc-config subnetIds=[subnet-ids],securityGroupIds=[security-group-ids]

  $ aws eks update-kubeconfig --name [cluster-name]

サービスに Kubernetes が出力されれば完了

  $ kubectl get svc

ノード

CloudFormation で EKS 最適化ノードを作成
以下を参考に NodeImageId と BootstrapArguments 以外のパラメータを埋める

Amazon EKS ワーカーノードを起動して設定する - AWS

公式の認証用設定マップを編集する
https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-10-08/aws-auth-cm.yaml
rolearn: の value をノード作成時に出力される [NodeInstanceRole] に変更して適用

  $ kubectl apply -f aws-auth-cm.yaml

Node が Ready になれば完了

  $ kubectl get nodes

Helm / Istio / Prometheus / Grafana

今回利用するソフトウェア及びツール

  • Helm
    Kubernetes のパッケージマネージャ
    クラスター内に tiller コンポーネントをデプロイすることで APIserver を介してコマンドでリソースの操作ができる

  • Istio
    マイクロサービスを構成するためのオープンソースソフトウェア
    条件や割合でのトラフィック制御やログ収集ができる

  • Prometheus
    メトリクスベースのモニタリングシステム

  • Grafana
    データ可視化ツール

EKS クラスターへのデプロイ

Helm tiller のデプロイ

  $ kubectl -n kube-system create serviceaccount tiller

  $ kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller

  $ helm init --service-account=tiller

Client / Server が出力されれば完了

  $ helm version

Istio のデプロイ

Prometheus と Granfana を含めた Istio をデプロイする
Istio を展開したディレクトリに移動し

  $ helm install --name istio-init install/kubernetes/helm/istio-init --namespace istio-system

  $ helm install --name istio install/kubernetes/helm/istio --namespace istio-system --set grafana.enabled=true --set grafana.persistentVolume.storageClass="gp2",server.persistentVolume.storageClass="gp2"

Istio の Pod が出力されれば完了

  $ kubectl get pods -n istio-system

BookInfo (サンプル用アプリ) のデプロイ

引用 Bookinfo Application

  $ kubectl create namespace bookinfo

  $ kubectl label namespace bookinfo istio-injection=enabled

  $ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo

  $ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo

BookInfo の Pod が出力されれば完了

  $ kubectl get pods -n bookinfo

デプロイ確認

  $ kubectl get svc -n istio-system

EXTERNAL-IP/productpage/ にアクセス



Prometheus / Grafana での確認

Prometheus

  $ kubectl port-forward deploy/prometheus -n istio-system 9090:9090

http://localhost:9090

Grafana

  $ kubectl port-forward deploy/grafana -n istio-system 3000:3000

http://localhost:3000

削除

EKS ではコマンドで AWS リソースが作成される
今回 Istio のデプロイ時にロードバランサが作成されているためクラスターを削除する前に消しておく

  $ kubectl get svc --all-namespaces

EXTERNAL-IP の値があるサービスを削除する

  $ kubectl delete svc istio-ingressgateway -n istio-system

コンソールパネルから順次削除
1. ノードスタック
2. クラスター
3. VPC スタック

まとめ

CloudoFormation 以外初めて触ったものだったので勝手がわからず失敗した時のリカバリが大変だった
特に Istio や Prometheus は資料が少なく時間がかかってしまった

Kubernetes 自体はコマンドで手軽かつ即座にリソース操作ができるため強力な技術だと再認識したが
実運用するにあたって Helm などの関連ツールも含め学習コストは高いように思う

設定ファイルの編集などはしておらず手順をまとめただけの記事となってしまったので
さらっと解説ができるくらいには理解を深めていきたい