Kubernetes クラスタの日常管理と運用

ノード管理の基本操作

クラスタ内のノード情報を取得するには以下を実行します。

kubectl get nodes
kubectl get nodes -o wide  # 詳細情報を含む出力

新規ノードをクラスタに追加する際は、kubeadm join コマンドとトークンを使用します。

ノードの安全な削除手順

  1. 新しい Pod のスケジューリングを停止:
    kubectl cordon <node-name>
  2. 既存の Pod を他のノードへ移動(DaemonSet は除外):
    kubectl drain <node-name> --ignore-daemonsets
  3. ノードをクラスタから削除:
    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:NoSchedule

    Pod 側で許容するには tolerations を定義

ワークロードコントローラー

  • Deployment: 無状態アプリケーションの管理(ロールバック、スケーリング対応)
  • DaemonSet: 全ノード(または条件付き)に1 Pod を保証
  • Job: 一度だけ実行されるバッチ処理
  • CronJob: 定期実行ジョブ(cron 形式)

Service とネットワーク

Service のタイプ:

  • ClusterIP: クラスタ内通信用(デフォルト)
  • NodePort: ノードの静的ポート経由で外部公開
  • LoadBalancer: クラウドプロバイダ連携型の外部公開

プロキシモードの切り替え(iptables → IPVS)

  1. カーネルモジュールをロード:
    modprobe ip_vs
    modprobe ip_vs_rr
    modprobe ip_vs_wrr
    modprobe nf_conntrack
  2. kube-proxy の ConfigMap を編集:
    kubectl edit cm kube-proxy -n kube-system

    mode: ipvs を設定

  3. kube-proxy Pod を再起動:
    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 対応

  1. TLS Secret を作成:
    kubectl create secret tls app-tls --cert=tls.crt --key=tls.key
  2. 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

  1. Prometheus と prometheus-adapter を Helm でデプロイ
  2. アプリケーションにメトリクスエンドポイントを公開(例:/metrics
  3. prometheus-adapter の ConfigMap でメトリクス変換ルールを定義
  4. v2beta2 HPA でカスタムメトリクスを参照

メトリクス取得の確認:

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests_per_second"

タグ: Kubernetes kubectl hpa ingress Prometheus

7月7日 23:10 投稿