C
DevOps/CICD K8s/Lesson 03

CI/CD + Kubernetes — GitHub Actions · Pod · Deployment

60分·theory

CI/CD + Kubernetes — GitHub Actions · Pod · Deployment

🎯 このレッスンを読み終えたら

このレッスンを最後まで読み終えると、以下の3つを自信を持って実践できるようになります。

  • ✅ GitHub Actions / GitLab CI ワークフロー
  • ✅ Kubernetes Pod · Deployment · Service · Ingress
  • ✅ Helm パッケージマネージャー + 環境別 values.yml

これらの目標をチェックリストとして手元に置き、すべてに答えられるようになったらレッスンを閉じてください。

CI/CD フロー + GitHub Actions

CI/CD = コード → 本番環境の自動化:
1. Continuous Integration: コードプッシュ → 自動ビルド・テスト・リント
2. Continuous Delivery: + 自動ステージングデプロイ
3. Continuous Deployment: + 自動本番デプロイ

GitHub Actions(最も一般的):

  • .github/workflows/*.yml ファイル
  • push・PR・スケジュール・手動トリガー
  • パブリックリポジトリは無料、プライベートは月2,000分無料

:

yaml
name: CI
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20', cache: 'npm' }
      - run: npm ci
      - run: npm run lint
      - run: npm test
      - run: npm run build

セキュリティのベストプラクティス:

  • secrets.GITHUB_TOKEN を使用する(Personal Access Token の直書きは禁止)
  • OIDC で AWS・GCP の一時的な認証情報を取得する(長期キーは使わない)
  • アクションはコミットハッシュに固定する(バージョンタグではなく)
  • Dependabot でアクションを自動アップデートする

その他の CI/CD ツール:

  • GitLab CI — GitLab に内蔵
  • Jenkins — セルフホスト型、強力だが複雑
  • CircleCI — 素早く始められる
  • ArgoCD — GitOps(Kubernetes 特化)

Kubernetes — Pod · Service · Deployment

一言で言うと: K8s = コンテナの自動運用ツール。Google の Borg が起源 → 2014年にオープンソース化 → 事実上の標準。

主要オブジェクト:

オブジェクト意味
Pod1つ以上のコンテナの最小単位。同じ IP・ボリュームを共有
ServicePod の固定エントリーポイント(Pod の IP が変わっても安定)
DeploymentPod の望ましい状態を管理(レプリカ・ローリングアップデート)
StatefulSet永続的・順序付きの Pod(DB・Kafka)
DaemonSet全ノードに1つずつ配置(ログ収集・モニタリング)
Job · CronJob1回限りのタスク・定期タスク
ConfigMap · Secret設定値・シークレット
IngressHTTP ルーティング・TLS

Deployment の例:

yaml
apiVersion: apps/v1
kind: Deployment
metadata: { name: web }
spec:
  replicas: 3
  selector: { matchLabels: { app: web } }
  template:
    metadata: { labels: { app: web } }
    spec:
      containers:
      - name: web
        image: myapp:1.0
        ports: [{ containerPort: 3000 }]
        resources:
          requests: { cpu: "100m", memory: "128Mi" }
          limits:   { cpu: "500m", memory: "512Mi" }

ローリングアップデート(デフォルト戦略):

  • 新バージョンの Pod を段階的に追加 → 旧 Pod を段階的に削除
  • ゼロダウンタイムデプロイを保証
  • 失敗時には自動ロールバックが可能

必須コマンド:

  • kubectl apply -f deploy.yaml — デプロイ
  • kubectl get pods,svc,deploy — 状態確認
  • kubectl logs -f <pod> — ログのストリーミング
  • kubectl exec -it <pod> -- bash — コンテナに入る
  • kubectl rollout undo deployment web — ロールバック
💻 📌 GitHub Actions + kubectl
# ============================================
# .github/workflows/deploy.yml
# コード push → テスト → ビルド → イメージ push → K8s デプロイ
# ============================================
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write          # OIDC 用

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with: { node-version: '20' }

      - run: npm ci
      - run: npm test
      - run: npm run build

      # Docker イメージビルド + push
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}

      # AWS OIDC (長期キーなし)
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123:role/github-deploy
          aws-region: ap-northeast-2

      # K8s デプロイ
      - uses: azure/setup-kubectl@v3
      - run: |
          aws eks update-kubeconfig --name prod-cluster
          kubectl set image deployment/web web=ghcr.io/myorg/web:${{ github.sha }}
          kubectl rollout status deployment/web --timeout=5m

# ============================================
# 実用 kubectl コマンド
# ============================================
# kubectl get all                          # 全てのリソース
# kubectl describe pod <name>              # 詳細 (イベント・問題診断)
# kubectl logs -f <pod> -c <container>     # マルチコンテナ
# kubectl port-forward svc/web 8080:80     # ローカル → クラスター
# kubectl scale deployment web --replicas=5
# kubectl rollout history deployment web   # デプロイ履歴
# kubectl rollout undo deployment web      # 直前に戻す
# kubectl top pods                         # CPU・MEM 使用
# kubectl drain node-1 --ignore-daemonsets # ノードを空にする

🤖 AI にこう頼んでみよう

このレッスンの概念を理解していれば、AI に具体的かつ的確な指示を出せます。漠然とした「直して」ではなく、語彙を持った依頼 — それがトークン節約の第一歩です。

  • 「このプロジェクトの GitHub Actions ワークフロー(lint + test + deploy)を作って」
  • 「このアプリを Kubernetes の deployment + service + ingress の YAML に変換して」

なぜこれがトークンを減らすのか

概念を知らないと、AI の回答をもらっても 「それって何ですか?」 と再度聞き直す羽目になります。その「聞き直し」がトークンを消費します。概念を一度しっかり覚えておけば、会話が一度で完結します。

CI/CD + Kubernetes — GitHub Actions・Pod・Deployment - DevOps