Amazon Elastic Kubernetes Service (EKS) の利用方法(1/3)

Amazon EKS とは
--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/68e963ac-056f-85c1-b7ce-40a9b05b1c4e.png)
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html

Kubernetes（クーバネティス）は、コンテナオーケストレーションプラットフォームです。
コンテナは、アプリケーションやサービスを効率的かつ柔軟に実行するための軽量な仮想化技術であり、Kubernetesはそのコンテナを効果的に管理するための仕組みを提供します。

Kubernetesは、複数のコンテナが動作するクラスターを管理するための一連のAPIを提供し、
ノード上で実行されるコンテナの自動デプロイ、スケーリング、ロードバランシング、ネットワークルーティングなどの機能を提供します。
これにより、アプリケーションの高可用性やスケーラビリティが実現され、運用効率の向上が期待できます。

__AWSでは、これらのサービスをマネージド型で提供しています。__

今回の内容
メリット
リソースの分類(ワークロード、サービス、設定、ストレージ)
構築の流れ
1.Amazon EKSサービスロール作成
2.EKSクラスターVPCの作成
3.EKSクラスターの作成
4.ワーカーノードのデプロイ
kubectl get nodes

メリット
--

__1.	操作の簡素化__
EKSはKubernetesを完全にマネージドしており、クラスターのセットアップや管理を簡素化しています。これにより、クラスターのオペレーションにかかる時間やリソースを最小限に抑えることができます。
__2.	スケーラビリティ__
EKSは、Kubernetesクラスターを自動的にスケールアップ/ダウンするための機能を提供しています。これにより、負荷が増えた場合でも、アプリケーションの可用性を維持できます。
__3.	高可用性__
EKSは、高可用性のために複数の可用ゾーンにわたってKubernetesクラスターをデプロイすることができます。これにより、1つの可用ゾーンに障害が発生しても、他の可用ゾーンでアプリケーションを実行できるため、アプリケーションの可用性を向上させます。
__4.	セキュリティ__
EKSは、KubernetesのクラスターコントロールプレーンをAWSが管理するため、セキュリティの責任を共有できます。また、EKSはIAMやVPCなどのAWSサービスとの統合を提供しており、アプリケーションのセキュリティを強化することができます。
__5.	AWSサービスとの統合__
EKSは、AWSの他のサービスとのシームレスな統合をサポートしています。たとえば、Amazon EC2インスタンスで実行されるKubernetesワーカーノードを起動するために、Amazon EBSやAmazon S3などのAWSサービスを使用できます。

VPCE（VPC Endpoint）を使用することで、Amazon EKSクラスター内のPodが、VPCエンドポイントを介して他のAWSサービスに安全にアクセスすることができます。PodがAWSサービスにアクセスする際には、VPCのNATゲートウェイやIGW（Internet Gateway）を経由する必要がなく、より安全で高速な接続が可能になります。

__AWSのRDSに対するVPCEを使用する例__

__RDS用のVPCEを作成__
~~~
aws ec2 create-vpc-endpoint --vpc-id <VPC_ID> --service-name com.amazonaws.<REGION>.rds --vpc-endpoint-type Interface --subnet-ids <SUBNET_ID> --security-group-ids <SECURITY_GROUP_ID>
~~~

__VPCエンドポイントを使用してRDSに接続するためのPodのマニフェストの例(MySQL)__
この例では、awsvpcネットワークモードを指定しています。また、envセクションでMySQLへの接続情報を定義しています。さらに、metadataセクションのannotationsに、RDSのVPCエンドポイントのARNを指定しています。これにより、PodはRDSに接続するために必要なVPCエンドポイントを自動的に特定することができます。
~~~
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    ports:
    - containerPort: 80
  securityContext:
    allowPrivilegeEscalation: false
    capabilities:
      drop:
      - ALL
  # awsvpcネットワークモードを指定し、VPCエンドポイントを利用する
  networkMode: "awsvpc"
  # RDSに接続するための環境変数を定義する
  env:
  - name: MYSQL_HOST
    value: <RDSのエンドポイント>
  - name: MYSQL_USER
    value: <ユーザー名>
  - name: MYSQL_PASSWORD
    valueFrom:
      secretKeyRef:
        name: <シークレット名>
        key: <パスワードのキー>
  dnsPolicy: "ClusterFirst"
  dnsConfig:
    options:
    - name: "ndots"
      value: "2"
  # VPCエンドポイントの参照
  metadata:
    annotations:
      # RDSのVPCエンドポイントARN
      "aws/vpc-endpoint-id": "vpce-0123456789abcdef0"
~~~

Podをデプロイする。
~~~
kubectl apply -f <MANIFEST_FILE>
~~~
これにより、PodはVPCEを介してRDSにアクセスすることができます。


__EKS（Elastic Kubernetes Service）では、Podを自動スケールすることができます。__
Podの自動スケーリングには、KubernetesのHorizontal Pod Autoscaler（HPA）を使用します。HPAはKubernetesのリソースの1つで、CPU使用率、API Objectのメトリクスなどをモニタリングし、 スケーリングが必要になったタイミングで、Replication ControllerやDeploymentなどのPod数をスケーリングします。 DaemonSetのようにスケールしないしない物に関してはHPAの対象とすることはできません。

Horizontal Pod Autoscaler (HPA)以外に、KubernetesのVertical Pod Autoscaler (VPA)やCustom Metrics APIを使用することもできます。Vertical Pod Autoscalerは、Podのリソース要件（CPU、メモリ）を自動的に調整することで、Podのパフォーマンスを最適化します。VPAは、Podのリソース使用量の統計情報を収集し、その情報を基に、Podのリソース要件を自動的に調整します。

Custom Metrics APIでは、ユーザーが独自に定義したメトリックスを使用して、Podの自動スケーリングを行うことができます。ユーザーは、PrometheusやCloudWatch Metricsなど、サポートされているメトリクスストレージソリューションからカスタムメトリクスを収集し、Custom Metrics APIを使用してそれらのメトリックスに基づいてPodのスケーリングを行うことができます。

リソースの分類(ワークロード、サービス、設定、ストレージ)
--
◆ワークロード
Kubernetesのワークロードとは、アプリケーションを実行するためのオブジェクトで、Pod、ReplicaSet、Deployment、StatefulSet、DaemonSetなどが含まれます。これらのオブジェクトは、コンテナを実行するために必要なリソースを定義します。

◆サービス
Kubernetesのサービスは、一連のPodに対して一意なDNS名とIPアドレスを提供するオブジェクトで、一般的には外部からのアクセスを可能にします。Serviceは、Podが動的に作成・削除される環境でも、一貫したアクセス先を提供することができます。Serviceのタイプには、ClusterIP、NodePort、LoadBalancer、ExternalNameがあります。

◆設定
Kubernetesの設定は、アプリケーションの設定情報を格納するオブジェクトで、ConfigMap、Secretが含まれます。ConfigMapは、アプリケーションの設定情報をKey-Valueの形式で格納するオブジェクトで、Secretは、機密情報を暗号化して格納するオブジェクトです。

◆ストレージ
Kubernetesのストレージは、コンテナの永続化に使用されるオブジェクトです。ストレージは、データを保持するために必要な永続化された領域を提供します。ストレージは、永続ボリューム（Persistent Volume、PV）と永続ボリュームクレーム（Persistent Volume Claim、PVC）の2つのオブジェクトで構成されます。さらに、StorageClassオブジェクトを使用することで、動的な永続ボリュームの作成を簡素化することができます。

__「クラスタネットワーク」と「外部ネットワーク」があります。__
Kubernetes内は「クラスタネットワーク」と呼ばれる「外部ネットワーク」とは異なるネットワークが構築されるので、単純に「クラスタネットワーク」内のPodへアクセスすることはできません。

Kubernetesのクラスタ内では、各ノードに割り当てられたIPアドレスに基づいて、クラスタネットワークが構築されます。このネットワークは、各ノード上で実行されるPod間の通信に使用されます。一方、外部ネットワークは、Kubernetesクラスタの外部にあるネットワークで、一般的にはインターネットを指します。

クラスタネットワークは、クラスタ内のPod間の通信に最適化されていますが、外部からのアクセスは制限されています。これは、クラスタネットワークには、クラスタ内のノードやPodにのみ割り当てられるプライベートIPアドレスが使用されるためです。外部からのアクセスを可能にするには、Kubernetesのサービスを使用して、クラスタネットワーク上のPodに公開する必要があります。

構築の流れ
=

手順は大きく分けて4つ

1.Amazon EKSサービスロール作成
2.EKSクラスターVPCの作成
3.EKSクラスターの作成
4.ワーカーノードのデプロイ


1.Amazon EKSサービスロール作成
=
__EKSクラスターが他のAWSリソースに対してアクセスするためのロールを作成する__

AWSマネジメントコンソールにサインインし、IAMダッシュボードに移動します。
左側のメニューから、「ロール」を選択します。
「ロールを作成する」ボタンをクリックします。
「AWSサービス」を選択し、「EKS」を選択します。
「次のステップ」をクリックします。
「権限」ページで、以下の2つのマネージドポリシーを追加します。
AmazonEKSServicePolicy
AmazonEKSClusterPolicy
「次のステップ」をクリックします。
「タグ」ページをスキップし、「ロール名」を入力します。
「ロールの作成」をクリックします。
これで、EKSサービスロールが作成されます。
このロールは、EKSクラスターが他のAWSリソースにアクセスするために必要な権限を持っています。EKSクラスターを作成する際に、このロールを使用してクラスターに権限を与えることができます。


2.EKSクラスターVPCの作成
=
__EKSクラスターのVPCを作成する__

1).AWSマネジメントコンソールにサインインし、Amazon VPCダッシュボードに移動します。
左側のメニューから、「VPC」を選択し、「VPCウィザードを起動する」をクリックします。
VPCの名前とCIDRブロックを入力します。CIDRブロックは、EKSクラスターで使用するPod IPアドレス範囲を含める必要があります。

2).パブリックサブネットとプライベートサブネットを作成するか、またはすでに存在するサブネットを使用するかを選択します。EKSクラスターで使用するサブネットを指定する必要があります。

3).インターネットゲートウェイを作成するか、すでに存在するものを使用するかを選択します。
EKSクラスターにインターネットアクセスが必要な場合は、インターネットゲートウェイを作成する必要があります。

4).ルートテーブルを作成するか、既存のルートテーブルを使用するかを選択します。
EKSクラスターで使用するルートテーブルを指定する必要があります。

5).セキュリティグループを作成するか、既存のセキュリティグループを使用するかを選択します。
EKSクラスターで使用するセキュリティグループを指定する必要があります。

6).VPCを作成してウィザードを完了します。

これで、EKSクラスターで使用するVPCが作成されます。
VPCのサブネット、ルートテーブル、セキュリティグループなどのリソースを適切に構成することで、EKSクラスターを構築するための基盤が整います。


3.EKSクラスターの作成
=
__Amazon Elastic Kubernetes Service（EKS）クラスターを作成する__

AWSマネジメントコンソールにサインインし、EKSダッシュボードに移動します。
「クラスターを作成する」をクリックします。
「クラスターの設定」で、クラスター名、リージョン、バージョンを指定します。
また、VPCとサブネット、およびアクセスコントロールに使用するIAMロールを選択します。
「ノードグループの設定」で、ノードグループの名前、インスタンスタイプ、AMIタイプ、およびノードグループに含めるインスタンスの数を指定します。
「ノードグループの詳細」で、ノードグループで使用するセキュリティグループ、ロール、およびキーペアを指定します。
「クラスターの設定の確認」で、作成するクラスターとノードグループの設定を確認します。
「作成」をクリックして、クラスターを作成します。

EKSクラスターが作成されるまでの時間は、クラスターのサイズや設定、リージョンなどによって異なりますが、通常は数分から10分程度です。

クラスター作成後には、kubectlなどのKubernetesツールを使用してクラスターにアクセスできます。また、AWSマネジメントコンソールのEKSダッシュボードから、クラスターのステータスやログ、ノードグループの詳細などを確認できます。

Amazon EKSは、ノードグループの自動スケーリング、パッチ管理、セキュリティパッチ適用、ログの収集などの機能を提供します。


4.ワーカーノードのデプロイ
=
__EKS EC2クラスターにワーカーノードをデプロイする__

__1).	必要なIAMロールを作成する__
ワーカーノードには、
AmazonEKSWorkerNodePolicy、
AmazonEC2ContainerRegistryReadOnly、
AmazonEKS_CNI_Policyの3つのIAMロールが必要です。
これらのロールは、EKSワーカーノードが必要とするAWSサービスへのアクセス許可を提供します。

__2).ワーカーノードで使用するAmazon Machine Image (AMI) を選択する。__
EKSノード用のAMIを選択する必要があります。AWSは、EKS-optimized AMIを提供しています。

__3).	ワーカーノードグループを作成する__

◆セキュリティグループの作成
ワーカーノードグループで使用するセキュリティグループを作成します。セキュリティグループは、インバウンドおよびアウトバウンドのトラフィックを制御します。
例えば、以下のようにAWS CLIを使用してセキュリティグループを作成できます。
~~~
aws ec2 create-security-group --group-name my-security-group --description "My security group" --vpc-id <vpc-id> 
~~~

◆Launch Templateの作成
ワーカーノードグループで使用するLaunch Templateを作成します。Launch Templateは、EC2インスタンスの設定を定義します。AMI、インスタンスタイプ、ユーザーデータなどのパラメータを指定できます。
以下の例は、Launch Templateを作成するAWS CLIのコマンドです。
~~~
aws ec2 create-launch-template --launch-template-name my-launch-template --version-description "My version" --instance-type t3.small --image-id ami-0xxxxxx 
~~~

◆Auto Scaling Groupの作成
最後に、Auto Scaling Groupを作成してワーカーノードグループを管理します。Auto Scaling Groupは、指定されたLaunch Templateを使用してEC2インスタンスを起動および管理します。
以下の例は、Auto Scaling Groupを作成するAWS CLIのコマンドです。
~~~
aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg --launch-template "LaunchTemplateName=my-launch-template,Version=1" --min-size 2 --max-size 10 --desired-capacity 2 --vpc-zone-identifier <subnet-ids> --tags "Key=Name,Value=my-node-group,PropagateAtLaunch=true" 
~~~

作成されたワーカーノードグループは、EKSクラスターに自動的に登録されます。

__4).	kubelet設定を更新する__
kubelet-config-1.18.yamlファイルを作成します。このファイルは、kubeletの設定をカスタマイズするために使用されます。
~~~
cat <<EOF > kubelet-config-1.18.yaml kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd EOF 
~~~
kubeletのConfigMapを作成します。
~~~
kubectl create configmap kubelet-config-1.18 --from-file=kubelet-config-1.18.yaml 
~~~
__5).	ノードグループをEKSクラスターに紐づける__
AWS CLIを使用して、ノードグループをEKSクラスターに紐づけます。
~~~
aws eks update-kubeconfig --name <cluster_name> 
~~~

Nodeグループのkubeconfigを作成します。
~~~
aws eks describe-cluster --name <cluster_name> --query "cluster.status.endpoint" --output text aws eks describe-cluster --name <cluster_name> --query "cluster.certificateAuthority.data" --output text | base64 -d > ca.crt aws eks update-kubeconfig --name <cluster_name> --kubeconfig aws-auth.yaml 
~~~

aws-auth ConfigMapを更新します。
次のコマンドで、ConfigMapを編集します。
~~~
kubectl edit configmap aws-auth -n kube-system 
~~~

編集したaws-auth ConfigMapに、ノードグループのARNを追加します。
~~~
apiVersion: v1 data: mapRoles: | - rolearn: <worker_node_role_arn> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes 
~~~

__6).	ワーカーノードがEKSクラスターに正常に登録されているか確認する__
次のコマンドを使用して、ワーカーノードがEKSクラスターに正常に登録されているか確認します。
~~~
kubectl get nodes
~~~

クラスターに登録されているノードの一覧が表示されます。各ノードの状態（Ready 等）やリソース使用状況なども確認できます。
コマンドを実行した場合の出力例

~~~
$ kubectl get nodes

NAME        STATUS   ROLES    AGE     VERSION
node-1      Ready    <none>   1d      v1.21.3
node-2      Ready    <none>   1d      v1.21.3
node-3      Ready    <none>   1d      v1.21.3
~~~

この例では、クラスタに node-1、node-2、node-3 という3つのノードが存在し、すべてが Ready ステータスであることがわかります。
また、これらのノードにはいずれも特定の役割が割り当てられていないこと < none > や、ノードの稼働時間 (AGE) なども確認出来ます。

Amazon Elastic Kubernetes Service (EKS) の利用方法(1/3)
https://qiita.com/kimuni-i/items/656ca4d314a8982e70cb

Amazon Elastic Kubernetes Service (EKS) の利用方法(2/3)
https://qiita.com/kimuni-i/items/06c70de226cf074d8b23

Amazon Elastic Kubernetes Service (EKS) の利用方法(3/3)
https://qiita.com/kimuni-i/items/b2b3d07c2c76c95884a1