【#1】個人AWSアカウント上でAWS EKS(Kubernetes)環境構築してみた!

2024/12/15に公開

背景

業務でAWS EKS(Kubernetes)を利用することとなりました。
今までの経歴上、AWS EKSを利用してこなかったため、簡単な課題をこなし事前に知識習得を行った際の備忘録を記述します。

業務上SRE的なことも行う必要があるため、初回構築後、複数回にわけて、デプロイの自動化など構成改善の実践内容について記事にまとめていく予定です。

可能な限り小規模な構成で、AWS無料利用枠内に収まるように進めていきます。

対象読者

・KubernetesやAWS EKSへ入門したい人

今回の実施内容(概要)

・ローカル環境でkubectleksctlを実行するための環境作成
⇒UbuntuでDockerコンテナを立ち上げて環境を作成します。

Podを立ち上げWebサーバー(nginx)をデプロイし、接続確認
⇒立ち上げっぱなしだと料金がかかってしまうため、接続確認後、作成したリソースを削除します。

ローカル環境

・Ubuntu-24.04
・Docker Engine 27.4.0
・Docker compose 2.31.0

各種用語

EKSとKubernetesについて

Kubernetes(K8s)は、コンテナ化されたアプリケーションを自動デプロイ、スケーリング、管理するためのオープンソースのプラットフォームです。複数のマシンにわたるコンテナのオーケストレーションを効率化し、可用性や拡張性を向上させます。
主要コンポーネントには、PodServiceDeploymentNodeなど(ワークロードリソースと呼ばれています。)があり、クラウド環境やオンプレミスで動作します。リソース情報が定義された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は、PodReplicaSetの管理を自動化するためのリソースです。アプリケーションのデプロイ、スケーリング、ローリングアップデート、ロールバックなどを簡単に行えます。安定した状態のPodを維持する仕組みで、アプリケーションの継続的な運用をサポートします。

実施内容

1.環境構築

Ubuntuで実行環境用のコンテナを作成します。

環境構築用ファイル作成

まずはDockerfileを作成します。:

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を作成します。:

docker-compose.yml
version: "3"
services:
  aws-cli-container:
    build: ./
    container_name: aws-cli-container
    volumes:
      - .:/work
    env_file:
      - .env

.envファイルにAWSクレデンシャル情報を記載しておくと、aws cliへのログインがスムーズになるため、事前に作成しておきましょう。

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

コンテナ内で下記コマンドを実行し、バージョン情報が表示されれば、kubectleksctlのインストールできていることになります。

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等と同じディレクトリに配置します。

nginx-deployment.yaml
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による自動デプロイする構成などを実践し記事にまとめていこうと思います。

最後までお読みいただき、本当にありがとうございました。

参考文献

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html

https://kubernetes.io/ja/docs/tutorials/services/connect-applications-service/

https://zenn.dev/tennashi/books/53cb6f70e6a095/viewer/container

https://zenn.dev/moko_poi/articles/2dcf690c5435c9

Discussion