kubernetes について
Kubernetes のワークロードを扱う開発者や運用担当者向けのスキルです。デプロイ設定、kubectl の操作、本番環境への準備、トラブルシューティングを扱い、セキュリティやリソース管理の指針も含みます。
主な機能
- 01Deployment と Service の設定例
- 02よく使う kubectl コマンド
- 03本番環境の準備チェックリスト
- 04トラブルシューティングの手引き
- 05セキュリティとリソース管理の実践
活用シーン
- 01Kubernetes のデプロイマニフェスト作成
- 02Pod やサービスの問題調査
- 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 | リソース制約、taint | kubectl 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
参考ドキュメント
コメント
Markdown 対応