【#1】個人AWSアカウント上でAWS EKS(Kubernetes)環境構築してみた!
背景
業務でAWS EKS(Kubernetes)を利用することとなりました。
今までの経歴上、AWS EKSを利用してこなかったため、簡単な課題をこなし事前に知識習得を行った際の備忘録を記述します。
業務上SRE的なことも行う必要があるため、初回構築後、複数回にわけて、デプロイの自動化など構成改善の実践内容について記事にまとめていく予定です。
可能な限り小規模な構成で、AWS無料利用枠内に収まるように進めていきます。
対象読者
・KubernetesやAWS EKSへ入門したい人
今回の実施内容(概要)
・ローカル環境でkubectl
、eksctl
を実行するための環境作成
⇒UbuntuでDockerコンテナを立ち上げて環境を作成します。
・Pod
を立ち上げWebサーバー(nginx)をデプロイし、接続確認
⇒立ち上げっぱなしだと料金がかかってしまうため、接続確認後、作成したリソースを削除します。
ローカル環境
・Ubuntu-24.04
・Docker Engine 27.4.0
・Docker compose 2.31.0
各種用語
EKSとKubernetesについて
Kubernetes(K8s)は、コンテナ化されたアプリケーションを自動デプロイ、スケーリング、管理するためのオープンソースのプラットフォームです。複数のマシンにわたるコンテナのオーケストレーションを効率化し、可用性や拡張性を向上させます。
主要コンポーネントには、Pod
、Service
、Deployment
、Node
など(ワークロードリソースと呼ばれています。)があり、クラウド環境やオンプレミスで動作します。リソース情報が定義されたyaml形式ファイル(マニフェスト)を読み込むことでデプロイされます。
AWS EKS(Elastic Kubernetes Service)は、AWSが提供するマネージド型のKubernetesサービスです。Kubernetesクラスターのセットアップや管理をAWSが代行し、アプリケーションデプロイの効率化やスケーリングを簡単に実現できます。他のAWSサービス(EC2、Fargate、IAMなど)とシームレスに統合できるのが特徴です。
kubectlやeksctlについて
ワークロードリソースのデプロイはkubectl
コマンドやeksctl
コマンドを用いて行うことができます。
kubectl
kubectl
は、Kubernetesクラスターを管理するためのコマンドラインツールです。リソースの作成、更新、削除、状態確認などの操作をクラスター内で実行できます。Kubernetes APIと通信し、マニフェストファイルやコマンドを介してクラスター全体を制御します。
eksctl
eksctl
は、AWS EKSクラスターの作成や管理を簡単に行えるコマンドラインツールです。クラスターのセットアップからノードグループの作成、削除、設定変更までを自動化します。YAMLファイルを使った設定管理や、AWS CLIやCloudFormationと連携して操作を効率化できるのが特徴です。
ワークロードリソースについて
Pod
Pod
は、コンテナを動作させるための最小単位のリソースです。1つ以上のコンテナと、そのコンテナが共有するストレージやネットワークを含み、同じノード上で動作します。通常、1つのアプリケーションやサービスのインスタンスを表し、スケーリングやデプロイの基本単位となります。
Service
Service
は、クラスター内で稼働するPod
に対する永続的なネットワークアクセスを提供するリソースです。Podは動的に作成・削除されるため、Service
が一貫したアクセスを可能にします。ロードバランシングやDNS名の割り当てを行い、アプリケーションの可用性と通信の安定性を確保します。
ReplicaSet
ReplicaSet
は、指定した数のPod
が常に稼働するように管理するリソースです。Pod
の障害時に自動で再作成したり、スケール操作でPod
数を調整する役割を持ちます。Deployment
が内部的に利用する主要コンポーネントの一つです。
Deployment
Deployment
は、Pod
やReplicaSet
の管理を自動化するためのリソースです。アプリケーションのデプロイ、スケーリング、ローリングアップデート、ロールバックなどを簡単に行えます。安定した状態のPod
を維持する仕組みで、アプリケーションの継続的な運用をサポートします。
実施内容
1.環境構築
Ubuntuで実行環境用のコンテナを作成します。
環境構築用ファイル作成
まずはDockerfile
を作成します。:
# ベースイメージ
FROM python:3.9
# 前提パッケージのインストール
RUN apt-get update && apt-get install -y less vim curl unzip sudo
# aws cli v2 のインストール
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN sudo ./aws/install
# kubectl のインストール
RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl && \
rm kubectl
# eksctl のインストール
RUN curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
RUN sudo mv -v /tmp/eksctl /usr/local/bin
# 作業ディレクトリの設定
WORKDIR /work
# デフォルトのコマンドを設定(bashを起動)
CMD ["/bin/bash"]
次にdocker-compose.yml
を作成します。:
version: "3"
services:
aws-cli-container:
build: ./
container_name: aws-cli-container
volumes:
- .:/work
env_file:
- .env
.env
ファイルにAWSクレデンシャル情報を記載しておくと、aws cliへのログインがスムーズになるため、事前に作成しておきましょう。
AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID]
AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_ACCESS_KEY]
AWS_DEFAULT_REGION=ap-northeast-1
AWS_DEFAULT_OUTPUT=json
[YOUR_ACCESS_KEY_ID]、[YOUR_SECRET_ACCESS_KEY]にはそれぞれ自身のAWS IAMユーザのACCESS_KEY_ID、SECRET_ACCESS_KEYを入力してください。
コマンドを実行し環境構築
ここまでで作成したファイルをUbuntu上の同一ディレクトリに配置し、下記コマンドを実行していきます。
下記コマンドでdocker-compose.yml
を実行し、コンテナイメージのビルド、コンテナの作成を行います。
docker compose up
下記コマンドでコンテナを起動し、コンテナの中に入ります。
docker compose run --rm aws-cli-container /bin/bash
コンテナ内で下記コマンドを実行し、バージョン情報が表示されれば、kubectl
とeksctl
のインストールできていることになります。
kubectl version --client
eksctl version
2.EKSクラスターの作成
2-1.EKSクラスターを作成
下記コマンドを実行し、EKSクラスターを作成します。
※クラスターが作成されるまでに15分ほどかかります。
eksctl create cluster --name my-eks-cluster --region ap-northeast-1
--name
オプションで作成するEKSクラスターの名前を設定します。今回は「my-eks-cluster」という名前でクラスターを立ち上げます。
--region
オプションでどのリージョンにEKSクラスターを立ち上げるかを指定します。今回は東京リージョンを指定します。
AWSマネージメントコンソールへログインし、クラスターが作成されたことを確認します。
ちなみに、eksctl create cluster
コマンドを実行すると、内部ではCloudFormationのスタックが自動的に生成され、CloudFormationスタックによって各種関連AWSリソースが作成されます。
2-2.AWS EKSクラスターをkubectlに登録
AWS EKSにクラスターを作成した場合、後述で利用するkubectl
コマンドでクラスターに接続できるように設定する必要があります。
aws eks update-kubeconfig --region ap-northeast-1 --name my-eks-cluster
--name
オプションにkubectlで利用したいEKSクラスター名(先ほど作成したEKSクラスター名)を記述します。
3.Webサーバのデプロイ
3-1.ウェブサーバーのマニフェストを作成
次の内容をnginx-deployment.yaml
として保存し、Ubuntu上のDockerfile
等と同じディレクトリに配置します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
3-2.Webサーバのデプロイコマンド実行
下記コマンドを実行し、作成したnginx-deployment.yaml
の内容通りにデプロイを実行します。
kubectl apply -f nginx-deployment.yaml
ここまでで、WebサーバのPod
が作成されます。
4.アクセス確認
4-1.作成されたPod情報を確認
下記コマンドを実行し、作成されたWebサーバ用のPod
の一覧を表示します。
kubectl get pods -o wide
-o wide
オプションを付与すると各Pod
のIPアドレスも表示させることができます。
Pod
が二つ作成されているかと思いますので、どちらか一方のPod名を控えておきます。
4-2.手元でWebサーバへアクセス確認
kubectl port-forward
コマンドでPodに直接アクセスできるようになります。
kubectl port-forward pod/[アクセスしたいPod名] 8080:80
ローカルのポート8080をKubernetes内の指定Pod
のポート80に転送するコマンドです。これにより、ブラウザやツールからhttp://localhost:8080
を使用してPod内のサービスにアクセスできます。
別のUbuntuコンソールを立て、立ち上げていたコンテナに入り、以下のようにcurl
で`nginxのWelcomeページが見れるかを確認します。
curl http://localhost:8080
HTMLページが返ってくるかと思います。
余談 ログの確認
kubectl logs
コマンドでPod
のログも確認することができます。
curlによるアクセス確認を行ったので、そのログが残っているはずです。
kubectl logs [Pod名]
5.クリーンアップ
5-1.作成したEKSクラスターを削除
ここまでで一通り、AWS EKS上にPod作成するところからアクセス確認まで完了しました。
EKSクラスターやPod
を立ち上げたままにしてしまうと課金されてしまうため、後片付けとして、作成したEKSクラスターを削除します。
eksctl delete
でEKSクラスターの削除ができます。
eksctl delete cluster --name my-eks-cluster
※クラスターが削除されるまでに数分かかります。
5-2.クラスターが削除されたことを確認
AWSマネージメントコンソールへアクセスし、削除したはずのクラスターが残っていないことを確認します。
最後に
今回は、ローカル環境にAWS EKSを操作するための環境構築、AWS EKSのクラスター作成、Pod
へのアクセス確認を行いました。
今後は、IaCによりリソース作成する構成や、CI/CDによる自動デプロイする構成などを実践し記事にまとめていこうと思います。
最後までお読みいただき、本当にありがとうございました。
参考文献
Discussion