🤟

ACKをApsaraDB for MongoDBとともに使ってみる

2024/07/18に公開

前の記事はこちら! ApsaraDB for MongoDBを使ってみる【AlibabaCloud 接続編】

ACKについて詳しく

ACKはAlibabaのマネージドKubernetesプラットフォームだが、

  • ACK クラスター
  • ACK サーバーレス クラスター
  • ACK エッジ クラスター
    の3種類ある。

ACK クラスターは最も一般的に使用されており、ほとんどのシナリオに適しています。
ACK サーバーレス クラスターは、迅速なスケーリングと個々のタスクまたは複数の並列タスクの処理を必要とするアジャイル ワークロードの処理に適しています。
ACK エッジ クラスターは、モノのインターネット (IoT) やコンテンツ配信ネットワーク (CDN) などのエッジ コンピューティング サービスを処理するのに最適です。

引用:ACK クラスターの概要

ACK クラスターには種類があり、ACK Pro(本番稼働用)、ACK Basic(個人テスト環境用)、ACK dedicated(手動管理用)から選べるみたい。

ACK ProとACK Basicの詳しい比較

https://storage.googleapis.com/zenn-user-upload/ea624ece212c-20240320.png

GKEやAWSとの違いで気になるのがネットワークで、

  • Terway
  • Frannel
    の2種類から選べる。

違いは以下。

https://storage.googleapis.com/zenn-user-upload/86c6a94caeb4-20240407.png

引用:ターウェイとフランネルを比較する

ネットワーク ポリシーと帯域幅管理を備えた高性能ネットワーク ソリューションを提供したい場合、または IP アドレスの無駄を避けたい場合は、Terway を使用することをお勧めします。ネットワーク ポリシーやきめ細かいアクセス制御を使用せずにコンテナー ネットワークを体験したい場合は、Flannel を使用することをお勧めします。

だそうで、基本的にTerwayを選んでおけばよさそう。
NATの有無、IPアドレスの有効活用、ノードごとにCIDRを割り当てるか、LBがNodePortを経由するかどうか らへんが大きな違いっぽい。

TerwayはENIのモードが2種類あって、

  • 共有ENI
  • 排他的 ENI
    にわけられる。

共有 ENI モードでは、複数のポッドが同じ ENI を共有します。ただし、各ポッドには個別の IP アドレスが割り当てられます。このモードでは、ノード上のポッド デプロイメントの密度が向上し、ENI の需要が軽減されます

https://storage.googleapis.com/zenn-user-upload/3deba7604847-20240407.png

排他的 ENI モードでは、各ポッドに個別の ENI および IP アドレスが割り当てられます。各ポッドにはネットワーク インターフェイスがあります。ポッドのネットワーク パフォーマンスは、従来の仮想マシンに近いです。このモードは、高スループットかつ低遅延のネットワークなどの高性能ネットワークに適しています。

https://storage.googleapis.com/zenn-user-upload/79107786fef5-20240407.png

排他的ENIモードのがネットワークパフォーマンスが高いけど、1ノードがサポートできるpodの数が共有ENIモードよりも少ないので、ケースによって使い分ける感じ。
普通のシステムなら共有ENIモードでよさそう。

共有ENIモードだとトランクENIを選ぶことができる。
ポッドごとに静的IPアドレス、個別のvSwitch、および個別のセキュリティグループを指定できるみたい。
痒い所に手が届く感じ。

Terway IPVLAN モードというものがあって、

Terway IPVLAN モードは、IPVLAN および Extended Berkeley Packet Filter (eBPF) テクノロジーに基づいて、ポッドとサービスに高性能ネットワークを提供します。

  • ミドルウェアとマイクロサービス
  • ゲームおよびライブストリーミングアプリケーション
  • ハイパフォーマンスコンピューティング

で使えるみたい。

ちなみに、TerwayとFrannelそれぞれのCIDR ブロックの設計について詳しく載ってるのがここ

https://storage.googleapis.com/zenn-user-upload/5ad26bf77b02-20240517.png

https://storage.googleapis.com/zenn-user-upload/439c55e00ce3-20240517.png

https://storage.googleapis.com/zenn-user-upload/3a45e24ff396-20240517.png

https://storage.googleapis.com/zenn-user-upload/574cb5757315-20240517.png

https://storage.googleapis.com/zenn-user-upload/d477b910eef7-20240517.png

可視化してくれてたりしてめっちゃわかりやすい!!!まじすごい!
ネットワークゆるふわ理解勢としてはありがたい。

https://storage.googleapis.com/zenn-user-upload/51f8ddafd9ae-20240517.png

https://storage.googleapis.com/zenn-user-upload/4ea8b9de8f96-20240517.png

vpcとvswitchの設計例もあるのでなるほどね〜〜となれる。
これを参考にしていけばええんや!

こうみると、
今回はzoneは1個でいいかなって感じなので、vswitchとpod vswitchは1個ずつの1セットでいいかもだ。
それでいこう〜。

とりあえずコンソールからACKクラスタをつくってみる

vpc,vSwitch,pod vSwitchは先ほどApsaraDB for MongoDBで作ったものを流用する。

権限付与とキーペア生成を行う。

https://storage.googleapis.com/zenn-user-upload/059bb840fa2e-20240510.png

https://storage.googleapis.com/zenn-user-upload/01495daf51cf-20240510.png

アドオンたくさんある!

ここらへんの権限まわりを全て付与して作成!
ちなみにSLSの有効化が出てきたけど、リンクとんでも有効化するとこに飛ばなかったので自分でログサービスに飛んで有効化した

https://storage.googleapis.com/zenn-user-upload/0b5fe3ac4480-20240510.png

https://storage.googleapis.com/zenn-user-upload/ee7482c84044-20240510.png

できた!

https://storage.googleapis.com/zenn-user-upload/72d3ec2f027e-20240513.png

先ほど作ったAPIをpodデプロイして、疎通させてみる。

ContainerRegistryにイメージを登録する

まずはDockerイメージをレジストリに登録する。

https://storage.googleapis.com/zenn-user-upload/d4fe4c6373f8-20240513.png

インスタンスの種類が二つある。

https://storage.googleapis.com/zenn-user-upload/e716a7dfa625-20240513.png

ここに出てくれるの見やすくて良い!

とりあえず個人のにして、Dockerのパスワードリセットをしてリポジトリ作成する。

https://storage.googleapis.com/zenn-user-upload/943557e498be-20240513.png

https://storage.googleapis.com/zenn-user-upload/144e8298ebeb-20240513.png

名前空間をつくるとき、雑にtestにしようとしたら占有されとるとな。
つまり他の人とかぶっちゃだめってことかな?

コードリポジトリもgitlabとかから選べたけど今回はローカルで作成。

https://storage.googleapis.com/zenn-user-upload/224a499e8b20-20240513.png

できた〜。
ここに画面にある手順どおりimage pushをする。

https://storage.googleapis.com/zenn-user-upload/c38169c473fa-20240513.png

できた〜。

ACKのクラスタからこのプライベートリポジトリにアクセスするためのsecretを作成しておく。

https://storage.googleapis.com/zenn-user-upload/f308b2bb4679-20240513.png

ACKのデプロイメントを作成する

https://storage.googleapis.com/zenn-user-upload/95b751a20593-20240513.png

https://storage.googleapis.com/zenn-user-upload/6462c2a2121d-20240513.png

サービスをつくる。

https://storage.googleapis.com/zenn-user-upload/f00042c414d1-20240513.png

今回はSLBにするのだけど、External Traffic Policyってなんぞや?

https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/service-overview#section-qr2-2yu-zk9

クラスターが Terway-Eniip ネットワーク プラグインを使用している場合、どの外部トラフィック ポリシーが使用されているかに関係なく、トラフィックはバックエンド ポッドに直接転送されます。

localとclusterの差は、ノードごとにSLB インスタンスの IP アドレスにアクセスできるかどうか区別するってことか。

とりあえずlocalにしておく。

つくっておいたsecretを選択していざ作成〜〜〜。

https://storage.googleapis.com/zenn-user-upload/ae0decec5d09-20240513.png

podもいけた!
ちなみにPCがM1 Macなので、docker buildの際にplatformを指定する必要があった(ノードプールのOSがAlibaba Cloud Linuxのため)。
コマンドは以下。
docker build -t test --platform linux/x86_64 .

https://storage.googleapis.com/zenn-user-upload/822487c9b1cf-20240513.png

ちゃんと起動してますね!

ingressつけ忘れてたので追加で作る。

https://storage.googleapis.com/zenn-user-upload/c7dcd01af8ab-20240515.png

作ったingressのエンドポイントに繋ぎに行ってみたらコンテナのなかでapsara Mongoに繋ぎに行くところで失敗してた。

そういえばインターネット接続じゃなくイントラネット接続にしなきゃじゃん!てことで直す。

https://storage.googleapis.com/zenn-user-upload/8a93a77d0e8c-20240515.png

アドレスを変更して、ホワイトリストにVPCのIPを登録していざ再挑戦。

https://storage.googleapis.com/zenn-user-upload/c27ae2745bfb-20240515.png

いけた〜♡♡♡

ほんとはingressに証明書つけてDNS登録してIPじゃなくURLで接続したかったけど、GCPみたく自前無償証明書発行できなさそうだったので今回はここまでにしておく。
alibabaでもできたらいいなあ〜。AWSでも自前無償証明書はだれでも作れるわけじゃなさそうだし、Azureも対応なさそうだし、そこはGCPが一歩リードかも。

今度は今まで作ったACKのあれこれをTerraformで再現してみる!

クラスターEIPの設定

Terraformの前にkubectlしたいからクラスターにEIPを設定しておく。

https://storage.googleapis.com/zenn-user-upload/ae1ca74555d6-20240514.png

API サーバーインターネットエンドポイント のEIP関連付けをクリック。

https://storage.googleapis.com/zenn-user-upload/48a4bfa53b35-20240514.png

EIP生成して選択するとクラスタ再起動になるので待つ。

あとは接続情報にあるkubeconfigを使ってkubectlする〜。

つづきはこちら! ACKとApsaraDB for MongoDBをTerraformでデプロイしてみる

Discussion