LoginSignup
6
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-19

Amazon EKS とは

image.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

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3