コンテナサービス「Amazon EKS」とは?実際に使用してみた

Amazon EKS(以下EKSとします。)は、AWSで利用できるKubernetesのマネージドサービスです。
EKSを利用することで、Kubernetesをクラウド上で実行できるようになります。
当コラムではEKSの簡単な概要説明と、実践の紹介をします。

前回のコラムでもコンテナサービスを扱っております。
コンテナ管理サービス「Amazon ECS」とは?実際に使用してみた」ではECSの概要説明、実践を行っています。是非ご確認ください。

EKSの概要

EKSはオーケストレーションツールのデファクトスタンダードといえるKubernetesをクラウド上で利用可能なマネージドサービスです。コンテナを稼働するサーバーとしては、EC2、Fargateを選択できます。
ECSとの違いとしては、オーケストレーションツールが異なります。
ECSはAWS独自のオーケストレーションツールを利用しておりAWS上でのみ利用できますが、EKSはKubernetesを利用しているため、オンプレミスでKubernetesを利用していた方はクラウド上で同一のものを使える利点があります。また、ECSにはない高度な機能として、コンテナのスケーリングや障害時の自己修復機能などが利用できます。
EKSの詳細は以下を参照してください。

リンク:Amazon Elastic Kubernetes Service別ウィンドウで開きます

実践例

今回は、AWSが提供しているEKSのドキュメントを参考にして、クラスターやワーカーノードの作成とサンプルアプリケーションのデプロイを行っていきます。
クラスターやワーカーノードの作成には、コマンドで操作する方法と画面で操作する方法の2種類がありますが、今回は主に画面を利用した方法で実践を行います。(なお、以下のドキュメントには2種類の方法が記載されていますので参考にしてみてください。)

リンク:Amazon EKSの開始方法別ウィンドウで開きます

作成する構成は以下の図の通りです。

構成のポイント

1. コンテナが稼働するサーバーはEC2で構築

2. Multi-AZで可用性の高い構成

[前提]

作業時の各種コマンドは、作業用にOSをAmazon Linux 2として作成したEC2インスタンス上で実施しています。EC2インスタンスの作成手順については割愛しています。
確認するコマンドのバージョンは2020/12時点の最新バージョンです。
以下は作業手順です。

---

1. EKS使用前の作業

1-1. AWS CLIのバージョン確認

1-2. eksctlのインストール

1-3. kubectlのインストール

1-4. 認証情報の設定

2. CloudFormationでのスタック作成

2-1. EKSサービスロールのスタック作成

2-2. EKSワーカーノードロールのスタック作成

2-3. クラスター環境用VPCのスタック作成

3. EKSクラスターの作成

3-1. EKSクラスターの作成

3-2. kubeconfigファイルの作成

4. ワーカーノードの作成

4-1. EKSノードグループの起動

4-2. コンテナのデプロイ

---

1. EKS使用前の作業

ここでは、作業用のEC2インスタンスに各作業で使用するコマンドなどのインストールを行っていきます。

1-1. AWS CLIのバージョン確認

AWS CLIのバージョンが1.18.163 以降であることを確認します。

CLIに、「aws –version」と入力します。

aws --version
aws-cli/2.1.4

※AWS CLIのバージョン1と2では同じawsコマンドが使用されています。両方のバージョンがインストールされている場合、最初に見つかったバージョンが使用されます。公式ドキュメントではバージョン1.18.49以降が推奨されています。バージョン1と2の両方がインストールされている場合やバージョンが古い場合は以下のリンクを参考にしてください。

リンク:Linux での AWS CLI バージョン 2 のインストール、更新、アンインストール別ウィンドウで開きます

1-2. eksctlのインストール

「eksctl」をダウンロードし、解凍します。

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

ダウンロードした「eksctl」をPATHの通ったディレクトリへ移動します。

sudo mv /tmp/eksctl /usr/local/bin

バージョンを確認し、以下のように結果が表示されればインストール成功です。

eksctl version
0.31.0
1-3. kubectlのインストール

「kubectl」をダウンロードします。

curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/
1.18.8/2020-09-18/bin/linux/amd64/kubectl

実行権を付与します。

chmod +x ./kubectl

コマンドにPATHを通すため別フォルダへ移動します。

sudo mv ./kubectl /usr/local/bin

バージョンを確認し、以下のように結果が表示されればインストール成功です。

kubectl version --short --client
Client Version: v1.18.8-eks-7c9bda
1-4. 認証情報の設定

コンソールで利用するアカウントの「アクセスキー」、「シークレットキー」、「リージョン」を設定します。

aws configure
AWS Access Key ID [None]: <アクセスキー>
AWS Secret Access Key [None]: <シークレットキー>
Default region name [None]: <リージョン>

※今回、リージョンは東京リージョン(ap-northeast-1)を選択しています。

2.CloudFormationでのスタック作成

CloudFormationでは、リソースをスタック単位で管理しているため、今回は、利用するAWSリソース毎にスタックを作成します。

※CloudFormationの使用方法は以下を参照してください。

リンク: AWS CloudFormationユーザーガイド別ウィンドウで開きます

2-1. EKSサービスロールのスタック作成

CloudFormationのコンソール画面を操作する端末上で、以下のjsonを入力し、「EKS-service-role.json」のファイル名で保存します。

**************************
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Amazon EKS Cluster Role'


Resources:

  eksClusterRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - eks.amazonaws.com
          Action:
          - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonEKSClusterPolicy

Outputs:

  RoleArn:
    Description: The role that Amazon EKS will use to create AWS resources for Kubernetes clusters
    Value: !GetAtt eksClusterRole.Arn
    Export:
      Name: !Sub "${AWS::StackName}-RoleArn"
**************************

ステップ1では「テンプレートの指定」の「テンプレートソース」は、「テンプレートファイルのアップデートロード」を選択し、「ファイルの選択」から「EKS-service-role.json」を選択し、「次へ」をクリックします。

ステップ2では「スタックの名前」に「EKS-service-role」を入力し、「次へ」をクリックします。

ステップ3では設定はデフォルトのまま、「次へ」をクリックします。

ステップ4では作成前の設定確認を行います。

設定に間違いが無いことを確認し、画面下部の「AWS CloudFormationによってIAMリソースが作成される場合があることを承認します。」をチェックし、「スタックの作成」をクリックします。

画面が自動的に切り替わり、「CREATE_COMPLETE」と表示されれば、スタックの作成が完了です。

2-2. EKSワーカーノードロールのスタック作成

ステップ1では「テンプレートの指定」の「テンプレートソース」に、「Amazon S3 URL」を選択し、その下段に「https://amazon-eks.s3.us-west-2.amazonaws.com/
cloudformation/2020-08-12/amazon-eks-nodegroup-role.yaml」を入力し、「次へ」をクリックします。

ステップ2では「スタックの名前」に「eks-worker-node-role」を入力し、「次へ」をクリックします。

ステップ3以降は[2-1. EKSサービスロールのスタック作成]と同様に、デフォルトのまま設定し、確認します。

2-3. クラスター環境用VPCのスタック作成

ステップ1では「テンプレートの指定」の「テンプレートソース」に、「Amazon S3 URL」を選択し、下段に「https://amazon-eks.s3.us-west-2.amazonaws.com/
cloudformation/2020-08-12/amazon-eks-vpc-sample.yaml」を入力し、「次へ」をクリックします。

ステップ2では「スタックの名前」に「eks-cluster-vpc」を入力し、「次へ」をクリックします。

ステップ3以降は[2-1. EKSサービスロールのスタック作成]と同様に、デフォルトのまま設定し、確認します。なお、今回は、ステップ4の「AWS cloudFormationによってIAMリソースが作成される場合があることを承認します。」のメッセージは表示されません。

この後、画面が自動で切り替わります。そして、次の作業で行うEKSクラスターの設定を行うため、「出力」タブをクリックします。「SecurityGroups、SubnetIds、VpcId」の値をメモ帳などにコピーしておきます。

3. EKSクラスターの作成

3-1. EKSクラスターの作成

ステップ1で「クラスター設定」の「名前」の欄に「eks-cluster」を入力し、「クラスターサービスロール」に2-1.で作成したEKSサービスロール名の「EKS-service-role」を選択し、「次へ」をクリックします。

ステップ2では「VPC」に2-3.で作成したクラスター環境用VPC名の「eks-cluster-vpc」を選択します。「セキュリティグループ」は、2-3.でメモ帳にコピーした「SecurityGroupsの値」を選択し、「次へ」をクリックします。

ステップ3では、設定はデフォルトのまま、「次へ」をクリックします。

ステップ4では作成前の設定確認を行います。
設定に間違いが無いことを確認し、「作成」をクリックします。

※作成には約10分かかります。

3-2. kubeconfigファイルの作成

クラスターへアクセスするために必要なkubeconfigファイルを自動で作成します。
CLIに以下のコマンドを入れます。

aws eks --region ap-northeast-1 update-kubeconfig --name eks-
cluster

接続のテストを行います。

kubectl get svc
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)
AGE
svc/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP
1m

4. ワーカーノードの作成

4-1. EKSノードグループの起動

eks-clusterの画面にある「コンピューティング」タブをクリックし、「ノードグループ追加」をクリックします。

ステップ1では「ノードグループの設定」の「名前」に「eks-worker-node」を入力し、「ノードIAMロール」は、2-2.で作成したEKSワーカーノードロール名「eks-worker-node-role」を選択し、「次へ」をクリックします。

ステップ2では、今回は以下のように設定しました。

  • AMIタイプ「Amazon Linux (AL2_x86_64)
  • インスタンスタイプ「t3.small」
  • ディスクサイズ「10」
  • 最小サイズ「3」
  • 最大サイズ「3」
  • 希望サイズ「3」

設定後に「次へ」をクリックします。

ステップ3では作成済みの「SSHキーペア」を選択し、「次へ」をクリックします。
※「SSHキーペア」が無い場合はEC2コンソールのリンクから作成できます。

ステップ4では作成前の設定確認を行います。
設定に間違いが無いことを確認し、「作成」をクリックします。

※作成に約5分かかります。

4-2. コンテナのデプロイ

Availability ZoneにまたがるGuestbookのアプリケーションとRedisのデータベースアプリケーションのコンテナをデプロイします。
作成する構成は以下の図の通りです。

構成のポイント

1. GuestbookのウェブアプリケーションとRedisのデータベースの2種類のコンテナを導入

2. RedisはAvailability Zoneにまたがり、1ノードをMaster(読み書き可)にし、残りはSlave(参照のみ)のバックアップとして冗長化構成

コンテナをクラスターに導入し、起動します。

(redis-master-controller用)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/
examples/master/guestbook-go/redis-master-controller.json

(redis-master-service用)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/
examples/master/guestbook-go/redis-master-service.json

(redis-slave-controller用)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/
examples/master/guestbook-go/redis-slave-controller.json

(redis-slave-service用)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/
examples/master/guestbook-go/redis-slave-service.json

(guestbook-controller用)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/
examples/master/guestbook-go/guestbook-controller.json

(guestbook-service用)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/
examples/master/guestbook-go/guestbook-service.json

LoadBalancerに割り当てられたEXTERNAL-IPエンドポイントを確認します。

CLIに以下のコマンドを入れます。

kubectl get pod,svc -o wide

結果が表示され、下部に以下のような表示がされるため、赤字部分をコピーします。

********************************
~<省略>~
NAME TYPE CLUSTER-IP EXTERNAL-IP  PORT(S) AGE SELECTOR
service/guestbook LoadBalancer 10.100.246.184
a673a63146ec64412aae9f5b47de095a-930813037.ap- northeast-1.elb.amazonaws.com 3000:32741/TCP 6s app=guestbook
~<省略>~
********************************

確認したEXTERNAL-IPエンドポイントの3000番ポートへアクセスします。
ブラウザを開き、赤字部分に:3000を加えて表示します。

http://a673a63146ec64412aae9f5b47de095a-930813037.ap-northeast-1.elb.amazonaws.com:3000

Guestbookのウェブアプリケーション実行が確認でき、デプロイが成功しました。

おわりに

AWSではECSやEKSなどニーズにあったコンテナサービスを提供しています。 クラウドで構築するシステム環境の方針にあうベストなサービスを選択しましょう。

Amazon Web Services(AWS)、Microsoft Azureの
導入支援サービスのご相談、お問い合わせをお待ちしております。

ページ上部へ戻る