いまさらAmazon EKSを使ってみる （普通のk8sとの違いなど ）

今更ながら、k8sは使ってるがAmazon EKSはちゃんと使ったことないので気になったポイントまとめ
※2021年1月時点

# [1] Amazon EKSとは

- AWSが提供する`マネージドKubernetes`サービス（2018 GA）
- Masterにあたる**コントロールプレーン**(etcd含む)がサーバレス的に提供され、Worker部分は統合された**EC2(NodeGroup)**か**Fargate**でクラスタを構成する
- re:Invent 2020にて**EKS Anywhere**という新サービスが発表され、オンプレミス環境のKubernetesの管理拡張も可能になる予定（GCPのAnthos的な感じ）
    - 参考：オンプレ利用想定のディストリビューション EKS Distro：https://github.com/aws/eks-distro

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/4170d36a-7992-727c-3cdd-0635bd773d59.png)


### Kubernetesバージョンについて

- 本家アップストリームの最新版はすぐに使えない
- 半年ほど遅れてEKSはサポートしている模様（目安的には1～2世代古い）
- 本家では最新3世代サポートだが、`EKSは最新4世代までサポート`
    - https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/kubernetes-versions.html

### 可用性/耐障害性とSLAについて

- リージョン内の 3 つのアベイラビリティーゾーンにまたがって動作する `2つ以上の APIサーバーノードと3つのetcdノード`で構成されている
    - https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/disaster-recovery-resiliency.html
- `99.95%のSLA`が規定されている
    - https://aws.amazon.com/jp/eks/sla/

### 価格について

- 基本はクラスタごとに`毎時課金 0.10USD`と、ワーカーノード（EC2 or Fargate）の利用料
- その他暗号化のKMSやCloudWatch、S3、ECR(コンテナレジストリ)利用料など関連サービスを利用した料金

## Amazon EKS利用のメリット

- マネージドかつHA構成のコントロールプレーン(etcd含む)が容易に構築できる
- WorkerノードのAuto Scalingが利用できる（PodではなくNodeレベルの**Cluster Autoscaler**）
- 使った分だけの従量課金
- 認証認可をKubernetesの**RBAC**と**AWS IAM**を統合できる（AWSユーザ向けの利点）
- その他のAWSサービスとの統合（例：KMS、Cloud Watch、EFS、などなど）

# [2] クラスタ構築関連

実際にクラスタを作成する際に気になったポイント
※所感としてはGKEより複雑な印象

## クラスタ作成手段

- クラスタ作成方法は3種類の方法がある
    - ①AWSコンソールからGUIポチポチ
    - ②AWS標準CLIツール「**aws cli**」を利用
    - ③公式のEKSクラスタ構築用CLIツール「**eksctl**」を利用

## eksctlとは？
<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/b233c22a-bda5-526a-fb04-e712467fa2d8.png">
https://eksctl.io/

- 標準的なAWSサービスはAWSコンソールかaws cliで操作するが、EKSのk8sクラスタ構築は煩雑なためか、EKS k8sクラスタ作成用のCLIが別途提供されている
- 普通にコンソールからEKS k8sクラスタを作成する場合、Master要素(コントロールプレーン)の他にもVPC/Subnet/SGやIAM、Workerノードの作成など多くの操作手順が必要だが、eksctlはコマンド1つでそれらを自動的に生成し、クラスタ構築してくれる
- もともとWeaveworks社がGo言語ベースで開発し、OSSとして公開されている
    - https://github.com/weaveworks/eksctl
- 裏で**Cloud Formation**が連携していて、各種必要なAWSリソース生成を行っている
- GCP GKEでいうと**gcloud**コマンド相当

### eksctlインストール

```sh
$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

$ sudo mv /tmp/eksctl /usr/local/bin
```
https://github.com/weaveworks/eksctl

### eksctlでEKS k8sクラスタ作成

- 極論でいえば、`eksctl create cluster`コマンドだけで作成できる
- 実際は色々なオプションを付ける
- `eksctl create cluster --help`でオプションは参照可能

クラスタ作成例）

```sh
eksctl create cluster  \
  --name=test-cluster \      #クラスタ名
  --region=ap-northeast-1 \  #リージョン
  --version=1.18 \           #バージョン
  --node-type=t3.medium \    #Workerインスタンスタイプ
  --nodes=2 \                #Workerノード数
  --nodes-min=2 \            #Workerオートスケール最小
  --nodes-max=2 \            #Workerオートスケール最大
  --node-volume-size=20      #Workerディスクサイズ
```

※参考：2020/12にリリースされた**AWS CloudShell**から、kubectlとeksctlをセットアップすればクラスタ作成（CLIコマンド実行）がすぐに試せます
https://aws.amazon.com/jp/blogs/news/aws-cloudshell-command-line-access-to-aws-resources/

- eksctlで上記コマンドで自動生成された主なAWSリソース
    - Cloud Formationスタック（KSクラスタとWorker(NodeGroup)の2つ）
    - EKSクラスタ
    - VPC　
    - サブネット
    - SG
    - InternetGWとNAT-GW
    - IAM ROLE
    - EC2（NodeGroup）
    - etc.

### eksctlでEKS k8sクラスタ削除

`eksctl delete cluster --name クラスタ名`

## **Kubernetesバージョン**

- k8sバージョンは2021/1時点でアップストリーム最新版は1.20だが、EKSでは1.18

## アーキテクチャ

- 基本的に①パブリック、②プライベート、③パブリック&プライベート の3パターンがある
- Master(コントロールプレーン)～Worker間は、サブネット内の**ENI**を経由する(ENIは自動生成される)
- Master(コントロールプレーン)のAPIエンドポイントは、パブリックかプライベートか選択できる
- 下記は標準的なパブリック&プライベートの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/005ddfd6-642a-7c43-faa9-d5dd3e76f89c.png)
https://aws.amazon.com/jp/blogs/news/de-mystifying-cluster-networking-for-amazon-eks-worker-nodes/

- **VPC**
    - クラスタ全体では基本２つ
        - 1) Master/コントロールプレーンは「Amazon EKS管理VPC」と呼ばれるユーザが意識しない領域に作成される（サーバーレス）
        - 2) Workerノードは指定したVPCに作成できる

- **サブネット**
    - Workerノード用に2つ以上のアベイラビリティーゾーンでサブネット作成が必要
    - パターンは３つ
        - パブリックのみ
        - プライベートのみ
        - パブリックとプライベートの併用（上の図）
         
- **SG**
    - 基本的に２つ
        - 各Workerノード用
        - Workerノードが存在するVPCサブネット内から、EKSコントロールプレーンへアクセスするための**ENI**に設定されるSG（eks-cluster-sg-XXXという名前でEKSが自動作成）
    - https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html

- **IAM ROLE**
    - MASTER(コントロールプレーン)用とWorker(Node Group)用の２つ
    - https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/using-service-linked-roles.html
 
## **CNIプラグイン**
- 基本はAWS提供の**amazon-vpc-cni-k8s**
    - https://github.com/aws/amazon-vpc-cni-k8s
    - https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html
- **Flannel**や**Calico**をセットアップすることもできる模様

## **ワーカーノード**のイメージ

- **EC2 起動テンプレート**が利用でき、ベースイメージ(AMI)やインスタンスタイプなどを規定できる

## **コンテナ**イメージの利用
- **ECR**を利用する場合は、ワーカーノードの**IAM ROLE**にECR利用のための以下の権限を付与しておく必要あり
    - "ecr:BatchCheckLayerAvailability"
    - "ecr:BatchGetImage"
    - "ecr:GetDownloadUrlForLayer"
    - "ecr:GetAuthorizationToken"

# [3] クラスタ接続設定

###1. kubectlインストール

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html

例）

```sh
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.18.9/2020-11-02/bin/linux/amd64/kubectl

chmod +x ./kubectl

mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin

echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile
```

###2. kubeconfigファイルの更新

https://aws.amazon.com/jp/premiumsupport/knowledge-center/eks-cluster-connection/

例）

```sh
aws eks --region リージョン update-kubeconfig --name クラスタ名
```

# [4] おまけ


## モニタリング

EKSコンソール上からのワークロードのモニタリングができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/ad139cfe-2ce0-7b57-6deb-9fcd1ba18119.png)