AWS EKS CLIでKubernetesクラスターを作成する方法

開発者であれば、通常はKubernetesにコンテナ化されたアプリケーションをデプロイしたいと考えるでしょう。しかし、問題は、どのようにデプロイするかですか? AWS EKS CLIを試してみませんか?

このチュートリアルでは、AWS EKS CLIをセットアップしてKubernetesクラスターを作成する方法を学びます。これにより、インフラストラクチャの管理ではなく、コードに集中することができます。

続けて、今日からクラスターの作成を開始しましょう!

前提条件

このチュートリアルは実践的なデモンストレーションとなります。一緒に進める場合は、PCとAWSアカウントを用意してください。AWSアカウントがない場合は、無料利用枠のアカウントを作成できます。

管理ユーザーの作成

Kubernetesクラスターを作成する前に、管理ユーザーを作成します。管理ユーザーにより、AWSコンソールにログインしてクラスターを構成することができます。AWSコンソールを使用して管理者権限を持つユーザーを作成することから、このチュートリアルを開始します。

1. AWSコンソールにログインし、IAMダッシュボードに移動します。

以下のように、左のパネルのユーザーをクリックして、右上のユーザーの追加をクリックします。

Initializing User Creation

2. 次に、ユーザー名フィールドにユーザー名を入力し、ここではK8-Adminを使用します。 アクセスキー – プログラムによるアクセスオプションを確認し、次へ: アクセス許可をクリックします。

プログラム的にアクセス可能なため、アクセスキー – プログラムによるアクセスオプションを選択しています。その結果、アプリケーションを使用して、AWSに直接通信して操作を実行できます。

Configuring User Details

3. 既存のポリシーを直接アタッチオプションをクリックし、AdministratorAccessポリシーをチェックし、次へ: タグをクリックします。

AdministratorAccessポリシーはユーザー(K8-Admin)にAWSへの完全なアクセス権限を付与し、以下のようになります:

  • ユーザーがCloudFormationを使用できるようにします
  • EC2インスタンスを作成し、CloudWatchログを作成できるようにします
  • エラスティックロードバランサーを構成します。
Setting up AdministratorAccess policies

4. 次へ: レビューをクリックしてタグの追加をスキップします。

Skipping the tags screen

5. 最後に、ユーザーの詳細を確認し、ユーザーの作成をクリックして管理者ユーザーの作成を完了します。

Creating the admin user

管理者ユーザーの作成が完了すると、画面の上部に以下のような成功メッセージが表示されます。後でログインするためにこれらのキーアクセスキーIDシークレット アクセスキーをメモしてください。

Previewing the admin user keys

EC2インスタンスの起動

これで、K8-Adminを作成したので、最初のEC2インスタンスを作成できます。このインスタンスをマスターノードとして使用し、クラスタを作成するためのコマンドを実行します。

1. EC2ダッシュボードに移動し、ページの右端にあるEC2をクリックし、Launch Instancesをクリックします。これにより、ブラウザがページにリダイレクトされ、Amazon Machine Image (AMI) (ステップ2) を選択できるページに移動します。

Launching an EC2 Instance

2. 次に、リストからAmazon Linux 2 AMI (HVM)の横にあるSelectをクリックします。

Amazon Linux 2 AMI (HVM)は、最新世代のハードウェアの最適なパフォーマンスを調整したLinuxカーネル5.10を提供します。このAMIには、本番レベルのKubernetesクラスタに必要な多くの機能も含まれています。

Selecting Amazon Linux 2 AMI (HVM)

3. インスタンスタイプはデフォルトのまま(t2.micro)にして、Next: Configure Instance Detailsをクリックしてインスタンスを構成します。

Previewing the instance type

4. Auto-assign Public IPオプションを有効にし、Next: Add Storageをクリックします。このオプションにより、各コンテナがKubernetesマスターノードとEC2インスタンスのパブリックIPにアクセスできるようになります。

Configuring instance details

5. デフォルト(Root)を保持して、ストレージの追加ページ次へをクリックしてください:タグを追加します。 Root ボリュームは、インスタンス内からデータを読み書きするために必要です。

Configuring the storage

6. タグを追加せずに、次へをクリックしてください:セキュリティグループの構成。

Previewing the tags

7. 下記のようにセキュリティグループのデフォルトを保持し、確認して起動をクリックしてください。

Previewing the Security Group

8. インスタンスの起動詳細を確認し、インスタンスを起動するには起動をクリックしてください。ポップアップが表示され、既存のキーペアを選択するか新しいキーペアを作成するかを選択できます(ステップナイン)。

Launching an instance

9. ダイアログポップアップで、以下のようにキーペアを構成してください:

  • ドロップダウンボックスで新しいキーペアを作成を選択します。
  • RSAキーペアタイプとして選択します。
  • 好みのキーペア名を指定してください。ただし、このチュートリアルでは、キーペア名はmy-nvkpに設定されています。
  • キーペアをダウンロードをクリックし、インスタンスを起動をクリックしてください。
Creating a new key pair

インスタンスの起動には1〜2分かかる場合があります。インスタンスが起動していると、EC2ダッシュボードにリストされます。下記のように表示されます。

Previewing the newly-created instance

AWS CLIツールの設定

現在、インスタンスが実行されているので、コマンドライン(CLI)ツールを構成する時が来ました。CLIツールをAWSアカウントと連携させて使用することは、Kubernetesクラスタを作成する上で重要です。

1. EC2ダッシュボードからインスタンスを選択するには、以下に示すようにチェックボックスをクリックします。インスタンスに接続するには、Connectをクリックします。

Connecting to the Ec2 instance.

2. 次に、ステップ1で選択したインスタンスに接続するために、Connectボタンをクリックします。

Connecting to the instance

EC2インスタンスに接続したら、ブラウザは以下に示す対話型ターミナルにリダイレクトされます。これはEC2インスタンスとの一時的なSSHセッションです。

対話型ターミナルを使用して、コマンドラインに接続し、新しいインスタンスに管理コマンドを実行できます。

Previewing the interactive terminal

3. 以下のawsコマンドを実行して、CLIのバージョンを確認します。

aws --version

出力から分かるように、Amazon Linux 2インスタンスではバージョン1.18.147が実行されており、これは古いバージョンです。Kubernetesのすべての機能にアクセスするためには、AWS CLIのバージョン2以上をダウンロードしてインストールする必要があります(ステップ3)。

Checking the AWS CLI version

4. 以下のcurlコマンドを実行して、CLIツールv2+をダウンロードし、awscliv2.zipという名前のZIPファイルに保存します。

 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" 
Downloading the CLI tool v2+

5. ダウンロードしたファイルを解凍し、古いAWS CLIがインストールされている場所を特定するには、次のコマンドを実行します。

unzip awscliv2.zip
which aws

出力から分かるように、古いAWS CLIは/usr/bin/awsにインストールされています。このパスを更新する必要があります。

Updating outdated AWS CLI

6. 以下のコマンドを実行して、次の操作を行います。AWS CLIのインストールパスを更新します:

  • 更新されたAWS CLIツールをAmazon Linux 2インスタンスにインストールします(sudo ./aws/install)。
  • CLIツールをインストールするディレクトリ(--install-dir /usr/bin/aws-cli)を設定します。これにより、更新されたAWS CLIを他のインスタンスに再インストールせずに転送できます。
  • 現在の環境にAWS CLIツールの新しいパスがある場合は、(--update)現在のシェル環境を更新します。
sudo ./aws/install --bin-dir /usr/bin --install-dir /usr/bin/aws-cli --update
Installing the CLI tool v2

7. 以下のaws --versionコマンドを再実行して、更新されたAWS CLIが正しくインストールされていることを確認します。

aws --version

以下に示すように、インストールされたAWS CLIのバージョンは2.4.7です。これは、筆者が書いた時点での最新のAWS CLIバージョンであり、2.4.7です。

Checking the AWS CLI updated version

8. 次に、aws configureコマンドを実行して、新しいAWS CLIツールでインスタンスを構成します。

aws configure

以下のプロンプトに適切な値を入力してください:

  • AWS Access Key ID [None] – 前述の「管理ユーザーの作成」セクションでメモしたアクセスキーIDを入力してください。
  • AWS Secret Access Key [None] – 前述の「管理ユーザーの作成」セクションでメモしたシークレットアクセスキーを入力してください。
  • Default region name [None] – サポートされているリージョンを選択してください。例:us-east-1
  • Default output format [None] – Kubernetesとの使用にはJSON形式が推奨されているため、jsonを入力してください。
Configuring the AWS Environment

Amazon EKSコマンドラインツール(eksctl)の設定

目標はAWS EKS CLIを使用してKubernetesクラスターを作成することです。そのため、Amazon EKS(eksctl)コマンドラインツールも構成します。このツールを使用すると、Amazon EKS上でKubernetesクラスターを作成および管理できます。

1. EC2インスタンスにKubernetesコマンドラインツール(kubectl)の最新バージョンをインストールします。このツールを使用してKubernetesクラスターに対してコマンドを実行できます。

2. 次に、以下のcurlコマンドを実行して、GitHubから最新のeksctlリリースを/tmpディレクトリに.tar.gzファイルとして取得し、アーカイブのコンテンツを/tmpディレクトリに抽出します。

以下のコマンドを実行して次の操作を実行します。

  • GitHubから最新のeksctlリリース(--location)を取得し、.tar.gzアーカイブとして取得します("<https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$>(uname -s)_amd64.tar.gz"
  • アーカイブのコンテンツを/tmpディレクトリに展開します(tar xz -C /tmp)。--silentフラグはコマンドの進行状況の出力を抑制します。
  • eksctlバイナリ(/tmp/eksctl)をAWS CLIをインストールしたパス(/usr/bin)に移動させます(sudo mv)。
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/bin

3. 最後に、以下のコマンドを実行して、eksctl が正常にインストールされたことを確認します。

eksctl version

以下の出力は、eksctl が正常にインストールされたことを確認します。

Checking the eksctl CLI tool version

eksctl が初めての場合、以下のコマンドを実行して、すべてのサポートされている eksctl コマンドとその使用法のリストを取得できます。

eksctl --help
Previewing the eksctl help page

EKSクラスタのプロビジョニング

eksctl を構成したので、今度は eksctl コマンドを使用して最初の EKS クラスタをプロビジョニングできます。

以下の eksctl コマンドを実行して、最初のクラスタを作成し、以下の操作を実行します:

  • dev という名前の3ノードのKubernetesクラスタを作成し、1つのノードタイプを t3.micro として、リージョンを us-east-1 とします。
  • EKS によって管理されるこのノードグループ用に最小 1 ノード (--nodes-min 1) および最大 4 ノード (--nodes-max 4) を定義します。このノードグループの名前は standard-workers です。
  • 名前が standard-workers のノードグループを作成し、standard-workers ノードグループ用のマシンタイプを選択します。
eksctl create cluster --name dev --version 1.21 --region us-east-1 --nodegroup-name standard-workers --node-type t3.micro --nodes 3 --nodes-min 1 --nodes-max 4 --managed
Provisioning your EKS Cluster

2. コマンドで実行されるアクションを確認するために、CloudFormation ダッシュボードに移動します。 eksctl create cluster コマンドは、CloudFormation を使用して AWS アカウントでインフラストラクチャをプロビジョニングします。

以下のように、eksctl-dev-cluster CloudFormationスタックが作成されています。このプロセスには15分以上かかる場合があります。

Previewing the eksctl-dev-cluster stack.

3. 現在、EKSダッシュボードに移動し、devという名前のクラスタがプロビジョニングされていることがわかります。 dev ハイパーリンクをクリックして dev のEKSクラスタダッシュボードにアクセスしてください。

Navigating to the dev EKS Cluster dashboard.

以下に、dev のEKSクラスタの詳細が表示されます。ノード名インスタンスタイプノードグループ、およびステータス

Previewing the dev EKS Cluster dashboard.

4. EC2ダッシュボードに切り替えると、4つのノードが実行されていることがわかります。AWSアカウントでt3.microの役割を持つ3つのワーカーノードと1つのマスターノードがあります。

Previewing the EC2 dashboard.

5. 最後に、以下のコマンドを実行して、クラスタのエンドポイント、証明書、および資格情報を使用してkubectl構成を更新します。 update-kubeconfig

aws eks update-kubeconfig --name dev --region us-east-1
Updating kubectl config

EKSクラスタにアプリケーションを展開する

EKSクラスタを作成し、完璧に稼働していることを確認しました。しかし、現時点ではEKSクラスタはただの一角に座っています。このデモでは、EKSクラスタを使用してNGINXアプリケーションを展開します。

1.以下のyumコマンドを実行して、gitをインストールします。インストール中にすべてのプロンプトを自動的に受け入れます(-y

sudo yum install -y git
Installing Git

2.次に、以下のgit cloneコマンドを実行して、GitHubリポジトリから構成ファイルを現在のディレクトリにクローンします。これらのファイルを使用して、ポッド上にNGINXデプロイメントを作成し、ロードバランサー(ELB)を作成します。

git clone https://github.com/Adam-the-Automator/aws-eks-cli.git
Cloning the configuration files

3.以下のコマンドを実行して、ata-elkディレクトリに移動し、NGINXのためのサービス(./nginx-svc.yaml)を作成します。

# ata-elkディレクトリに移動
cd ata-elk
# ./nginx-svc.yamlの構成をポッドに適用
kubectl apply -f ./nginx-svc.yaml
Creating a service for NGINX

4.次に、kubectl get serviceを実行してNGINXサービスの状態を確認します。

kubectl get service

以下に示すように、サービスタイプはロードバランサーであり、Kubernetesはサービス(nginx-svc)を作成しました。これがNGINXデプロイメントです。また、EKSによって作成されたロードバランサーの外部DNSホスト名もEXTERNAL IP列に表示されます。

後でロードバランサーをテストするために、ロードバランサーの外部DNSホスト名をメモしておいてください。

Checking the status of your NGINX

5.以下のkubectlコマンドを実行してNGINXポッドをデプロイします。

kubectl apply -f ./nginx-deployment.yaml
Deploying the NGINX pods

6. 以下のkubectl getコマンドを実行して、NGINX deploymentおよびNGINX podのステータスを確認します。

kubectl get deployment
kubectl get pod

以下の出力で確認できるように、デプロイメントには3つのポッドがあり、すべてが実行されています。

Checking the status of the NGINX deployment and pods

7. 次に、kubectl get nodeコマンドを実行してワーカーノードのステータスを確認します。

kubectl get node
Check the status of your worker nodes

8. そして、以下のcurlコマンドを実行してロードバランサーをテストします。<LOAD_BALANCER_DNS_HOSTNAME>を以前にメモしたDNS名で置き換えてください(ステップ5)。

curl "<LOAD_BALANCER_DNS_HOSTNAME>"

NGINXのウェルカムページが表示されます。以下の出力は、ロードバランサーが正常に動作し、NGINXポッドにアクセスできることを確認しています。

Checking your load balancer

9. 最後に、ロードバランサーのDNS名を新しいブラウザタブにコピーして貼り付けます。

これにより、NGINXからのウェルカムページが表示され、アプリケーションが動作していることが確認できます。

Checking your load balancer with a browser

高可用性のKubernetesコントロールのテスト

クラスターが実行されているので、Kubernetesコントロールプレーンが高可用性かどうかをテストします。アプリケーションの稼働時間はこの機能に依存しています。コントロールプレーンが動作しない場合、アプリケーションはダウンし、ユーザーにサービスを提供できません。

高可用性のKubernetesコントロール機能を使用すると、アプリケーションの可用性が向上します。この機能をテストするために、EKSのワーカーノードを停止して、Kubernetesが新しいノードを起動して失敗したノードを置き換えるかどうかを確認します。

1. EC2ダッシュボードで、EKSのワーカーノードインスタンスをすべて停止します。

Stopping all of your EKS worker node instances

2. 次に、ワーカーノードの状態を確認するために次のコマンドを実行します。

kubectl get node

様々な状態が表示されます。たとえば、PendingRunning、そしてTerminatingなどです。なぜなら、すべてのワーカーノードを停止しようとすると、Kubernetesは障害を検出し、すぐに別のノードを起動します。

Checking the status of the worker node

3. 今、kubectl get podコマンドを実行して、高可用性のあるKubernetesコントロール機能をテストします。

kubectl get pod

出力を見ると、Running状態の新しいポッドが3つあることがわかります(年齢で識別)。これらの新しいポッドは、意図したとおりに高可用性のあるKubernetesコントロール機能が動作していることを示しています。

Checking the status of the pods

4. 以下のkubectl get serviceコマンドを実行して、利用可能なすべてのサービスをリストします。

以下に示すように、Kubernetesは新しいサービスを作成し、ロードバランサーのDNS名が異なることがわかります。kubectl get service

kubectl get service
Kubernetes has created a new service

5. 最後に、ロードバランサーのDNS名をブラウザにコピーして貼り付けます。これにより、「EKSクラスターへのアプリケーションのデプロイ」セクションの最後の手順と同じく、NGINXからのウェルカムページが表示されます。

結論

このチュートリアルを通じて、EKSクラスターを作成し、コンテナからNGINXサービスをデプロイし、高可用性のあるコントロールプレーン機能をテストする方法を学びました。

この時点で、AWS環境でEKSクラスターを作成する方法について理解が深まったはずです。

あなたの次のステップは何ですか?おそらく、AWS上でDockerとK8sを使用してNodeJSアプリをデプロイする方法を学ぶことですか?

Source:
https://adamtheautomator.com/aws-eks-cli/