📝

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

kubectlチートシート | Kubernetes

  • すべての名前空間上にあるすべての Pod のリストを表示

Namespace(名前空間) | Kubernetes

  • 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 のデフォルトページを表示してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion