📝
CloudShell から EKS クラスターを作成して nginx のデフォルトページを表示してみた
チュートリアルレベルの内容です。
01. ツールのインストール
コマンドラインツール(kubectl) | Kubernetes
- kubectl: Kubernetes クラスターを操作するためのコマンドラインツール
eksctl - The official CLI for Amazon EKS - eksctl
- eksctl: EKS クラスターを作成・管理するツール
# kubectl のインストール
$ curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.3/2023-11-14/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin
$ kubectl version --client
Client Version: v1.28.3-eks-e71965b
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
# eksctl のインストール
$ 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/local/bin
$ eksctl version
0.210.0
EKS クラスターの作成
Kubernetes クラスターとは何ですか? - K8s クラスターの説明 - AWS
- クラスター: ポッドが実行されている 1 つ以上のノードのグループ
- ノード: ポッドを実行するマシン (EC2 インスタンスなど)
- ポッド: 1 つ以上のコンテナを含むユニット
- コントロールプレーン: AWS 側によって管理されている
- ノードとポッドを管理する
- コントロールプレーンに含まれる要素
- クラスター内およびクラスターへの通信を管理する Kubernetes API サーバー (kube-apiserver)
- クラスターの永続状態を記録するストレージ (etcd)
- ノードとそれに続くポッドの Kubernetes 資源を管理するためのスケジューラー (kube-scheduler)
# EKS クラスターの作成
$ eksctl create cluster \
--name my-first-eks-cluster \
--nodegroup-name my-nodes \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 3 \
--managed
上記コマンドによって以下のリソースを含む CloudFormation スタックが作成されます。
- EKSクラスター
- VPC
- サブネット
- セキュリティグループ
- インターネットゲートウェイ
- NAT ゲートウェイ
- ルートテーブル
- EIP
- IAM ロール
- EC2 インスタンス
- Auto Scaling グループ
デプロイ完了まで 15 分 ~ 20 分かかります。
03. クラスターの動作確認
kubectl cluster-info | Kubernetes
- コントロールプレーンがどこにあるのかを確認
$ kubectl cluster-info
Kubernetes control plane is running at https://84A3A01470BCA26C35F2C1DBCC37B6B0.gr7.ap-northeast-1.eks.amazonaws.com
CoreDNS is running at https://84A3A01470BCA26C35F2C1DBCC37B6B0.gr7.ap-northeast-1.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
クラスターのトラブルシューティング | Kubernetes
- ノードの状態を確認
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-37-60.ap-northeast-1.compute.internal Ready <none> 2m26s v1.32.3-eks-473151a
ip-192-168-9-11.ap-northeast-1.compute.internal Ready <none> 2m26s v1.32.3-eks-473151a
- すべての名前空間上にあるすべての Pod のリストを表示
- kube-system: Kubernetes が使用するシステム用の名前空間
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system aws-node-4jsnd 2/2 Running 0 2m33s
kube-system aws-node-4pmzd 2/2 Running 0 2m33s
kube-system coredns-6d78c58c9f-nlbzh 1/1 Running 0 4m38s
kube-system coredns-6d78c58c9f-zznw2 1/1 Running 0 4m38s
kube-system kube-proxy-bz56t 1/1 Running 0 2m33s
kube-system kube-proxy-xsdvx 1/1 Running 0 2m33s
kube-system metrics-server-7f76d4758d-45dkq 1/1 Running 0 4m39s
kube-system metrics-server-7f76d4758d-5jzlf 1/1 Running 0 4m39s
04. アプリケーションのデプロイ
kubectl create deployment | Kubernetes
- イメージを指定してデプロイ
- 今回は nginx のイメージを指定
- Kubernetes が Pod を作成し、Pod の中で nginx コンテナを起動
$ kubectl create deployment nginx-app --image=nginx:latest
deployment.apps/nginx-app created
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 1/1 1 1 22s
クラスター内のアプリケーションにアクセスするために外部IPアドレスを公開する | Kubernetes
- クラスター内のアプリケーションにアクセスするために外部 IP アドレスを公開
- 今回はロードバランサーを使用する方法を指定
- ポートは 80 番ポートを指定
$ kubectl expose deployment nginx-app --type=LoadBalancer --port=80
service/nginx-app exposed
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 9m52s
nginx-app LoadBalancer 10.100.240.172 aa770658b97db4a2d9fa070090e6b2f9-941636015.ap-northeast-1.elb.amazonaws.com 80:32597/TCP 5s
05. アプリケーションへのアクセス確認
ロードバランサーの URL にアクセスして nginx のデフォルトページを取得できれば OK です。
$ curl http://aa770658b97db4a2d9fa070090e6b2f9-941636015.ap-northeast-1.elb.amazonaws.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ブラウザからのアクセスでも確認できます。

06. クリーンアップ
$ kubectl delete service nginx-app
$ kubectl delete deployment nginx-app
$ eksctl delete cluster --name my-first-eks-cluster
まとめ
今回は CloudShell から EKS クラスターを作成して nginx のデフォルトページを表示してみました。
どなたかの参考になれば幸いです。
参考資料
- コマンドラインツール(kubectl) | Kubernetes
- eksctl - The official CLI for Amazon EKS - eksctl
- Kubernetes クラスターとは何ですか? - K8s クラスターの説明 - AWS
- kubectl cluster-info | Kubernetes
- クラスターのトラブルシューティング | Kubernetes
- kubectlチートシート | Kubernetes
- Namespace(名前空間) | Kubernetes
- kubectl create deployment | Kubernetes
- クラスター内のアプリケーションにアクセスするために外部IPアドレスを公開する | Kubernetes
Discussion