Day 21: 第3週のまとめ:本番環境EKSデプロイメント実践 🎉
皆さん、こんにちは!30日集中講座、Day 21へようこそ。
この1週間で、皆さんはKubernetesの基本的な概念と、AWS上でKubernetesを動かすEKSについて学びました。今日は、これまでの学びを総動員し、Day 6で作成したPythonアプリケーションを、本番環境レベルのセキュリティ・可用性を備えたEKS環境にデプロイする最終演習を行います。
1. 今日の学習ステップ(推奨時間:90分)
この演習では、段階的な達成感を重視します。
-
Phase 1: 基本デプロイ(30分) 🔰
- ECRへのプッシュと基本のDeploymentを作成し、Podが動くことを確認します。
-
Phase 2: 外部公開(30分) 🔰🔰
- ServiceとIngressを作成し、ALB経由でアプリケーションをインターネットに公開します。
-
Phase 3: 本番化(30分) 🔰🔰🔰
- リソース制限、ヘルスチェック、HPAを追加し、より本格的な設定を行います。
2. デプロイ前チェックリストと前提条件
このハンズオンをスムーズに進めるために、以下の準備が完了しているか確認してください。
✅ 前提条件の確認と設定(必須)
-
AWS CLI設定の確認:
$ aws sts get-caller-identityコマンドを実行し、アカウントIDが表示されればOKです。 -
EKSクラスターの確認:
$ kubectl get nodesコマンドを実行し、ノード一覧が表示されればOKです。 -
ECRリポジトリの確認:
$ aws ecr describe-repositories --repository-names my-web-app --region ap-northeast-1コマンドを実行し、リポジトリ名が一致しているか確認しましょう。
今日の重要用語集 📚
- Pod(ポッド) → アプリを動かす最小単位(1つの箱と考えてOK)
- Deployment(デプロイメント) → Podを管理する仕組み(「Podを2個作って」という指示書)
- Service(サービス) → Podへの通信を中継する仕組み(電話交換機のようなもの)
- Ingress(イングレス) → 外部からの通信をServiceに振り分ける入口(建物の受付)
- HPA(Horizontal Pod Autoscaler) → 負荷に応じて自動でサーバー台数を調整する機能
3. ステップ・バイ・ステップ:実践演習
Phase 1: 基本デプロイ(30分) 🔰
まず、アプリケーションをEKSにデプロイし、Podが正常に起動することを確認します。
ステップ1: アプリケーションコードとDockerfileの更新
app.pyにヘルスチェックエンドポイントを追加し、requirements.txtにpsutilを追記します。
ステップ2: ローカルでの準備とECRへのプッシュ
更新したコードを基に、Dockerイメージを再ビルドしECRにプッシュします。
ステップ3: Kubernetesマニフェストの作成とデプロイ
ここでは、まずシンプルに動かすことを最優先にします。
deployment.yaml(基本版)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
labels:
app: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:latest
ports:
- containerPort: 5000
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData:
password: "mysecretpassword"
kubectl apply -f . でデプロイし、Podの状態を確認します。
$ kubectl get pods -l app=my-app
NAME READY STATUS RESTARTS AGE
my-app-deployment-7d4b8c8f9d-abc12 1/1 Running 0 2m
my-app-deployment-7d4b8c8f9d-def34 1/1 Running 0 2m
✅ 正常な状態:READY が 1/1 かつ STATUS が Running
Phase 2: 外部公開(30分) 🔰🔰
ServiceとIngressを作成し、ALB経由でアプリケーションをインターネットに公開します。
ステップ4: ServiceとIngressの作成とデプロイ
service.yamlとingress.yamlを作成し、kubectl apply -f .でデプロイします。
service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 5000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
ステップ5: ALB作成の確認
kubectl get ingressでALBのDNS名が表示されるまで待ち、ブラウザでアクセスします。
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
my-app-ingress alb * k8s-default-myapping-1234567890.elb.amazonaws.com 80 5m
✅ ADDRESS列にALBアドレスが表示されたら成功!
Phase 3: 本番化(30分) 🔰🔰🔰
HPAとPDBを追加し、高可用性とスケーラビリティを備えた構成にします。
HPAって何?🤔
HPA(Horizontal Pod Autoscaler)は、レストランのスタッフ管理と同じです。
- 🍽️ 忙しい時間帯 → スタッフを増やす(Pod数増加)
- 😴 暇な時間帯 → スタッフを減らす(Pod数減少)
ステップ6: HPAとPDBの追加
hpa.yamlとpdb.yamlを作成し、kubectl apply -f .でデプロイします。
ステップ7: 負荷テストでHPAを体験
別ターミナルで負荷をかけ、Pod数の変化を観察しましょう。
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://my-app-service/health; done"
kubectl get pods -l app=my-app -w
✅ Podが自動的に増える様子を観察できれば成功!
4. よくあるエラーと解決方法 🚨
-
1.
ImagePullBackOffkubectl describe pod <pod-name> # → "Failed to pull image" を確認解決方法: ECR認証切れ →
aws ecr get-login-passwordを再実行。 -
2.
CrashLoopBackOffkubectl logs <pod-name> # → アプリのエラーログを確認解決方法: アプリケーションの起動エラー。
app.pyや環境変数設定を見直しましょう。 -
3.
Pending状態が続くkubectl get events # → "Insufficient resources" をチェック解決方法: リソース不足 →
limits値を下げるか、ノード追加。
5. まとめ
この3週間で、皆さんは以下のスキルを習得しました。
- クラウドネイティブのデプロイフロー: ローカル → ECR → ECS/EKS
- AWS主要サービスの役割: ECS, Fargate, ECR, ALB, Auto Scaling
- Kubernetesの基本リソース: Pod, Deployment, Service, HPA
- セキュリティと本番運用のベストプラクティス
これで、皆さんはECSとEKSという2つの主要なコンテナオーケストレーション技術をマスターしました。
次回の予告
Day 22: CI/CDパイプラインを構築する:GitHub ActionsとAWS CodePipeline
それでは、また明日お会いしましょう!