ACK(Alibaba Cloud Container Service for Kubernetes)を使って、Alibaba Cloudでk8sを動かしてみる

## はじめに
みなさん、Kubernetes使っていますか？
AWSであればEKS、Google CloudであればGKEと、マネージドなk8s環境の運用管理サービスがありますよね。

今回はAlibaba Cloudのマネージドなk8s実行環境提供サービスであるACK(Alibaba Cloud Container Service for Kubernetes)を使って、Alibaba Cloud上のk8s実行基盤にアプリケーションをデプロイしてみます。

ベースは[公式のGetting Started](https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/getting-started-with-ack-using-the-ack-console)です。日本語ドキュメントよりも英語のほうが充実していたため、英語のドキュメントをベースに進めていきましょう。

## 最終的な成果物
k8sクラスター上にルービックキューブ的なゲームをデプロイするハンズオンのようですね。
こういう遊び心があるハンズオンはいいですね！
![2022-12-06_22-54-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/51a682bc-edea-d52e-34cf-74c3d689d89c.png)

## ACKの有効化

まずは下記のリンクからACKコンソールを開きます。
https://cs.console.aliyun.com/?spm=5176.12818093.0.dcsk.6c9c12d20DzcmP#/k8s/cluster/list
※ はじめてACKコンソールを開く場合は、ACKの有効化が必要になります。
- Container Service for Kubernetes Terms of Service にチェックをいれる
- 画面右下のActivate Now をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/c7cac0d7-e83d-306c-bc89-a28fad3f7cdc.png)

Activateに成功したら以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/9a6d439a-039c-c468-32fc-cb6245ba24a6.png)
Activateには1 ~ 5分ほどかかるようなので、少し待ってConsoleに戻りましょう。
ACK Consoleをはじめて開く場合には、Default Roleの作成を促されるので、指示に従い[Cloud Resource Access Authorization](https://ram.console.aliyun.com/?spm=a2c63.p38356.0.0.5851473ePoNIMS#/role/authorize?request=%7B%22ReturnUrl%22:%22https:%2F%2Fcs.console.aliyun.com%2F%22,%22Service%22:%22CS%22,%22Requests%22:%7B%22request1%22:%7B%22RoleName%22:%22AliyunCSManagedLogRole%22,%22TemplateId%22:%22AliyunCSManagedLogRole%22%7D,%22request2%22:%7B%22RoleName%22:%22AliyunCSManagedCmsRole%22,%22TemplateId%22:%22AliyunCSManagedCmsRole%22%7D,%22request3%22:%7B%22RoleName%22:%22AliyunCSManagedCsiRole%22,%22TemplateId%22:%22AliyunCSManagedCsiRole%22%7D,%22request4%22:%7B%22RoleName%22:%22AliyunCSManagedVKRole%22,%22TemplateId%22:%22AliyunCSManagedVKRole%22%7D,%22request5%22:%7B%22RoleName%22:%22AliyunCSClusterRole%22,%22TemplateId%22:%22Cluster%22%7D,%22request6%22:%7B%22RoleName%22:%22AliyunCSServerlessKubernetesRole%22,%22TemplateId%22:%22ServerlessKubernetes%22%7D,%22request7%22:%7B%22RoleName%22:%22AliyunCSKubernetesAuditRole%22,%22TemplateId%22:%22KubernetesAudit%22%7D,%22request8%22:%7B%22RoleName%22:%22AliyunCSManagedNetworkRole%22,%22TemplateId%22:%22AliyunCSManagedNetworkRole%22%7D,%22request9%22:%7B%22RoleName%22:%22AliyunCSDefaultRole%22,%22TemplateId%22:%22Default%22%7D,%22request10%22:%7B%22RoleName%22:%22AliyunCSManagedKubernetesRole%22,%22TemplateId%22:%22ManagedKubernetes%22%7D,%22request11%22:%7B%22RoleName%22:%22AliyunCSManagedArmsRole%22,%22TemplateId%22:%22AliyunCSManagedArmsRole%22%7D%7D%7D)からACK用のロールを作成しましょう。
AWSのIAMロールなどと同じように、有効化しない限りは該当のリソースを作成したり、操作したりすることができない仕様になっています。面倒かもしれませんが、逆にセキュリティが高いということの証明ですね。

## クラスターの作成
ACKコンソール画面の左にある Clusters を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/96477c02-3e90-ac9d-a50a-2f9304289969.png)

画面右上の Create Kubernetes Cluster をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/e4941bc8-2c43-117d-62c4-982461f571e2.png)

### パラメータの設定
Managed Kubernates タブにて、作成するクラスタのパラメータを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/b1c08e7b-b05f-dd96-90f2-2ccdbb8964be.png)

|設定項目|値|
|----|----|
|Cluster Specification|Professional|
|Cluster Name|ACK-Demo|
|Region|Japan(Tokyo)|

### VPCの作成
すでに作成済みのVPCを利用してもよいですが、ここでは Create VPC をクリックして、新規にVPCを作成していきます。

VPC作成画面では以下の通り設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/ea1ec3da-e134-0bee-a1b8-85a4e1055cdf.png)

vSwitchの作成も行います。vSwtichはAWSでいうサブネットグループですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/fb801c81-7c4a-349c-5a1b-76d6f2c5912c.png)

設定ができたら OK をクリックしてVPCを作成します。
ACK Clusterの設定画面に戻り、先ほど作成したVPCを選択します。
vSwitchにもチェックをいれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/8bd711ee-b14c-0574-f887-79899a41d0cf.png)

Access to API Server欄についても Expose API Server with EIP をチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/9f3ff43a-b80a-1e06-0631-4808d0890412.png)

## Node Poolの設定
ノードプールは、クラスタの中で「同じ構成をもったワーカーノード」のグループです。
まずはインスタンスタイプですね。ドキュメントによると、クラスタの安定性を高めるために、少なくとも
`4vCPU` `8GiBのメモリ` のインスタンスタイプを選択することが推奨されているようです。

Filterで上記の条件を設定し、表示された Enhanced Compute Type c6e を選択します。
Selected Types欄に選択したインスタンスタイプが表示されたらOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/6af9d596-87b8-68f1-0623-180c867e5e2d.png)

起動するワーカーノードの台数を Quantity で設定します。
ワーカーノードを1台で起動することも可能ですが、その場合このワーカーノードが単一障害点となってしまいます。片方のワーカーノードに障害が発生したとしても、問題なくシステムが動作するように最低2台を起動しておきましょう。

System Diskについては、確保したサイズ分料金が増えてしまうので、今回は40GiBとしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/239404b8-5689-45f9-a970-0959e30437a2.png)

最後に Logon Type を選択します。
今回はパスワードでのログインを選択しています。
![2022-12-10_09-37-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/fdee5bc1-ca4a-c8de-23d3-54e9faf0a126.png)

設定が完了したら、画面下部にある`Next:Component Configurations`をクリックします。
ちなみに、この時点で左側に時間当たりのコストが表示されています。親切な設計ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/60f3c649-061f-1b03-6a68-6684e004abae.png)

### Component Configurationsの設定
Component Configurationsページでは、以下の通り`Use Default Alert Rule Template`のチェックを外します。有効化してもいいのですが、アラートルールの作成が求められるので、簡略化のため今回は無効化しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/dac2775e-99be-282e-4566-817b169aa204.png)

最後に画面下部の`Next:Confirm Order`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/9066ab7f-af56-ca31-2b5b-db2bfe2f49b1.png)

確認画面が出るので、`Terms of Service`にチェックを入れて、画面下部の`Create Cluster`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/7fd95b22-e339-9ded-a9c4-19b207d07c93.png)

クラスタの作成には10分程度かかるため、作成完了まで待ちましょう。
Clusterダッシュボードで`Cluster Status`が`Running`になっていたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/d660545c-9bae-1634-75d0-e79f9f75abba.png)

## アプリケーションの公開と作成
では、早速ACKクラスタ上にアプリケーションを公開していきましょう。
クラスタ名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/9f8c9c8c-5a30-5b1c-4dba-a591b701285d.png)

`Workloads`から`Deployment`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/bd3881a8-b30e-b15a-221e-c8966ddbd60f.png)

Create from image をクリックします。
ここでいうイメージは、ACK上で動作させるアプリケーションのコンテナイメージのことですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/8f9565ee-bb31-4f3f-8503-e663ea49e0ba.png)

Basic Informationページにて、Nameに`ack-cube`を設定します。
任意の名前なので、それ以外の名前でもOKです。
そして、右下の Next をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/af6e678c-7f29-9616-1498-483e9144d2ce.png)

コンテナのパラメータを設定します。
`Image Name`に、`registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube`を設定します。これはルービックキューブゲームのコンテナイメージが格納されているパスです。

`Image Version`は`1.0`とします。ちなみに、ここを指定しない場合は最新のバージョンが自動的に取得されます。

次に、動作するアプリケーションのリソース制限を行います。
現在、ACKクラスターの基盤として`Enhanced Compute Type c6e`インスタンスタイプが2台起動しており、コンテナはその上で動作します。
その際、それぞれのコンテナは基盤となるクラスターのリソースを利用しますが、ここで設定を行うことで、1つのコンテナが過剰にリソースを利用することを防ぐことができます。

`Resource Limit`は、アプリケーションのリソース制限です。
`CPU`は`1 Core`、`Memory`は`1024MiB`を選択します。

反対に、`Required`は、最低限確保するリソースの量です。リソース不足でアプリケーションが起動しないといった自体を避けることができます。
`CPU`は`0.5 Core`、`Memory`は`512MiB`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/46c9a302-843e-442b-28ee-18ba894491b6.png)

Portの設定も行います。`+`ボタンを押して追加を行い、
`Name`は`ack-cube`、`Container Port`は`80`とします。
設定ができたら、画面右上の`Next`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/dae3042c-dc1d-f272-e2d9-b85b2f25dabd.png)

Advancedな設定ページで Services の隣の `Create` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/fc9b4288-01c4-8a47-8931-820f7e1efbc2.png)

この Service は、k8sの主要なリソースの1つです。コンテナ（Pod）にアクセスするための、ロードバランサーやDNSサーバーのような役割を担うリソースです。

`Type` で `Server Load Balancer` - `Public Access` - `Create SLB Instance` を選択します。
`Modify`をクリックすることで、SLB Instanceのタイプを変更することができます。今回はデフォルトの`slb.s1.small`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/724a7959-6cb9-78e8-9c20-d5820140ba91.png)

`Port Mapping`では、以下のように設定します。
|設定項目|値|
|----|----|
|Name|ack-cube-svc|
|Service Port|80|
|Container Port|80|

設定ができたら、右下の`Create`をクリックして、Serviceの設定ウインドウを閉じます。
最後に、画面右下の`Create`をクリックして、アプリケーションの作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/65021bee-7302-dcde-f034-e60cd472fedd.png)

以下のような画面が表示されたら、アプリケーションの作成が正常に完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/a1a720d0-668d-8588-12bb-31cbd826e1d4.png)


## アクセスしてみる
ACK-Demo クラスタ画面で、左から Network -> Services をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/27c9e583-3a45-976f-8730-a1a8bea47226.png)

サービスの一覧が表示されるので、アプリケーションに紐づいた`ack-cube-svc`のレコードを探し、`External Endpoint`欄のIPアドレスをクリックします（画像は黒塗りにしています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/6ae1e1a3-d127-1f37-7368-b5a95f243b18.png)

ACKクラスター上で稼働している、ルービックキューブアプリケーションにインターネット経由でアクセスができました！やった！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/64d9bfb6-dc63-9a6a-9deb-896ca5ee65fd.png)

## アプリケーションのモニタリング
ここからは、ACK上で稼働するアプリケーションのモニタリング機能の確認です。
ACK-Demo クラスタの画面左から、Operations -> Prometheus Monitoringを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/21899c8a-4f45-795b-94f0-470267ce139f.png)

Prometheus（プロメテウス）はOSSのモニタリングツールです。
Prometheus Monitoringページが開いたら、Application Monitoring -> Deployment Detailsタブをクリックします。
`namespace`を`default`に、`deployment`を`ack-cube`に設定します。
この設定を行うことで、先ほど作成したルービックキューブアプリケーションに絞って、メモリ使用量やCPU使用率の監視を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/c88c7729-fbfe-a17c-43ac-332c1179bad8.png)

## さいごに
今回は、公式のGetting Startedをベースに、Alibaba Cloud上でACKを利用したk8sクラスターの作成、アプリケーションのデプロイ、モニタリングまでを行いました。
UIが非常に洗練されていて、個人的にはGoogle CloudのGKEや、AWSのEKSよりも直感的に操作することができたと感じます。