Linode LKEとAkamai EdgeDNSとGTMを利用してマルチリージョン構成を組む 

# Linode LKEとAkamai GTMを利用してマルチリージョン構成を組む

Linode Kubernetes Engine (LKE)とAkamai GTM/Edge DNSを使った負荷分散構成をTerraformを利用して構築する手順を紹介します。

今回の構成例では、TokyoとSingapore、それぞれのRegionにLKEを展開し、下図のようにGTMにてDNSによる負荷分散を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/4aef0cad-6a2f-ec87-828b-d1caf61bdeee.png)


# Linode Kubernetes Engine (LKE)とは

Linode Kubernetes Engine (LKE) は コンテナ化されたアプリケーションやワークロードを展開・管理するための、フルマネージドのKubernetes(k8s)コンテナオーケストレーションエンジンです。

**特徴**
- LKEはコンソールから数クリックでプロビジョニング、管理できる。
- Rancher、Helm、オペレーターなど、人気のあるK8s関連ツールとの統合をサポートしている。
- コントロールプレーンは**無料**で利用することができ、オプションで冗長構成(HA)にもすることができる。
- LKEが動作するインスタンスやネットワーク転送料はハイパースケーラーと比べて断然安く、**低コスト**で構築することができる。

[**参考：LKE**](https://www.linode.com/ja/products/kubernetes/)

# Akamai Edge DNS とは

Edge DNS はAkamai が提供するスケーラブルな権威 DNS  サービスです。
DNSに対する最大規模の DDoS 攻撃から防御するための耐障害性を備え、 100% アップタイムのサービスレベル契約（SLA）が付属しているため、 Web サイトやアプリケーションサーバーなどの名前解決をいつでも安定して提供できるようになります。

**[参考：Akamai Edge DNS](https://www.akamai.com/ja/resources/product-brief/edge-dns-product-brief#:~:text=Akamai%20%E3%81%AE%20Edge%20DNS%20%E3%81%AF,%E6%80%A7%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)**


# Akamai Global Traffic Management (GTM) とは

Global Traffic Management (GTM) とはAkamaiが提供する DNS ベースでロードバランシングを提供するソリューションです。

以下の様々な振り分け機能を提供しています。

- Mirror Failover (サイトダウン時にバックアップへ)
- Map by geographic location etc. (地理的振り分け)
- Weighted Random Load Balancing etc. (比率指定で負荷分散)
- Performance-Based Load Balancing (応答時間が短くなるように負荷分散)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/35b9562e-bb6a-c357-1779-c512a0ffc111.png)

**[参考：Akamai GTM](https://www.akamai.com/site/ja/documents/product-brief/global-traffic-management-product-brief.pdf)**


# LKE Clusterの構築

本環境の構築にはこちらのレポジトリを利用して行っていきます。

https://github.com/isss802/lke-gtm-demo

レポジトリをダウンロードします。

```
git clone git@github.com:isss802/lke-gtm-demo.git
cd lke-gtm-demo/lke
```

LinodeのAPI Tokenを読み込ませます。
[Getting Started with the Linode API
](https://www.linode.com/docs/guides/getting-started-with-the-linode-api/)

```
export TF_VAR_token=
```

シンガポールリージョンと東京リージョンにLKEを構成するTerraformを実行します。

```
terraform apply
```

kubectlを利用するため、configをファイルに保存します。

```
export KUBE_VAR=`terraform output -raw kubeconfig_1` && echo $KUBE_VAR | base64 -d > ../kubectl/lke-cluster-config-1.yaml
export KUBE_VAR=`terraform output -raw kubeconfig_2` && echo $KUBE_VAR | base64 -d > ../kubectl/lke-cluster-config-2.yaml
```


# Edge DNSの構築とLet's Encryptで証明書の発行

Edge DNSの構築とNodeBalancerに利用するLet's Encryptの証明書の発行をTerraformで行います。
事前にクレデンシャル情報は登録しておきます。

https://qiita.com/kabe-akam/items/499507d19220b44b4901

Edge DNSのTerraformの構成ファイルがあるディレクトリに移動します。

```
cd ../edgedns
```

Terraformでは、Edge DNSに新しいゾーンを作成し、GTMに利用するDNSレコードを登録します。
また、Let's Encryptでワイルドカード証明書を発行、認証はDNSを利用します。

Variableに適切な値を入力します。

```
vim variables.tf
```

Terraformを実行します。

```
terraform apply
```

Let's Encryptで発行した証明書をファイルに保存します。

```
terraform output -raw full_cert > ../kubectl/cert.pem
terraform output -raw prikey > ../kubectl/key.pem
```

# Kubectlを利用して、コンテナとNodeBalancerを構築

NginxのデプロイとNodeBalancerの作成を行います。

Kubernetesの設定ファイルがあるディレクトリに移動します。

```
cd ../kubectl
```

kubectlを利用するため、configを設定します。

```
export KUBECONFIG=lke-cluster-config-1.yaml:lke-cluster-config-2.yaml
```

どちらのクラスターに接続しているか確認します。

```
kubectl config get-contexts
```

証明書をアップロードします。

```
kubectl create secret tls lb --cert cert.pem --key key.pem
```

Nginxをデプロイします。

```
kubectl create -f deployment.yaml
```

NodeBalancerの作成をします。

```
kubectl create -f service.yaml
```

GTMの設定に利用するLBのIPを確認します。

```
kubectl get service
```

もう一つのクラスターに接続し、同様の手順を実施します。

```
kubectl config get-contexts
kubectl config use-context [cluster2]
kubectl create secret tls lb --cert cert.pem --key key.pem
kubectl create -f deployment.yaml
kubectl create -f service.yaml
kubectl get service
```

# GTMの構築

GTMのTerraformの構成ファイルがあるディレクトリに移動します。

```
cd ../gtm
```

Variableに適切な値を入力します。

```
vim variables.tf
```

本構成では東京リージョンとシンガポールリージョンに1:1でDNSの振り分けを行います。
設定を確認し、Terraformを実行します。

```
terraform apply
```

# アクセスを確認

Edge DNSに登録したDNSレコードにて、ブラウザから接続確認を行い画面が表示されれば問題ありません。

[https://test.example.com](https://test.example.com)

# まとめ

AkamaiとLinodeの機能を組み合わせることによって、マルチリージョンでの冗長構成を構築することが可能となります。
また、Terraformを利用することにより構築の自動化も図ることができます。


# 関連記事

アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai