1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Dockerはわかるけど…」から卒業!AWSでコンテナを動かすための30日集中講座 - Day 21: 第3週のまとめ:本番環境EKSデプロイメント実践

Last updated at Posted at 2025-08-20

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.txtpsutilを追記します。

ステップ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分) 🔰🔰

ServiceIngressを作成し、ALB経由でアプリケーションをインターネットに公開します。

ステップ4: ServiceとIngressの作成とデプロイ
service.yamlingress.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分) 🔰🔰🔰

HPAPDBを追加し、高可用性とスケーラビリティを備えた構成にします。

HPAって何?🤔
HPA(Horizontal Pod Autoscaler)は、レストランのスタッフ管理と同じです。

  • 🍽️ 忙しい時間帯 → スタッフを増やす(Pod数増加)
  • 😴 暇な時間帯 → スタッフを減らす(Pod数減少)

ステップ6: HPAとPDBの追加
hpa.yamlpdb.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. ImagePullBackOff

    kubectl describe pod <pod-name> # → "Failed to pull image" を確認
    

    解決方法: ECR認証切れ → aws ecr get-login-passwordを再実行。

  • 2. CrashLoopBackOff

    kubectl 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

それでは、また明日お会いしましょう!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?