ノード管理の基本操作
クラスタ内のノード情報を取得するには以下を実行します。
kubectl get nodes
kubectl get nodes -o wide # 詳細情報を含む出力
新規ノードをクラスタに追加する際は、kubeadm join コマンドとトークンを使用します。
ノードの安全な削除手順
- 新しい Pod のスケジューリングを停止:
kubectl cordon <node-name> - 既存の Pod を他のノードへ移動(DaemonSet は除外):
kubectl drain <node-name> --ignore-daemonsets - ノードをクラスタから削除:
kubectl delete node <node-name>
アプリケーションのデプロイと削除
Deployment と Service を YAML ファイルとして生成し、再利用可能な形で管理できます。
kubectl create deployment nginx-web --image=nginx --replicas=3 --dry-run=client -o yaml > nginx.yaml
kubectl expose deployment nginx-web --port=80 --target-port=80 --type=ClusterIP --dry-run=client -o yaml > nginx-svc.yaml
既存のアプリケーションを削除するには:
kubectl delete deployment my-nginx
コマンド補完の設定
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
イメージの更新とロールバック
Deployment のコンテナイメージを更新:
kubectl set image deployment/test-web nginx=nginx:1.16
過去のリビジョンを確認し、ロールバック:
kubectl rollout history deployment/test-web
kubectl rollout undo deployment/test-web
kubectl rollout undo deployment/test-web --to-revision=2
スケーリング操作
レプリカ数を即時変更:
kubectl scale deployment/test-web --replicas=10
Horizontal Pod Autoscaler (HPA) の設定
CPU 使用率に基づく自動スケーリング(autoscaling/v1)
kubectl autoscale deployment my-nginx --min=2 --max=10 --cpu-percent=60
生成された YAML の例:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: my-nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-nginx
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 60
複数メトリクス対応の HPA(autoscaling/v2beta2)
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: web
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: "1k"
- type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-route
target:
type: Value
value: "10k"
メトリクスの種類:
- Resource: Pod の CPU/メモリ使用率
- Pods: Pod 固有のカスタムメトリクス
- Object: Kubernetes 内部オブジェクト(例:Ingress)のメトリクス
- External: 外部システム由来のメトリクス
Pod の詳細操作
リソース制限の設定
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
ヘルスチェック(Probe)
- livenessProbe: 容器が生きているかを確認。失敗時は再起動
- readinessProbe: サービスへのトラフィック受け入れ可否を判断
サポートされる Probe の種類:
httpGet: HTTP ステータスコード 200–399 で成功exec: コマンドの終了ステータスが 0 で成功tcpSocket: TCP 接続が確立できれば成功
スケジューリング制御
- nodeName: 特定ノードに直接割り当て
- nodeSelector: ラベルマッチングによるノード選択
kubectl label nodes node1 team=backend - Taints & Tolerations: ノードへのスケジューリング制限とその許容
kubectl taint node node1 dedicated=ai:NoSchedulePod 側で許容するには tolerations を定義
ワークロードコントローラー
- Deployment: 無状態アプリケーションの管理(ロールバック、スケーリング対応)
- DaemonSet: 全ノード(または条件付き)に1 Pod を保証
- Job: 一度だけ実行されるバッチ処理
- CronJob: 定期実行ジョブ(cron 形式)
Service とネットワーク
Service のタイプ:
- ClusterIP: クラスタ内通信用(デフォルト)
- NodePort: ノードの静的ポート経由で外部公開
- LoadBalancer: クラウドプロバイダ連携型の外部公開
プロキシモードの切り替え(iptables → IPVS)
- カーネルモジュールをロード:
modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe nf_conntrack kube-proxyの ConfigMap を編集:kubectl edit cm kube-proxy -n kube-systemmode: ipvsを設定kube-proxyPod を再起動:kubectl delete pod -n kube-system -l k8s-app=kube-proxy
Ingress による7層ロードバランシング
Ingress Controller(例:ingress-nginx)をデプロイ後、ルールを定義します。
HTTP ベースの Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
HTTPS 対応
- TLS Secret を作成:
kubectl create secret tls app-tls --cert=tls.crt --key=tls.key - Ingress に TLS 設定を追加:
spec: tls: - hosts: - app.example.com secretName: app-tls rules: - host: app.example.com ...
アノテーションによるカスタマイズ
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
Prometheus 連携によるカスタムメトリクス HPA
- Prometheus と prometheus-adapter を Helm でデプロイ
- アプリケーションにメトリクスエンドポイントを公開(例:
/metrics) - prometheus-adapter の ConfigMap でメトリクス変換ルールを定義
- v2beta2 HPA でカスタムメトリクスを参照
メトリクス取得の確認:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests_per_second"