Kubernetes on Spot Instances: Optimize for scale and cost
今まで受けてきたKubernetes系のWorkshopはカテゴリがContainerでしたが、今回はComputeです。最終日はセッション1つだけなので、Workshopとしては最後になります。どうやらEKSでも使用しているWorkshopをベースにして作成されたようです。運営は主にcomputeのスタッフさんが多かったですが、コンテナのエキスパートさんもいらっしゃって自分はその方に質問しました。
資料はこちら
午前にあったWorkshopとかぶる部分がちょいちょいあってその部分は割愛しています。午前のWorkshopはこちらの記事から。
Workshopの流れ
今までで一番親切なWorkshopの進行でした。後半になると内容の説明をしなくなってしまうスピーカーの方が多いのですが、このセッションはめっちゃ詳しく説明してくれて、例えばtaintsとtolerationとかも午前に比べて優しい説明(+優しい語彙)ですごくわかりやすかったです。
最初にスピーカーの方が、本番でKubernetes使っている方をお聞きしていましたが、かなりの人数いらっしゃいました。Advancedのセッションだとやはり経験者が多いですね。スポットインスタンスを合わせて使っている人というものだと自分含めて数人くらいまで減ったので、スポットインスタンス使えているのは結構少ないのではとも感じました。
導入
EKS系のworkshopではお決まりのEKSクラスター構築から入りました。ちなみに作成するのは全てオンデマンドインスタンスです。
そしてクラスターが出来上がるまでの時間で、EKSのアーキテクチャについての説明が入りました。しっかりこういった図を見るのが初めてだったので、このタイミングで気づいたのですが、Control Planeの前段にはNLBがあるそうな。ENI AttachmentもControl Planeからやっているんだ…どうやって実装しているのなど疑問におもいました。
kube-ops-viewの導入
自分は存じ上げていなかったのですが、kube-ops-viewというKubernetesクラスターのnode/podを可視化するツールがあります。こちらはHelmを使って導入していきます。実際に入れてみると、エンドポイントが出来ます。エンドポイントにアクセスしてみると下記のように見えます。なかなか良さげです。CPUとメモリも一緒に見れるのがいいですね。ドット絵っぽい感じもいいです。
スポットインスタンスの導入
スポットインスタンスの復習から入りました。なんとなく理解していたことではありますが、下記のページは知らなかったので驚きました。Terminationの頻度が出ているの便利ですね。
eksctlを使ってスポットインスタンス(もしくはMixed-Instances)のNodeGroupを作成するには、eksctlのコマンドオプションだけでは難しいので、ClusterConfig
を作成する必要がある。labelとtaintsを同時に作成しているけど、これは午前のWorkshopと同じなので言及は割愛。
apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eksworkshop-eksctl region: $AWS_REGION nodeGroups: - name: dev-4vcpu-16gb-spot minSize: 0 maxSize: 5 desiredCapacity: 1 instancesDistribution: instanceTypes: ["m5.xlarge", "m5d.xlarge", "m4.xlarge","t3.xlarge","t3a.xlarge","m5a.xlarge","t2.xlarge"] onDemandBaseCapacity: 0 onDemandPercentageAboveBaseCapacity: 0 spotInstancePools: 4 labels: lifecycle: Ec2Spot intent: apps taints: spotInstance: "true:PreferNoSchedule" tags: k8s.io/cluster-autoscaler/node-template/label/lifecycle: Ec2Spot k8s.io/cluster-autoscaler/node-template/label/intent: apps k8s.io/cluster-autoscaler/node-template/taint/spotInstance: "true:PreferNoSchedule" iam: withAddonPolicies: autoScaler: true cloudWatch: true albIngress: true
ちなみにスポットとオンデマンドを混ぜるときには、結構工夫が必要。labelやtaintsをそれぞれで分けなくてはいけないから。CloudFormation側でコントロールする場合には、UserDataの中で下記のように スポットインスタンスかどうかを判断してあげて、Bootstrap.shにわたすコマンドオプションを分ける必要がある。
ilc=`aws ec2 describe-instances --instance-ids $iid --query 'Reservations[0].Instances[0].InstanceLifecycle' --output text` if [ "$ilc" == "spot" ]; then /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArgumentsForSpotFleet} else /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArgumentsForOnDemand} fi
午前にあったのと同じくスポットインスタンス削除のhandlerを入れるのですが、午前中に提示されたOSSと違ったので、少し戸惑いました。せっかくなので、聞いてみたのですが、どうやら午前中に提示されたものを使用するべきみたいです。どうやらコードのベースは同じみたいなのですが…。
ちなみに今回提示されたものは自分が現在使っているものでこちら(今後は保守されない…?)
今後はこっち使ったほうがいいよと言われたのがこちら
その後
サンプルアプリケーションのデプロイとHPAとCAの導入を行いました。
感想
すごく丁寧なWorkshopでした。スタッフの方もかなり親切に声をかけてくれました。最後にスポットインスタンスのステッカーをいただけたのですが、非常に可愛いステッカーで気に入っています。