Elastic Kubernetes Service(EKS)は、AWSでホストされるマネージドKubernetesサービスです。
EKSを使用する主な理由は、ポッドやノードなどを管理する負担を取り除くことです。AWSでKubernetesを実行するには、現在、多くの技術的専門知識が必要であり、多くの組織の操舵室の外にあることがよくあります。 EKSを使用すると、必要なインフラストラクチャはAmazonの「社内」チームによって管理され、APIまたは標準のkubectlツールのいずれかを介して使用できる完全に管理されたKubernetesエンジンをユーザーに提供します。
EKSは、名前空間、セキュリティ設定、リソースの割り当てと許容範囲、デプロイ戦略、オートスケーラーなど、Kubernetesのすべての機能をサポートします。 EKSを使用すると、独自のコントロールプレーンを実行できますが、AWS IAMと統合できるため、APIへの独自のアクセス制御を維持できます。
EKSは、Elastic Container Service for Kubernetes(EKS)と呼ばれるAmazonの既存の「Kubernetes-as-a-Service」ソリューションの上に構築されました。これは、AWSクラウドでのKubernetesクラスターのデプロイ、管理、運用を簡素化するAWSマネージドサービスです。
AWSでKubernetesを実行している場合は、コントロールプレーン(つまり、マスターノードとワーカーノード)を管理する必要があります。また、api-serverが高可用性であり、フォールトトレラントであることなどを確認する必要があります。
EKSは、コントロールプレーンを管理する負担を軽減しました。これにより、Kubernetesワークロードの実行に集中できるようになりました。コントロールプレーンはAmazon(EKS)によって管理されるため、マイクロサービスなどのステートレスアプリケーションで最も一般的に使用されます。
このガイドでは、EKSを使用してAWSでKubernetesクラスタを作成する方法を学びます。 Kubernetesクラスターの管理ユーザーを作成する方法を学習します。また、アプリをクラスターにデプロイする方法についても学習します。最後に、クラスターをテストして、すべてが正しく機能していることを確認します。
始めましょう!
- AWSアカウント。
- この記事は、KubernetesとAWSに精通していることを前提としています。そうでない場合は、このガイドを開始する前に、両方のドキュメントを確認してください。
クラスタの管理者ユーザーの作成から始めましょう。
1. AWSコンソールにログインし、IAMに移動します。 ユーザーをクリックします>ユーザーを追加します。
2.次の画面で、 adminのようなユーザー名を入力します 。 アクセスキー-プログラムによるアクセスを選択します。 次へをクリックします :許可
3.次の画面で、[既存のポリシーを直接添付する]を選択します 。 AdministratorAccessをクリックします 。 次へをクリックします :タグ 。
AdministratorAccess policyは、Amazon Elastic Container Service(ECS)に組み込まれているポリシーです。すべてのECSリソースとECSコンソールのすべてのアクションへのフルアクセスを提供します。このポリシーの主な利点は、AWSEKSサービスにアクセスするための追加の特権を持つ追加のユーザーを作成または管理する必要がないことです。
管理ユーザーは、EC2インスタンス、CloudFormationスタック、S3バケットなどを作成できます。この種のアクセスを誰に許可するかについては十分に注意する必要があります。
3.次の画面で、[次へ]をクリックします :レビュー
4.次の画面で、[作成]をクリックします ユーザー 。
5.次の画面で、緑色の成功が表示されます。 メッセージ。アクセスキーID および
秘密のアクセスキー この画面にも表示されます。後でCLIツールを構成するためにこれらのキーが必要になるため、これらのキーを別の場所に書き留めてください。
EC2インスタンスの作成
管理ユーザーを作成したので、Kubernetesマスターノードとして使用するEC2インスタンスを作成しましょう。
1.検索ボックスにEC2と入力します。 EC2リンクをクリックします。 インスタンスの起動をクリックします 。
2. Amazon Linux 2 AMI(HVM)を選択します EC2インスタンス用。このAmazonLinuxAMIを使用して、Kubernetesや、kubectl!、dockerなどのその他の必要なツールを後で簡単にインストールできるようにします。
3.次の画面で、[次へ]をクリックします :インスタンスの構成 詳細strong> 。
3.次の画面で、パブリックIPの自動割り当てを有効にします オプション。サーバーはプライベートサブネット内にあるため、外部からアクセスすることはできません。 Elastic IPアドレスをインスタンスに関連付けることで、サーバーにパブリックIPアドレスを与えることができます。これにより、EC2とELKにアクセスできるようになります。 [次へ]をクリックします :ストレージ 。
3.次の画面で、[次へ:タグを追加]をクリックします> 次へ:セキュリティグループを構成する 。
4.次の画面で、[確認して起動]をクリックします>起動 。
5.キーペアダイアログが表示されます。 新しいキーペアを作成をクリックします 。名前を付けてから、.pemファイルをダウンロードして安全な場所に保存します。 起動をクリックします インスタンス 。
EC2インスタンスを作成したので、そのためのクライアントをインストールする必要があります。 AWSの用語では、クライアントはクラウドオブジェクトを管理できるコマンドラインツールです。このセクションでは、コマンドラインインターフェイス(CLI)ツールを構成する方法を学習します。
1.EC2ダッシュボードに移動します。新しいEC2インスタンスが実行されていることを確認する必要があります。そうでない場合は、インスタンスが最初に起動し、5分待ってから再試行する可能性があります。インスタンスが実行されたら、[接続]をクリックします 。
2.次の画面で、[接続]をクリックします 。
ブラウザでインタラクティブなSSHセッションが表示されます。 SSHを使用すると、リモートサーバーに安全に接続して操作できます。インタラクティブSSHセッションでは、EKSとKubernetesのコマンドラインツールをEC2インスタンスに直接インストールできます。
SSHセッションにログインしたら、最初に行う必要があるのは、aws-cliのバージョンを確認することです。これは、AWSCLIの最新バージョンを使用していることを確認するためです。 AWS CLIは、クラスターの構成、管理、および操作に使用されます。
バージョンが古くなっている場合は、クラスターの作成プロセス中に問題やエラーが発生する可能性があります。バージョンが2.0未満の場合は、アップグレードする必要があります。
3.次のコマンドを実行して、CLIのバージョンを確認します。
aws --version
以下の出力でわかるように、バージョン 1.18.147を実行しています。 aws-cliの 、これは非常に時代遅れです。 CLIを利用可能な最新バージョンにアップグレードしましょう。これを書いている時点ではv2+です。
4.以下のコマンドを実行して、利用可能な最新バージョンのAWSCLIをEC2インスタンスにダウンロードします。 curlは指定されたURLからファイルをダウンロードし、-oは選択した名前を付け、「awscli-exe-linux-x86_64.zip」はダウンロードされるファイルです
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
5.ダウンロードが完了したら、以下のコマンドを実行して、ダウンロードしたファイルの内容を現在のディレクトリに抽出します。
unzip awscliv2.zip
6.次に、which awsコマンドを実行して、AWSCLIの最新バージョンへのリンクを設定します。このコマンドは、環境のPATHのどこにあるかを知らせてくれるので、どのディレクトリからでも実行できます。
which aws
以下の出力でわかるように、古いAWSCLIは/ usr / bin / awsにあります。 。
7.次に、いくつかのパラメーターを指定してupdateコマンドを実行し、aws-cliを設定する必要があります。最初のパラメータ./aws/installは、AWSCLIを現在のディレクトリにインストールするのに役立ちます。 2番目のパラメーター--bin-dirは、環境のPATHのどこにAWS CLIが配置されるかを示し、3番目のパラメーター--install-dirは、bin-dirからの相対パスです。このコマンドは、すべてのパスが最新であることを確認します。
sudo ./aws/install --bin-dir /usr/bin --install-dir /usr/bin/aws-cli --update
8. aws --versionコマンドを再実行して、最新バージョンを使用していることを確認します。
aws --version
現在インストールされているAWSCLIバージョンが表示されます。以下の出力でわかるように、現在AWSCLIのv2.4.7を使用しています。これは最新バージョンであり、次の手順を構成するときに問題は発生しません。
9.環境が適切に設定されたので、AWSCLIを介して通信するAWSアカウントを設定します。次のコマンドを実行して、現在構成されているアカウント環境変数と、一緒に使用するエイリアスを一覧表示します。
aws configure
これにより、現在設定されているすべてのAWSアカウント環境変数が表示されます。以下の出力にこのようなものが表示されるはずです。 AWS CLIが必要なアカウントと通信するには、いくつかの設定パラメータを設定する必要があります。以下のコマンドを実行すると、設定ウィザードが表示され、AWSアカウントが設定されます。
- AWSアクセスキーID[なし]:前にメモしたAWSアクセスキーを入力します。
- AWSシークレットアクセスキー[なし]:前にメモしたAWSシークレットアクセスキーを入力します。
- また、EKSクラスターを配置するデフォルトのリージョン名を指定する必要があります。目的のEKSクラスターが配置され、最も近いAWSリージョンを選択する必要があります。このチュートリアルでは、地理的な位置が近く、チュートリアルの次のステップで使いやすいため、us-east-1を選択しました。
- デフォルトの出力形式[なし]:後で構成ファイルを表示するのに非常に役立つため、デフォルトの出力形式としてjsonを入力します。
これで、AWSCLIツールがセットアップされました。 EKSクラスターと対話できるように、ご使用の環境でkubectlという名前のKubernetesCLIツールを構成するときが来ました。
Kubectlは、Kubernetesのコマンドラインインターフェイスです。 Kubectlを使用すると、Kubernetesクラスターで実行されているアプリケーションを管理できます。 Kubectlは、LinuxおよびMacOSシステムにデフォルトでインストールされていません。 Kubernetes Webサイトの指示に従って、他のシステムにKubectlをインストールできます。
10.以下のコマンドを実行して、kubectlバイナリをダウンロードします。バイナリは、拡張子が「.bin」のコンピュータファイルであり、特定の種類のコンピュータでのみ実行可能です。これは、さまざまな種類のコンピューターがファイルを共有するための簡単な方法です。 kubectlバイナリはプラットフォームに依存しないため、kubectlバイナリを使用します。 LinuxやMacOSなど、Unixライクなオペレーティングシステムを実行できるすべてのシステムで動作します。
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.16.8/2020-04-16/bin/linux/amd64/kubectl
11.以下のchmodコマンドを実行して、kubectlバイナリを実行可能にします。 chmodコマンドは、ファイルまたはディレクトリのアクセス許可を変更するために使用されるUnixおよびLinuxコマンドです。 Linuxのchmodコマンドは、8進数システムを使用して、各ユーザーの権限を指定します。これで、Kubectlをローカルマシンで使用できるようになりました。
chmod +x ./kubectl
12.以下のコマンドを実行して、$ HOME / binフォルダーにkubectlディレクトリーを作成し、それにkubectlバイナリーをコピーします。 mkdir -p $ HOME / binコマンドは、ホームディレクトリ内にbinサブディレクトリを作成します。 mkdirコマンドは、新しいディレクトリまたはフォルダを作成するために使用されます。 -pオプションは、新しいディレクトリに必要な親ディレクトリを自動的に作成するようにmkdirコマンドに指示します。 $ HOME / binは、ホームディレクトリのパスを格納する環境変数です。すべてのLinuxユーザーは、ファイルシステムに$ HOME/binディレクトリを持っています。 &&構文は、論理AND演算子と呼ばれます。複数のコマンドを同時に実行できるように、コマンドをグループ化するために使用されます。このコマンドが機能するために&&構文は必要ありませんが、ベストプラクティスとしてあります。
cp ./kubectl $ HOME / bin / kubectlコマンドは、ローカルのkubectlバイナリファイルをkubectlディレクトリにコピーし、ファイルの名前をkubectlに変更します。最後に、exportコマンドは、その内容を実行します。環境変数をシェルのメモリにエクスポートして、このシェルから実行されるすべてのプログラムで使用できるようにします。この場合、kubectlバイナリを見つけることができるように、kubectlディレクトリがどこにあるかをkubectlに通知する必要があります。
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
13.以下のkubectlversionコマンドを実行して、kubectlが正しくインストールされていることを確認します。 kubectl version --short --clientコマンドは、適切にフォーマットされた、人間が読める形式のKubernetesRESTAPI応答でkubectlバージョンの短縮バージョンを出力します。 --clientオプションを使用すると、kubectlはKubernetesのREST APIレスポンスのフォーマットされたバージョンを出力できます。これは、バージョン間で一貫しています。
--shortオプションは、基本情報をコンパクトな形式で提供するようにkubectlに指示します。この形式では、浮動小数点数は小数点以下1桁で、時間形式は--formatと同じです。次のような出力が表示されます。この出力は、kubectlが正常にインストールされ、正しいバージョンを使用していることを示しています。
このセクションで最後に行う必要があるのは、AmazonEKSクラスターを使用するようにeksctlcliツールを設定することです。 eksctl cliツールは、AmazonEKSクラスターを管理できるコマンドラインインターフェイスです。クラスタクレデンシャルの生成、クラスタ仕様の更新、ワーカーノードの作成または削除、その他多くのタスクを実行できます。
14.次のコマンドを実行して、eksctl cliツールをインストールし、そのバージョンを確認します。
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
eksctl version
EKSクラスターをプロビジョニングする
EC2とAWSCLIツールが用意できたので、最初のEKSクラスターをプロビジョニングできます。
1.以下のeksctlcreateclusterコマンドを実行して、1つのマスターノードと3つのコアノードを持つus-east-1リージョンにdevという名前のクラスターをプロビジョニングします。
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
eksctl create clusterコマンドは、この特定の設定に対してAmazonが推奨するデフォルトを使用して、us-east-1リージョンにEKSクラスターを作成し、すべての引数を引用符( ")または変数($ {})として渡します。
nameパラメーターは、このEKSクラスターの名前を定義するために使用されます。これは、便宜上のわかりやすいラベルです。 versionは、クラスタで使用するバージョンです。この例では、Kubernetes v1.21.2を使用しますが、他のオプションも自由に検討してください。
nodegroup-nameは、このクラスターがワーカーノードを管理するために使用する必要があるノードグループの名前です。この例では、シンプルに保ち、標準ワーカーを使用します。つまり、ワーカーノードにはデフォルトで1つのvCPUと3GBのメモリがあります。
ノードは、クラスターに必要なコアワーカーノードの総数です。この例では、3つのノードが要求されます。ノード-minおよびnodes-maxは、クラスターで許可されるノードの最小数と最大数を制御します。この例では、少なくとも1つ、ただし4つ以下のワーカーノードが作成されます。
2. CloudFormationコンソールに移動して、プロビジョニングの進行状況を監視できます。
以下に示すように、開発スタックが作成されていることがわかります。
3.開発スタックのハイパーリンク>イベントをクリックします。 作成プロセスに関連するイベントのリストが表示されます。プロビジョニングプロセスが完了するのを待ち(特定の状況によっては最大15分かかる場合があります)、CloudFormationコンソールでスタックのステータスを確認します。
4.スタックのプロビジョニングが完了するのを待った後、CloudFormationコンソールに移動すると、CREATE_COMPLETEの開発スタックステータスが表示されます。
次に、EC2コンソールに移動します。 EC2ダッシュボードに1つのマスターノードと3つのコアノードが表示されます。この出力は、EKSクラスターが正常にセットアップされたことを確認します。
5.以下のeksctlコマンドを実行して、クラスターIDやリージョンなどの開発クラスターの詳細を取得します。
eksctl get cluster
6.以下のawseksupdateコマンドを実行して、リモートワーカーノードのクレデンシャルを取得します。このコマンドは、クラスターに接続するすべてのコンピューターで実行する必要があります。 AWSAccessアクセスキーを使用せずにEKSKubernetesClusterにリモートでアクセスするために、kubectlのクレデンシャルをダウンロードします。
aws eks update-kubeconfig --name dev --region us-east-1
EKSクラスターへのアプリケーションのデプロイ
これで、EKSクラスターがプロビジョニングされました。最初のアプリケーションをEKSクラスターにデプロイしましょう。このセクションでは、サンプルアプリケーションとしてロードバランサーと一緒にnginxウェブサーバーをデプロイする方法を学習します。
1.以下のコマンドを実行して、システムにgitをインストールします。 GitHubからnginxWebサーバーコードのクローンを作成するには、gitが必要です。
sudo yum install -y git
2.以下のgitcloneコマンドを実行して、nginxWebサーバーコードをgithubから現在のディレクトリにクローンします。
git clone https://github.com/ata-aws-iam/htf-elk.git
3. cd htf-elkコマンドを実行して、作業ディレクトリをnginx構成ファイルディレクトリに変更します。
cd htf-elk
4. lsコマンドを実行して、現在のディレクトリ内のファイルを一覧表示します。
ls
nginxディレクトリに次のファイルがあります。
5.以下のcatコマンドを実行してnginx-deployment.yamlファイルを開くと、そのファイルに次の内容が含まれていることがわかります。
cat nginx-deployment.yaml
- apiVersion:apps/v1はコアKubernetesAPIです
- 種類:デプロイメントは、このファイル用に作成されるリソースの種類です。デプロイメントでは、ポッドはコンテナごとに作成されます。
- メタデータ:オブジェクトの作成時に使用するメタデータ値を指定します
- name:nginx-deploymentは、このデプロイメントの名前またはラベルです。値がない場合、デプロイメント名はディレクトリ名から取得されます。
- ラベル:アプリケーションのラベルを提供します。この場合、Elastic Load Balancing(ELB)を介したサービスルーティングに使用されます
- env:devは、文字列値によって定義される環境変数を記述します。これは、動的構成データをコンテナーに提供する方法です。
- spec:作成するレプリカの数を定義する場所です。各レプリカのベースにするプロパティを指定できます。
- レプリカ:3は、クラスター上にこのポッドの3つのレプリカントを作成します。これらは、ラベルセレクターと一致する使用可能なワーカーノードに配布されます。
- containerPort:80は、コンテナーからホスト上のポートにポートをマップします。この場合、コンテナのポート80をローカルマシンのポート30000にマップします。
6.以下のcatコマンドを実行して、サービスファイルnginx-svc.yamlを開きます。そのファイルには次の内容が含まれています。
cat nginx-svc.yaml
7.以下のkubectlapplyコマンドを実行して、Kubernetesクラスターにnginxサービスを作成します。 EKSクラスターがこのサービスのELBをプロビジョニングするのに数分かかります。
kubectl apply -f ./nginx-svc.yaml
8.以下のkubectlgetserviceを実行して、作成したnginxサービスの詳細を取得します。
kubectl get service
次の出力が得られます。 ClusterIPは、このサービスに割り当てられた内部kubernetesIPです。 LoadBalancer ELB名は、このサービスの一意の識別子です。 AWS上にELBを自動的に作成し、Webブラウザー(ドメイン名)やAPIクライアントなどの選択したサービスが到達できるこのサービスのパブリックエンドポイントをプロビジョニングします。選択したIPアドレスからアクセスできます。
a6f8c3cf0fe3a468d8828db6059ef05e-953361268.us-east-1.elb.amazonaws.comという名前のロードバランサーELBにはポート32406があり、これはコンテナポート80にマップされます。出力からロードバランサーELBのDNSホスト名を書き留めます。後でサービスにアクセスするために必要になります。
9.以下のkubectlapplyコマンドを実行して、クラスターのデプロイメントを適用します。
kubectl apply -f ./nginx-deployment.yaml
10. kubectl get deployを実行して、作成したnginxデプロイメントの詳細を取得します。
kubectl get deployment
11.以下のコマンドを実行して、ロードバランサーを介してnginxアプリケーションにアクセスします。ターミナル/コンソールにnginxからのウェルカムページが表示され、nginxアプリケーションが期待どおりに機能していることが確認されます。
curl "<LOAD_BALANCER_DNS_HOSTNAME>"
12.ロードバランサーのDNSホスト名をコピーしてブラウザーに貼り付けることにより、ブラウザーからnginxアプリケーションにアクセスすることもできます。
クラスターの高可用性(HA)機能の検証
クラスタが正常に作成されたので、HA機能をテストして、期待どおりに機能することを確認できます。
Kubernetesは、複製されたポッドまたはサービスを構築および管理するために連携して動作する特別なコントローラーを使用して、マルチノードデプロイメントをサポートします。これらのコントローラーには、Deployments、ReplicationController、Job、DaemonSetなどがあります。
デプロイメントコントローラーは、ポッドまたはサービスレベルでレプリケーションを制御するために使用されます。ポッドのリソースが不足すると、そのレプリケーションコントローラーのすべてのポッド(マスターノードで実行されているポッドを除く)が削除され、このポッドの新しいレプリカが作成されます。これにより、アプリケーション全体で非常に長い稼働時間を得ることができます。
1. EC2ダッシュボードに移動し、3つのワーカーノードをすべて停止します。
2.以下のコマンドを実行して、ポッドのステータスを確認します。さまざまなステータスが表示されます:終了中 、実行中 、および保留中 すべてのポッドに。すべてのワーカーノードを停止すると、EKSはすべてのワーカーノードとポッドを再起動しようとするためです。また、年齢(50代)で識別できるいくつかの新しいノードを確認できます。 。
kubectl get pod
新しいEC2インスタンスとポッドの起動には時間がかかります。すべてのワーカーノードが起動すると、すべての新しいEC2インスタンスが実行中に戻るのがわかります。 ステータス。
3.kubectlgetサービスを再実行します。 ESKがロードバランサーの新しいnginxサービスと新しいDNS名を作成することがわかります。
kubectl get service
新しいDNSをコピーしてブラウザに貼り付けます。再びNginxページからウェルカムを受け取ります。この出力は、HAが意図したとおりに機能していることを確認します。
この記事では、EKSクラスターのセットアップ方法を学習しました。また、すべてのワーカーノードを停止し、ポッドのステータスを確認することで、高可用性機能が機能することを確認しました。これで、kubectlを使用してEKSクラスターを作成および管理できるようになります。