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

前の記事はこちら！　[ApsaraDB for MongoDBを使ってみる【AlibabaCloud 接続編】](https://qiita.com/maipippi/items/df62822fa10becde2145)

### ACKについて詳しく

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

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

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

引用：[ACK クラスターの概要](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/ack-cluster-overview?spm=a2c63.p38356.0.0.7db93b8bXJgo0t%3E)

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

[ACK ProとACK Basicの詳しい比較](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/overview-of-ack-pro-clusters#section-5p6-3wi-bal)

![https://storage.googleapis.com/zenn-user-upload/ea624ece212c-20240320.png](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](https://storage.googleapis.com/zenn-user-upload/86c6a94caeb4-20240407.png)

引用：[ターウェイとフランネルを比較する](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/work-with-terway#section-wiw-s2f-tiw%3E)

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

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

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

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

> 共有 ENI モードでは、複数のポッドが同じ ENI を共有します。ただし、各ポッドには個別の IP アドレスが割り当てられます。このモードでは、ノード上のポッド デプロイメントの密度が向上し、ENI の需要が軽減されます
> 
> 
> ![https://storage.googleapis.com/zenn-user-upload/3deba7604847-20240407.png](https://storage.googleapis.com/zenn-user-upload/3deba7604847-20240407.png)
> 

> 排他的 ENI モードでは、各ポッドに個別の ENI および IP アドレスが割り当てられます。各ポッドにはネットワーク インターフェイスがあります。ポッドのネットワーク パフォーマンスは、従来の仮想マシンに近いです。このモードは、高スループットかつ低遅延のネットワークなどの高性能ネットワークに適しています。
> 
> 
> ![https://storage.googleapis.com/zenn-user-upload/79107786fef5-20240407.png](https://storage.googleapis.com/zenn-user-upload/79107786fef5-20240407.png)
> 

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

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

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

> Terway IPVLAN モードは、IPVLAN および Extended Berkeley Packet Filter (eBPF) テクノロジーに基づいて、ポッドとサービスに高性能ネットワークを提供します。
> 
- ミドルウェアとマイクロサービス
- ゲームおよびライブストリーミングアプリケーション
- ハイパフォーマンスコンピューティング

で使えるみたい。

ちなみに、TerwayとFrannelそれぞれのCIDR ブロックの設計について詳しく載ってるのが[ここ](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/kubernetes-cluster-network-planning#concept-izq-sg4-vdb)。

![https://storage.googleapis.com/zenn-user-upload/5ad26bf77b02-20240517.png](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/439c55e00ce3-20240517.png)

![https://storage.googleapis.com/zenn-user-upload/3a45e24ff396-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/574cb5757315-20240517.png)

![https://storage.googleapis.com/zenn-user-upload/d477b910eef7-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/51f8ddafd9ae-20240517.png)

![https://storage.googleapis.com/zenn-user-upload/4ea8b9de8f96-20240517.png](https://storage.googleapis.com/zenn-user-upload/4ea8b9de8f96-20240517.png)

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

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

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

![](https://storage.googleapis.com/zenn-user-upload/53299efea5fe-20240718.png)


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

![](https://storage.googleapis.com/zenn-user-upload/4edebf378525-20240718.png)


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

![https://storage.googleapis.com/zenn-user-upload/059bb840fa2e-20240510.png](https://storage.googleapis.com/zenn-user-upload/059bb840fa2e-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/01495daf51cf-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/0b5fe3ac4480-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/ee7482c84044-20240510.png](https://storage.googleapis.com/zenn-user-upload/ee7482c84044-20240510.png)

できた！

![https://storage.googleapis.com/zenn-user-upload/72d3ec2f027e-20240513.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/d4fe4c6373f8-20240513.png)

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

![https://storage.googleapis.com/zenn-user-upload/e716a7dfa625-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/943557e498be-20240513.png)

![https://storage.googleapis.com/zenn-user-upload/144e8298ebeb-20240513.png](https://storage.googleapis.com/zenn-user-upload/144e8298ebeb-20240513.png)

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

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

![https://storage.googleapis.com/zenn-user-upload/224a499e8b20-20240513.png](https://storage.googleapis.com/zenn-user-upload/224a499e8b20-20240513.png)

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

![https://storage.googleapis.com/zenn-user-upload/c38169c473fa-20240513.png](https://storage.googleapis.com/zenn-user-upload/c38169c473fa-20240513.png)

できた〜。

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

![https://storage.googleapis.com/zenn-user-upload/f308b2bb4679-20240513.png](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/95b751a20593-20240513.png)

![https://storage.googleapis.com/zenn-user-upload/6462c2a2121d-20240513.png](https://storage.googleapis.com/zenn-user-upload/6462c2a2121d-20240513.png)

サービスをつくる。

![https://storage.googleapis.com/zenn-user-upload/f00042c414d1-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](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/service-overview#section-qr2-2yu-zk9)

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

![](https://storage.googleapis.com/zenn-user-upload/8ab41bac0dfe-20240718.png)


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

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

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

![https://storage.googleapis.com/zenn-user-upload/ae0decec5d09-20240513.png](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](https://storage.googleapis.com/zenn-user-upload/822487c9b1cf-20240513.png)

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

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

![https://storage.googleapis.com/zenn-user-upload/c7dcd01af8ab-20240515.png](https://storage.googleapis.com/zenn-user-upload/c7dcd01af8ab-20240515.png)

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

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

![https://storage.googleapis.com/zenn-user-upload/8a93a77d0e8c-20240515.png](https://storage.googleapis.com/zenn-user-upload/8a93a77d0e8c-20240515.png)

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

![https://storage.googleapis.com/zenn-user-upload/c27ae2745bfb-20240515.png](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](https://storage.googleapis.com/zenn-user-upload/ae1ca74555d6-20240514.png)

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

![https://storage.googleapis.com/zenn-user-upload/48a4bfa53b35-20240514.png](https://storage.googleapis.com/zenn-user-upload/48a4bfa53b35-20240514.png)

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

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

つづきはこちら！　[ACKとApsaraDB for MongoDBをTerraformでデプロイしてみる](https://qiita.com/maipippi/items/2ac08aab8d1450a5b14b)