前置き
この構成を今後使うかもしれないのでチュートリアルをやった
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 の部分を担ってくれる
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
流れ
以下の手順で作成していく
構成図
ロール
サービスから 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 (サンプル用アプリ) のデプロイ

$ 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
Grafana
$ kubectl port-forward deploy/grafana -n istio-system 3000:3000
削除
EKS ではコマンドで AWS リソースが作成される
今回 Istio のデプロイ時にロードバランサが作成されているためクラスターを削除する前に消しておく
$ kubectl get svc --all-namespaces
EXTERNAL-IP の値があるサービスを削除する
$ kubectl delete svc istio-ingressgateway -n istio-system
コンソールパネルから順次削除
- ノードスタック
- クラスター
- VPC スタック
まとめ
CloudoFormation 以外初めて触ったものだったので勝手がわからず失敗した時のリカバリが大変だった
特に Istio や Prometheus は資料が少なく時間がかかってしまった
Kubernetes 自体はコマンドで手軽かつ即座にリソース操作ができるため強力な技術だと再認識したが
実運用するにあたって Helm などの関連ツールも含め学習コストは高いように思う
設定ファイルの編集などはしておらず手順をまとめただけの記事となってしまったので
さらっと解説ができるくらいには理解を深めていきたい