【Azure】Amazon EKS をジャンプスタートを使って Azure Arc に追加してみた

# はじめに
　こんにちは@tetotetoと申します。

　本記事は、クラウドサービスのAzureにおけるAzureArcを触っていきます。

  執筆に際して以下の記事を参考にしています。感謝です。
[Amazon EKS クラスターを Azure Arc に追加してみた](https://dev.classmethod.jp/articles/amazon-eks-cluster-azure-arc/)

# Azure Arc とは

オンプレミスやパブリッククラウド（GCPやAWSなど）とのハイブリッドクラウドを実現するサービスで
AzureArc上で管理されたKubernetes環境（EKS, GKEなど）へAzureの一部サービスをデプロイすることが可能です。

つまり別クラウドサービスやオンプレのリソース管理やOS定期更新などのコマンド実行など
統合管理できるのがメリットです。AWSでこの手のサービスがないので、Azureが差別化できるサービスでもあります。
ちなみに、GCPだと似たようなサービスでAnthosというものがあります

https://azure.microsoft.com/ja-jp/services/azure-arc/

簡単な操作方法、ハンズオンもここに載っています。気になる方は触ってみてください。
ただし、ブログとかではないので躓く可能性も高いです。

https://docs.microsoft.com/ja-jp/azure/azure-arc/


# Azure Arc とAWS EKSの連携

EKSとはAWSのKubernetesサービスになります

https://aws.amazon.com/jp/eks/

AWSのEKSで作ったクラスタをAzure Arcで管理します。
うまくいくとこんな感じになります。
![AzureArc接続_EKS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585341/12605093-4d9d-40ff-375a-4aa3e9640913.png)

正攻法でコンソールからポチポチ構築する場合は以下の記事が参考になると思います。
[Amazon EKS クラスターを Azure Arc に追加してみた](https://dev.classmethod.jp/articles/amazon-eks-cluster-azure-arc/)

#### 今回はAzureが提供しているジャンプスタートを使って構築してみます

# Azure Arc ジャンプスタートとは

Azure Arc Jumpstartプロジェクトは、「ゼロからヒーロー」のエクスペリエンスを提供するように設計されているため、AzureArcの操作をすぐに開始できます。

ジャンプスタートは、可能な限り多くの自動化、詳細なスクリーンショットとコードサンプル、およびAzure Arcプラットフォームの使用を開始する際の豊富で包括的なエクスペリエンスを組み込んだ、独立したAzureArcシナリオのステップバイステップガイドを提供します。

私たちの目標は、稼働中のAzure Arc環境をすぐにスピンアップして、インフラストラクチャがオンプレミスまたはクラウドのどこにあるかに関係なく、プラットフォームのコアバリューに集中できるようにすることです。
(以下英語ページをGoogle先生で翻訳したので若干読みずらいです)

https://azurearcjumpstart.io/overview/





ざっくりいうと、Terraformの資材を使って、EKSの構築から簡単にできるものになっています。
Terraformの概要は以下参照

https://www.lac.co.jp/lacwatch/service/20200903_002270.html

# 早速やってみる

以下の公式サイトに従って、作業開始
今回はAzureにVMサーバ(Ubuntu)を用意して、そこに環境を構築する流れとしています。

https://azurearcjumpstart.io/azure_arc_jumpstart/azure_arc_k8s/eks/eks_terraform/

### まず、事前準備から
公式サイトに従って、以下の準備を実施

ざっくり以下の作業を実施しました。
上記HPにリンクが貼ってあるのでそれに従うか、ググればインストール方法が出てきます。

Azureサービスプリンシパル（SP）を作成のところは、本来用意した方がいいものの
なぜかアカウントの都合かうまくいかず、az loginして実行しました。

> ・Azure ArcJumpstartリポジトリのクローンを作成(git clone https://github.com/microsoft/azure_arc.git)

> ・AWSCLIをインストールして設定

> ・wgetパッケージをインストール（eksモジュールに必要）

> ・AWS IAMAuthenticatorをインストール

> ・AzureCLIをインストールするかバージョン2.25.0以降に更新(Azureって推奨AMIにCLIはいってないんだな。。)

> ・無料のアマゾンウェブサービスのアカウントを作成します(実際には有償アカウントを使った)

> ・Helm3をインストール

> ・Terraformをインストール


### 続いて、以下のコマンド入力を実施して、下準備

##### AzureArc対応のKubernetesの2つのリソースプロバイダーでサブスクリプションを有効にします
登録は非同期プロセスであり、登録には約10分かかる場合があります

```
az provider register --namespace Microsoft.Kubernetes
az provider register --namespace Microsoft.KubernetesConfiguration
az provider register --namespace Microsoft.ExtendedLocation
```

##### Azure Arc for KubernetesCLI拡張接続k8sおよびk8sをインストールします

```
az extension add --name connectedk8s
az extension add --name k8s-configuration
```

##### AWSユーザーIAMキーを作成する
詳細は上記公式サイトに記載。払い出したあとVMサーバに**aws configureすると後で詰まらなくて済む(認証情報の登録)**
初めて実行する際は空になっているので、作成したIAMキーをもとに手打ちする

```
aws configure
AWS Access Key ID [****************73PJ]:
AWS Secret Access Key [****************IuRh]: 
Default region name [ap-northeast-1]: 
Default output format [json]: 
```
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html

##### AWSアクセスキーとAWSシークレットキーを表す環境変数であるAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを介してクレデンシャルを設定します。

後述するTerraformで使われる環境変数になります。以下の""を適宜変更して実行
ここで入力しなくてもTerraform実行時に聞かれるので、入れなくても動作するみたいです。
(リージョンは適宜変更のこと)

```
export TF_VAR_AWS_ACCESS_KEY_ID="an access key"
export TF_VAR_AWS_SECRET_ACCESS_KEY="a secret key"
export TF_VAR_AWS_DEFAULT_REGION="us-west-2"
```
### Terraformの実行
Terraformとは？という点はこの記事では記述しませんが、.tfファイルに構築したいEKSの設計パラメータを入れておくことで
コマンド実行でサーバやクラスタが立ち上がるものです。今回はデフォルトで入っているものを使いますが
適宜構築したいサーバスペックに変えたり、持っているTerraformのファイルに置き換えればよしなに動いてくれると思います。

##### EKSテラフォームバイナリがあるフォルダに移動します。
```
cd azure_arc/azure_arc_k8s_jumpstart/eks/terraform
#公式にはcd azure_arc_k8s_jumpstart/eks/terraformと記載
```

##### Terraformを初期化するコマンドを実行し、作業を追跡するための状態ファイルを作成し、その後実行
```
terraform init
terraform apply --auto-approve
```

この作業でAWS側にクラスタが構築されます。
上記でも記載しましたが、EKSの構成(サーバ台数や設定、リージョンやサーバの名前)を変えたい場合はTerraformのファイルをいじればいいです。

##### 各種設定を実施
公式に記載通りに実行

```
mkdir ~/.kube/
terraform output -raw kubeconfig > ~/.kube/config
```

```
terraform output -raw config_map_aws_auth > configmap.yml
kubectl apply -f configmap.yml
```

```
kubectl get nodes -o wide
```
詳細割愛しますが、これでEKSのNodeの用意が完了です。
AWSのコンソールでNodeが立ち上がっていることを確認しました。

###AzureArcに接続する

最後の作業になります。
実行中のEKSクラスターができたので、次の方法でEKSクラスターをAzureArcに接続します。

この時サービスプリンシパルのログインは割愛しています。az loginを実行しました。

##### Azure側にリソースグループの用意
必要に応じて以下を実行する。--name以下は任意の名前やリージョンに変えていいです

```
az group create --name arceksdemo -l EastUS -o table
```


##### AzureCLIを使用してArcバイナリをデプロイします
任意のリソースグループ名、名前を付けて構いません。

```
az connectedk8s connect --name arceksdemo --resource-group arceksdemo --location 'eastus' --tags 'Project=jumpstart_azure_arc_k8s'
```

完了すると、EKSクラスターが新しいリソースグループ内の新しいAzureArc対応のKubernetesリソースとして接続され
最初に示した接続ができます。

#はまったところ

### kubectlが通らない
AWS側の認証の問題なようでした。aws conffigureでごり押しました。

```
azureuser@test-eks-arc:~$ kubectl apply -f configmap.yml
error: error loading config file "/home/azureuser/.kube/config": yaml: control characters
azureuser@test-eks-arc:~$ sudo kubectl apply -f configmap.yml
The connection to the server localhost:8080 was refused - did you specify the right host
```

ちゃんと理解するなら、以下を読むのがいいかなと思いました
[Kubernetesにて複数人開発する際にぶつかったRBACの壁](https://qiita.com/keng000/items/4afe077c649ec3e22ef5#eks%E3%81%AB%E3%81%A6rbac%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)


#終わりに

これでAzureArcにEKSを登録できたものの、各種機能が使えるようになるかというとそういうわけでじゃなく
ここから拡張機能の設定などをうることで、kubernetes構成情報やリソース使量料をAzure側から見れるようになります。
その作業の投稿はまたいつか・・

![AzureArc接続_EKS2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585341/beb002e0-df9c-caca-8d28-e0d671960283.png)

![AzureArc接続_EKS3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585341/046fb541-3f6d-a950-17f7-b1d29a2d617b.png)