🧭 はじめに
PJでコンテナ(EKS)上の基幹システム構築は経験しているんですが…
- ロールの関係上、業務では全然コンテナに触らない
- そもそも AWS周りのコンテナサービスに全然触ったことが無い!
ということで、
Japan AWS Jr.Championsの活動である 「コンテナ・サーバレス もくもく会」 に参加し、
AWSのコンテナサービスに触ったことをきっかけに、継続的にコンテナについて学んでみることにしました。
触った内容・学んだ内容を備忘として残しておければと思います。
(AWSコンテナ初学者の一助になれば良いなという想いもありつつ)
🛠️ 今回やること
-
eksctlでクラスターを構築して、簡単なアプリを動かしてみる
-
Kubernetesって何、、?EKSってどう動かすの、、、?状態ですが、
Chatgptにも聞きながら、とりあえずeksctlを使ってサクッと動かしてみます!!
ハンズオン実施概要
- ツールのインストール(kubectl / eksctl)
- クラスター作成
- 動作確認:Nginx を外部公開
- ECR イメージをデプロイ
ハンズオン実施
0. 前提
- AWS CLI セットアップ済み(
aws configure済) - Chocolatey 利用可(
choco --version) - ECR イメージが存在
1. ツールのインストール(kubectl / eksctl)
- まずはEKSを操作するためのeksctl及びKubernetesを操作するためのkubectlをインストールします。
choco install kubernetes-cli -y
choco install eksctl -y
kubectl version --client
eksctl version
aws --version
2. クラスター作成
- 続いて、EKS環境を構築していきます。
- eksctl create clusterコマンドを使うと、EKSクラスターのみならず、VPC・サブネット・IAM等の周辺リソースまで一気に構築してくれます。
eksctl create cluster `
--name demo-eks `
--region ap-northeast-1 `
--nodegroup-name demo-ng `
--node-type t3.small `
--nodes 2 `
--with-oidc `
--managed
コマンドの各オプションの意味
-
--name demo-eks
作成する EKS クラスタ名。kubeconfig の context 名にも反映されます。 -
--region ap-northeast-1
作成先の AWS リージョン。今回は東京。 -
--nodegroup-name demo-ng
1つ目の マネージドノードグループの名前。
ここに EC2 ワーカーノードが属します。 -
--node-type t3.small
ノードグループの EC2 インスタンスタイプ。 -
--nodes 2
起動ノード数(Desired)。既定ではmin=2 / max=2相当で固定。 -
--with-oidc
IAM OIDC プロバイダをクラスタに紐づけて作成。
これにより IRSA(ServiceAccount に IAM ロールを付与)が使えるようになります -
--managed
EKS マネージドノードグループとして作成。
ローリングアップデートや起動設定の管理を AWS が面倒見てくれるモードです
作られる主なリソースと構成
以下リソースが作成されていました。
-
EKS コントロールプレーン(マネージド)
- クラスタエンドポイント(通常は Public 有効)
- クラスタ用セキュリティグループ(Nodeとの通信を許可)
-
VPC(新規) と サブネット(自動)
- 複数 AZ にまたがる public / private サブネット(3AZ)
- Internet Gateway / ルートテーブル
-
NAT ゲートウェイ(private 側のアウトバウンド用)
※ 既定の VPC 自動作成時。既存VPCを使う設定にすれば作成しません
-
マネージドノードグループ(EC2)
- 指定したインスタンスタイプ・台数で private サブネットに配置(既定)
- ノード用 IAM ロール & インスタンスプロファイル(ECR 読み取り等の標準ポリシー)
- ノード用セキュリティグループ(コントロールプレーン・Node間の通信を許可)
-
IAM OIDC プロバイダ(
--with-oidc指定時)- IRSA(Pod 単位 IAM)を使うための OIDC プロバイダ
また、Kubectl側の以下設定も自動でやってくれていました。
-
aws-auth ConfigMap の設定
- ノードロールを Kubernetes の
system:nodeにマップ
- ノードロールを Kubernetes の
-
kubeconfig 更新
-
~/.kube/configにクラスタの context を追加
-
接続確認
-
kubectl config get-contextsでクラスターとユーザのペア(Context)が表示される -
kubectl get nodesで Ready なノード×2 が見える
PS C:\WINDOWS\system32> kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* admin-user@demo-eks.ap-northeast-1.eksctl.io demo-eks.ap-northeast-1.eksctl.io admin-user@demo-eks.ap-northeast-1.eksctl.io
PS C:\WINDOWS\system32> kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-17-143.ap-northeast-1.compute.internal Ready <none> 21h v1.32.9-eks-c39b1d0
ip-192-168-38-49.ap-northeast-1.compute.internal Ready <none> 21h v1.32.9-eks-c39b1d0
3. Nginx を外部公開してみる
- まずは、Nginxが公開しているイメージをサクッとデプロイしてみます。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80
kubectl get svc nginx
- サービスが作られていることが確認できます。
PS C:\WINDOWS\system32> kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 22h
nginx LoadBalancer 10.100.72.213 xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com 80:31170/TCP 16s
4. ECR イメージをデプロイしてみる
- 続いて、ECRにPush済みのイメージをデプロイしてみます。
- 今回はHello ECSと表示するだけの簡単なイメージを事前に作成済み。
4.1 マニフェスト作成(例:C:\container-handson\helloECS.yaml)
- マニフェストファイル(k8sリソースの設定ファイル)を作成します。
- 今回はネームスペース・デプロイメント・サービスを作成します。
apiVersion: v1
kind: Namespace
metadata:
name: ecr-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: handson-app
namespace: ecr-demo
spec:
replicas: 2
selector:
matchLabels:
app: handson-app
template:
metadata:
labels:
app: handson-app
spec:
containers:
- name: app
image: xxxxxxxxxxxx #ECRイメージURIを記載
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 # アプリの待ち受けポートに合わせる(今回の検証では 80)
resources:
requests: { cpu: "100m", memory: "128Mi" }
limits:
cpu: "500m"
memory: "512Mi"
readinessProbe:
httpGet: { path: "/", port: 80 }
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet: { path: "/", port: 80 }
initialDelaySeconds: 15
periodSeconds: 20
---
apiVersion: v1
kind: Service
metadata:
name: handson-svc
namespace: ecr-demo
spec:
type: LoadBalancer
selector:
app: handson-app
ports:
- name: http
port: 80
targetPort: 80
4.2 デプロイと確認
- 作成したマニフェストファイルをApplyします。
kubectl apply -f "C:\container-handson\helloECS.yaml"
kubectl -n ecr-demo rollout status deployment/handson-app
kubectl -n ecr-demo get pods -o wide
kubectl -n ecr-demo get svc handson-svc
- 作成したネームスペースの中にPodが立ち上がっていることが確認できます。
- サービスも立ち上がっていますね。
PS C:\WINDOWS\system32> kubectl -n ecr-demo get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
handson-app-b58956865-4vfqz 1/1 Running 0 47s 192.168.35.55 ip-192-168-38-49.ap-northeast-1.compute.internal <none> <none>
handson-app-b58956865-4wfjz 1/1 Running 0 35s 192.168.22.116 ip-192-168-17-143.ap-northeast-1.compute.internal <none> <none>
PS C:\WINDOWS\system32> kubectl -n ecr-demo get svc handson-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
handson-svc LoadBalancer 10.100.109.98 xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com 80:30948/TCP 11m
EXTERNAL-IP へアクセス。
Healthチェックパスに設定しているパスが表示されることを確認出来ました。
(ルートでは「Hello ECS」と表示するだけのアプリですが、ルートのページは撮り忘れました)
6. 後片付け
-
今回、eksctlの既定値でリソースが作成されているため、放っておくとかなりコストが発生します。
(Natgateway・EIP・Cluster等) -
以下コマンドだけで、作成されたリソースは跡形もなく削除されます。
#Namespace ごと削除(Service/ELB も順次削除)
kubectl delete ns ecr-demo
# クラスター削除(EKS 本体・ノード・関連リソース)
eksctl delete cluster `
--name demo-eks `
--region ap-northeast-1
これだけで簡単に作ったリソースがすべて削除されました。
まとめ
今回は、eksctlを使ってEKSを構築・ECRからイメージを取得して簡単なアプリケーションを動かしてみました。
Kubernetesってなに?EKSってなに?状態でも簡単なコマンドだけでポチポチ環境構築できてしまうため、PoCや検証にもってこいだと感じました。
次回以降は、今回ハンズオンで実施した内容を詳細に振り返ることで、k8sに対する理解を深めていきたいと思います。


