はじめに
- 前回の記事でAmazon EKSで使えるPersistentVolumeについて調べてみたので、今回は実践編の準備編。
- Amazon FSx for NetApp ONTAP(以下、FSx for ONTAP)をPersistentVolumeのバックエンドとして使ってみる。
環境準備(Amazon EKSクラスター以外)
- Amazon EKSクラスター以外のリソースはCloudFormationでサクっと作成した。
- テンプレートはこちら。個人的に検証等で使うAWS環境のCloudFormationテンプレートを整備しはじめており、その一部として作ったものである。
- 個人の検証用ということで、認証情報を直接パラメーターで渡したりといったセキュリティ的にアンチパターンな部分もあるので転用は自己責任でお願いしたい。
- CloudFormationスタックのデプロイを流してから全てのリソースがデプロイ完了するまで36分かかった。FSx for ONTAP以外は2分以内に作成が完了するが、FSx for ONTAPが長い。
- これでVPCやサブネットなどのネットワーク周りとFSx for ONTAPの作成は完了。
環境準備(Amazon EKSクラスター)
- 個人的な検証にはなるべくお金をかけたくない。ということで、コストを抑えるためにSpot by NetAppを使ってAmazon EKSクラスターをデプロイする。
- Spot by NetAppのサービスの1つ「Ocean」は、Amazon EKSクラスターで利用するAmazon EC2インスタンスの運用とコストを最適化してくれるサービス。
- Worker Node用のAmazon EC2インスタンスにスポットインスタンスを利用し、スポットインスタンスの中断を検知すると自動的にインスタンスを起動し直したり、Worker Nodeのスケーリングなどを自動でやってくれる。
- これにより、Amazon EKSのインフラを気にすることなくサーバーレス感覚で激安に使うことができる。Amazon EC2インスタンス20台までは無料で使えるので使わない手はない。
- ということで、以下の通り作成いていく。
Spot by NetAppアカウント作成
- Spot by NetAppアカウントが無い場合、こちらの動画に従ってSpot by NetAppのアカウントを作成し、AWSアカウントと紐づけを行う。
Amazon EKSクラスターデプロイ
- 上記が完了すると、Spotコンソール画面左のメニューから「Ocean」→「Cloud Clusters」を開き、「Create Cluster」ボタンをクリック。
- 今回は新規作成なので「EKS - Create an EKS Cluster」を選択。
- ウィザードに従って以下の手順を実施。
STEP1:
- 「Generate Token」をクリックし、Token作成へ。
- 「Token Name」に適当な名前を入力し、「GENERATE」ボタンをクリック。
- Tokenが作られたことを確認し、「DONE」をクリック。
STEP2: Set the generated EKS Cluster parameters
STEP3: Provision the EKS and Ocean clusters
-「Use existing VPC & subnets」にチェックを入れ、「Launch CloudFormation Stack」をクリック。
- AWSマネジメントコンソールのCloudFormationスタック作成画面が開くので、必要情報を入力/選択し、「AWS CloudFormationによってIAMリソースがカスタム名で作成される場合があることを承認します」にチェックを入れ、「スタックの作成」ボタンをクリック。
- スタックの作成が完了するまで待つ。
- スタックの「出力」タブに表示されている「NodeInstanceRole」の値をメモっておく。
STEP4: Configure Worker Nodes Managed by Ocean To Join The EKS Cluster
-
AWS CLIとkubectlをインストール済みの端末から以下のコマンド/スクリプトをコピー&ペーストで実行。今回は冒頭のCloudFormationで作ったEC2インスタンスを使用。
- 実行結果はこんな感じ。
$ aws eks update-kubeconfig --name st-eks-test-cluster Added new context arn:aws:eks:ap-northeast-1:xxxxxxxxxxxx:cluster/st-eks-test-cluster to /home/ec2-user/.kube/config
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 172.20.0.1 <none> 443/TCP 9m12s
$ #!/usr/bin/env bash $ curl -fsSL http://spotinst-public.s3.amazonaws.com/integrations/kubernetes/cluster-controller/scripts/init.sh | \ > SPOTINST_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ > SPOTINST_ACCOUNT=act-xxxxxxcf \ > SPOTINST_CLUSTER_IDENTIFIER=st-eks-test-cluster \ > bash 2022-04-06T01:17:14.435Z downloading 2022-04-06T01:17:15.518Z rendering 2022-04-06T01:17:15.533Z applying secret/spotinst-kubernetes-cluster-controller created configmap/spotinst-kubernetes-cluster-controller-config created serviceaccount/spotinst-kubernetes-cluster-controller created clusterrole.rbac.authorization.k8s.io/spotinst-kubernetes-cluster-controller created clusterrolebinding.rbac.authorization.k8s.io/spotinst-kubernetes-cluster-controller created deployment.apps/spotinst-kubernetes-cluster-controller created
STEP5: Update AWS Authentication Config-Map
- 先程の端末で以下コマンドをコピー&ペーストして、ConfigMapをダウンロード。
$ curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/aws-auth-cm.yaml % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 282 100 282 0 0 644 0 --:--:-- --:--:-- --:--:-- 645
- ダウンロードしたConfigMapを編集。
rolearn
の値を、STEP3の最後でメモっていた「NodeInstanceRole」の値に書き換え。$ vi aws-auth-cm.yaml
apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> <---ココを「NodeInstanceRole」の値に書き換え username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
- 以下コマンドをコピー&ペーストして、ConfigMapを作成。
$ kubectl apply -f aws-auth-cm.yaml configmap/aws-auth created
- 「Done」ボタンをクリック。
- Ocean Clusterが作成されたことを確認。
確認
- NodeやPodがデプロイされていることを確認。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-10-0-1-21.ap-northeast-1.compute.internal NotReady <none> 31s v1.21.5-eks-bc4871b
$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system aws-node-t4cnr 1/1 Running 0 11m kube-system coredns-76f4967988-22s7v 1/1 Running 0 21m kube-system coredns-76f4967988-7q6x9 1/1 Running 0 21m kube-system kube-proxy-x4l2w 1/1 Running 0 11m kube-system spotinst-kubernetes-cluster-controller-586cb8c588-mcdn7 1/1 Running 0 12m
- Spotコンソールから見るとこんな感じ。68.88%もコスト削減できているらしい。
- これでAmazon EKSクラスタとFSx for ONTAPはできた。実践編の準備編が完了。
- こんな感じの環境が出来上がった。
次回予告
- タイトルに反して、ほとんどSpot Oceanの設定手順紹介になってしまった。
- 次回は実践編の本編。PersistentVolumeを作ってみるところまでやってみたい。