mcpField
K
kubernetes

kubernetes

github.com/claude-dev-suiteクラウド・DevOps4640 回インストール3 日前に更新
リポジトリ

kubernetes について

Kubernetes のワークロードを扱う開発者や運用担当者向けのスキルです。デプロイ設定、kubectl の操作、本番環境への準備、トラブルシューティングを扱い、セキュリティやリソース管理の指針も含みます。

主な機能

  1. 01Deployment と Service の設定例
  2. 02よく使う kubectl コマンド
  3. 03本番環境の準備チェックリスト
  4. 04トラブルシューティングの手引き
  5. 05セキュリティとリソース管理の実践

活用シーン

  1. 01Kubernetes のデプロイマニフェスト作成
  2. 02Pod やサービスの問題調査
  3. 03本番デプロイの準備状況確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill kubernetes

インストール後、Claude Code で/kubernetesを入力して読み込まれたか確認します。

同梱ファイルquick-ref/kubectl.mdquick-ref/resources.md

詳細

Kubernetes コア知識

深い知識:包括的なドキュメントについては、technology: kubernetes を指定して mcp__documentation__fetch_docs を使用してください。

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp:1.0.0
          ports:
            - containerPort: 3000
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: myapp-secrets
                  key: database-url
          resources:
            requests:
              memory: "128Mi"
              cpu: "100m"
            limits:
              memory: "256Mi"
              cpu: "500m"
          livenessProbe:
            httpGet:
              path: /health
              port: 3000
            initialDelaySeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: 3000

Service

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 3000
  type: ClusterIP
---
# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
spec:
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: myapp
                port:
                  number: 80

ConfigMap & Secret

apiVersion: v1
kind: ConfigMap
metadata:
  name: myapp-config
data:
  LOG_LEVEL: "info"
  API_URL: "https://api.example.com"
---
apiVersion: v1
kind: Secret
metadata:
  name: myapp-secrets
type: Opaque
data:
  database-url: cG9zdGdyZXM6Ly8uLi4=  # base64

一般的なコマンド

kubectl apply -f deployment.yaml
kubectl get pods
kubectl logs pod-name
kubectl exec -it pod-name -- sh
kubectl scale deployment myapp --replicas=5
kubectl rollout status deployment/myapp
kubectl rollout undo deployment/myapp

このスキルを使用しない場合

次の場合はこのスキルを使用しないでください:

  • 複数のコンテナを使ったローカル開発環境を構築する場合 — docker-compose スキルを使用してください
  • コンテナイメージを作成する場合 — docker スキルを使用してください
  • CI/CD パイプラインを管理する場合 — github-actions スキルを使用してください
  • 単一サーバーへのデプロイ(VPS)を実行する場合 — Docker Compose のほうが簡単な場合があります
  • K8s を抽象化するマネージドコンテナサービス(AWS Fargate、Google Cloud Run)を使用する場合

アンチパターン

アンチパターン問題解決策
リソース制限を設定しないリソースの枯渇、他のワークロードへの悪影響常に resources.requests と limits を設定する
root で実行するセキュリティ上の脆弱性securityContext.runAsNonRoot: true を設定する
Readiness Probe を設定しない起動中の Pod にトラフィックが送られるダウンタイムなしで切り替えるために readinessProbe を追加する
latest イメージタグを使用するデプロイが予測不能になる特定のバージョン myapp:v1.2.3 を指定する
ConfigMap にシークレットを保存する機密データが漏えいするSecrets、External Secrets、または Sealed Secrets を使用する
Pod Disruption Budget を設定しないノードのメンテナンス中にダウンタイムが発生するminAvailable を指定して PDB を追加する
重要なサービスのレプリカが 1 つだけ単一障害点になるアンチアフィニティを設定して、レプリカを 2 つ以上使用する
ネットワークポリシーを設定しないすべての Pod が互いに通信できるNetworkPolicy でトラフィックを制限する
ヘルスチェックがない正常でない Pod がローテーションに残るlivenessProbe と readinessProbe を追加する
maxUnavailable = maxSurge = 0ロールアウトが停止するローリングアップデートでは、少なくとも一方を 0 より大きく設定する

迅速なトラブルシューティング

問題原因の診断修正方法
Pod が Pending のままリソース不足kubectl describe pod を確認し、ノードを追加するかリクエストを減らします
Pod が CrashLoopBackOff 状態コンテナがすぐに終了するログを確認します:kubectl logs pod-name --previous
ImagePullBackOffイメージを取得できないイメージの存在を確認し、imagePullSecrets を確認します
Service にアクセスできないセレクターが誤っている、エンドポイントがないkubectl get endpoints service-name を確認します
Readiness Probe が失敗するアプリケーションの準備が時間内に完了しないinitialDelaySeconds を増やすか、アプリケーションの起動処理を修正します
OOMKilled ステータスメモリ制限を超過しているresources.limits.memory を増やします
Ingress が 404 を返すパスが誤っている、Service が見つからないIngress ルールを確認し、バックエンド Service が存在することを確認します
ConfigMap の変更が反映されないPod が再起動されていないアノテーションまたはイメージを変更してローリングアップデートを開始します
0/3 nodes availableリソース制約、taintkubectl describe nodes でノードのステータスを確認します
Persistent Volume をマウントできないPVC がバインドされていない、ストレージクラスが誤っているkubectl get pvc で PVC のステータスを確認します

本番環境への対応

セキュリティ設定
# Pod Security Context
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    spec:
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        runAsGroup: 1000
        fsGroup: 1000
      containers:
        - name: myapp
          image: myapp:1.0.0
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            capabilities:
              drop:
                - ALL
          volumeMounts:
            - name: tmp
              mountPath: /tmp
      volumes:
        - name: tmp
          emptyDir: {}
# Network Policy - Restrict traffic
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: myapp-network-policy
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 3000
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: database
      ports:
        - protocol: TCP
          port: 5432
シークレット管理
# External Secrets Operator (recommended)
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: myapp-secrets
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: vault-backend
    kind: ClusterSecretStore
  target:
    name: myapp-secrets
  data:
    - secretKey: database-url
      remoteRef:
        key: myapp/database
        property: url
# Sealed Secrets (alternative)
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: myapp-secrets
spec:
  encryptedData:
    database-url: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq...
リソース管理
# Proper resource limits
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
        - name: myapp
          resources:
            requests:
              memory: "256Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              cpu: "1000m"
          # Vertical Pod Autoscaler can optimize these
# Horizontal Pod Autoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80
# Pod Disruption Budget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb
spec:
  minAvailable: 1  # Or maxUnavailable: 1
  selector:
    matchLabels:
      app: myapp
ヘルスプローブ
# Comprehensive health probes
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
        - name: myapp
          # Startup probe (for slow-starting apps)
          startupProbe:
            httpGet:
              path: /health
              port: 3000
            failureThreshold: 30
            periodSeconds: 10
          # Liveness probe (restart if unhealthy)
          livenessProbe:
            httpGet:
              path: /health
              port: 3000
            initialDelaySeconds: 0
            periodSeconds: 10
            timeoutSeconds: 3
            failureThreshold: 3
          # Readiness probe (traffic routing)
          readinessProbe:
            httpGet:
              path: /ready
              port: 3000
            initialDelaySeconds: 0
            periodSeconds: 5
            timeoutSeconds: 3
            failureThreshold: 3
ローリングアップデート
# Safe rolling update strategy
apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Max extra pods during update
      maxUnavailable: 0  # Zero downtime
  template:
    spec:
      terminationGracePeriodSeconds: 30
      containers:
        - name: myapp
          lifecycle:
            preStop:
              exec:
                command: ["/bin/sh", "-c", "sleep 10"]
モニタリングと可観測性
# ServiceMonitor for Prometheus
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  endpoints:
    - port: http
      path: /metrics
      interval: 30s
モニタリングメトリクス
メトリクスアラートしきい値
Pod の再起動回数15 分間で > 3
CPU 使用率継続して > 80%
メモリ使用率> 85%
Pod の Pending 時間> 5 分
デプロイの失敗数> 0
証明書の有効期限< 30 日
TLS を使用した Ingress
# Ingress with cert-manager TLS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - myapp.example.com
      secretName: myapp-tls
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: myapp
                port:
                  number: 80
チェックリスト
  • Pod のセキュリティコンテキスト(非 root、読み取り専用ファイルシステム)
  • ネットワークポリシーを定義
  • External Secrets/Sealed Secrets 経由でシークレットを管理
  • リソースのリクエストと上限を設定
  • オートスケーリング用に HPA を設定
  • 高可用性のための PDB
  • Liveness/readiness/startup プローブ
  • ローリングアップデート戦略(ダウンタイムゼロ)
  • グレースフルシャットダウン(preStop フック)
  • cert-manager 経由で TLS 証明書を管理
  • Prometheus メトリクスをエクスポート
  • Pod の分散用に anti-affinity を設定
  • RBAC のスコープを適切に設定
  • イメージのプルポリシー:Always(:latest の場合)または IfNotPresent

参考ドキュメント

コメント