kubectl の基本
クラスター情報
kubectl cluster-info kubectl get nodes kubectl config current-context kubectl config use-context my-cluster
必須コマンド
kubectl get <resource>リソースを一覧表示
kubectl describe <resource> <name>リソースの詳細情報
kubectl create -f file.yamlファイルからリソースを作成
kubectl apply -f file.yamlリソースを作成または更新
kubectl delete -f file.yamlファイルからリソースを削除
kubectl edit <resource> <name>リソースをその場で編集
kubectl api-resourcesすべてのリソースタイプを一覧表示
出力フォーマット
-o wide追加列(IP、ノード)
-o yaml完全な YAML 出力
-o json完全な JSON 出力
-o jsonpath='{.spec}'特定フィールドを抽出
--sort-by=.metadata.nameフィールドで出力をソート
Pod
Pod 操作
kubectl get pods kubectl get pods -A # all namespaces kubectl run nginx --image=nginx # quick pod kubectl delete pod nginx
Pod YAML
apiVersion: v1 kind: Pod metadata: name: myapp labels: { app: myapp } spec: containers: - name: app image: nginx:1.27 ports: - containerPort: 80
Pod ステータス値
Runningすべてのコンテナが起動済み
Pendingスケジューリングまたはイメージのプルを待機中
CrashLoopBackOffコンテナがクラッシュし再起動を繰り返している
ImagePullBackOffコンテナイメージをプルできない
Completed完了まで実行された(Job)
デプロイメント
デプロイメント 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: nginx:1.27 ports: - containerPort: 80
デプロイメントコマンド
kubectl get deployデプロイメントを一覧表示
kubectl scale deploy web --replicas=5レプリカ数をスケール
kubectl set image deploy/web web=nginx:1.28イメージを更新(ローリング)
kubectl rollout status deploy/webロールアウトの進行状況を監視
kubectl rollout undo deploy/web前のリビジョンにロールバック
kubectl rollout history deploy/webリビジョン履歴を表示
サービス
サービスタイプ
ClusterIP内部のみ(デフォルト)
NodePort各ノードの IP の固定ポートで公開
LoadBalancer外部ロードバランサー(クラウド)
ExternalName外部サービスへの DNS エイリアス
サービス YAML
apiVersion: v1 kind: Service metadata: name: web-svc spec: type: ClusterIP selector: { app: web } ports: - port: 80 targetPort: 80
クイック公開
kubectl expose deploy web --port=80 --type=ClusterIP kubectl expose deploy web --port=80 --type=NodePort kubectl get svc
ConfigMap と Secret
ConfigMap
kubectl create configmap app-cfg \ --from-literal=DB_HOST=db.example.com \ --from-file=config.ini
Secret
kubectl create secret generic db-creds \ --from-literal=username=admin \ --from-literal=password=s3cret
Pod での使用
# As environment variables envFrom: - configMapRef: { name: app-cfg } - secretRef: { name: db-creds } # As volume mount volumes: - name: cfg configMap: { name: app-cfg }
コマンド
kubectl get cmConfigMap を一覧表示
kubectl get secretSecret を一覧表示
kubectl describe cm app-cfgConfigMap のデータを表示
kubectl get secret db-creds -o yamlSecret を表示(base64 エンコード)
ネームスペース
ネームスペースコマンド
kubectl get nsネームスペースを一覧表示
kubectl create ns stagingネームスペースを作成
kubectl delete ns stagingネームスペースとすべてのリソースを削除
kubectl get pods -n stagingネームスペース内の Pod を一覧表示
kubectl get pods -Aすべてのネームスペースの Pod を一覧表示
デフォルトネームスペースを設定
kubectl config set-context --current \ --namespace=staging
ボリューム
PersistentVolumeClaim
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-pvc spec: accessModes: [ReadWriteOnce] resources: requests: { storage: 10Gi }
Pod へのマウント
volumes: - name: data persistentVolumeClaim: claimName: data-pvc containers: - volumeMounts: - name: data mountPath: /app/data
ボリュームタイプ
emptyDir一時ディレクトリ、Pod と共に削除
hostPathホストファイルシステムパスをマウント
persistentVolumeClaim永続ストレージ(PVC)
configMapConfigMap をファイルとしてマウント
secretSecret をファイルとしてマウント
Ingress
Ingress YAML
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress spec: rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: web-svc port: { number: 80 }
Ingress の注意点
Ingress Controller必須(nginx-ingress、traefik など)
pathType: PrefixURL プレフィックスにマッチ
pathType: Exact正確な URL パスにマッチ
TLSSecret 名を指定した tls: セクションを追加
デバッグ
診断コマンド
kubectl logs <pod>コンテナの stdout/stderr
kubectl logs <pod> -c <ctr>特定コンテナのログ
kubectl logs <pod> --previousクラッシュしたコンテナのログ
kubectl describe pod <pod>イベント、条件、ステータス
kubectl exec -it <pod> -- shコンテナへのシェル接続
kubectl port-forward <pod> 8080:80ローカルポートを Pod にフォワード
kubectl top podsCPU / メモリ使用量(metrics-server)
kubectl get events --sort-by=.lastTimestampクラスターイベントのタイムライン
デバッグ Pod
kubectl run debug --rm -it --image=busybox -- sh # or attach ephemeral container kubectl debug -it --image=busybox
よく使うパターン
ラベルとセレクター
kubectl get pods -l app=web kubectl get pods -l 'env in (prod,staging)' kubectl label pod myapp env=prod
リソース制限
resources: requests: { cpu: 100m, memory: 128Mi } limits: { cpu: 500m, memory: 256Mi }
ライブネスとレディネス
livenessProbe: httpGet: { path: /healthz, port: 8080 } initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: { path: /ready, port: 8080 }
クイックレシピ
Dry runkubectl apply -f file.yaml --dry-run=client
Generate YAMLkubectl create deploy web --image=nginx --dry-run=client -o yaml
Watchkubectl get pods -w
Copy fileskubectl cp file.txt pod:/tmp/
Restart deploykubectl rollout restart deploy/web