Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetesのワーカーノードを自動修復するために必要だったこと

h-otter
November 05, 2021

 Kubernetesのワーカーノードを自動修復するために必要だったこと

CloudNative Days Tokyo 2021
Track C 2021/11/05 15:20-15:40
中級者 Operation / Monitoring / Logging

CyberAgentではプライベートクラウド上で多数のKubernetesクラスタが稼働しており、ノードの自動修復機能を実装することで運用コストを削減しました。本発表では、似たような自動修復を実現したいオンプレミスKubernetesの運用者にむけて、KubernetesにおけるノードのNotReadyの定義から、OverlayFSで実現した再起動でディスクの変更が揮発する仕組みまで紹介します。

h-otter

November 05, 2021
Tweet

More Decks by h-otter

Other Decks in Technology

Transcript

  1. 自己紹介
 • 川原 大輝(かわはら ひろき)
 • 2021年4月入社
 • CyberAgent group

    Infrastructure Unit所属
 • 自宅ラック勢
 ◦ Kubernetes
 ◦ ZFS
 ◦ Minio
 ◦ MySQL
 ◦ Elastic Cloud on Kubernetes
 ◦ Harbor
 ◦ 僕の考える最強のクラウドストレージ 
 2
  2. AKE
 • 社内向けKubernetes as a Service
 • CIUのチームでGKE互換を目指して開発中
 • 2017年4月にリリースしたv1をへて、v2を新規開発中


    3 v1 v2 構成管理 OpenStack Heat ClusterAPI Provider OpenStack マルチDC 非対応 対応 参考資料: https://speakerdeck.com/masayaaoyama/cabasenext2021-k8s-amsy810
  3. ClusterAPI
 5 Management Cluster Workload Cluster Core Cluster API Cluster

    API Provider OpenStack OpenStack VM Node Machine Deployment Machine Deployment Machine Deployment Machine Workload Cluster : ユーザーが利用するクラスタ
 Management Cluster : Workload Clusterを管理するためのクラスタ

  4. ClusterAPI
 6 Management Cluster Workload Cluster Core Cluster API Cluster

    API Provider OpenStack OpenStack VM Node Machine Deployment Machine Deployment Machine Deployment Machine MachineDeploymentのreplicasをもとに
 Machineリソースを作成
 Workload Cluster : ユーザーが利用するクラスタ
 Management Cluster : Workload Clusterを管理するためのクラスタ

  5. ClusterAPI
 7 Management Cluster Workload Cluster Core Cluster API Cluster

    API Provider OpenStack OpenStack VM Node Machine Deployment Machine Deployment Machine Deployment Machine Workload Cluster : ユーザーが利用するクラスタ
 Management Cluster : Workload Clusterを管理するためのクラスタ
 MachineリソースをもとにVMを立ち上げ、
 kubeadmを使ってWorkload Clusterに
 ジョインさせる

  6. NodeのCondition
 • Nodeの状態を示す
 ◦ Type ReadyはPodが配置可能であること 
 ◦ Type DiskPressureはディスクの残容量が低下

    
 • Type ReadyがFalse / Unknown
 ⇒ kubectlにおいてNotReadyと表示される
 10 https://kubernetes.io/ja/docs/concepts/architecture/nodes/#condition
  7. NodeのCondition
 • Nodeの状態を示す
 ◦ Type ReadyはPodが配置可能であること 
 ◦ Type DiskPressureはディスクの残容量が低下

    
 • Type ReadyがFalse / Unknown
 ⇒ kubectlにおいてNotReadyと表示される
 11 https://kubernetes.io/ja/docs/concepts/architecture/nodes/#condition 状態を確認した最後の時間

  8. NodeのCondition
 12 https://kubernetes.io/ja/docs/concepts/architecture/nodes/#condition • Nodeの状態を示す
 ◦ Type ReadyはPodが配置可能であること 
 ◦

    Type DiskPressureはディスクの残容量が低下 
 • Type ReadyがFalse / Unknown
 ⇒ kubectlにおいてNotReadyと表示される
 最後に状態遷移した時間

  9. ノード上のコンポーネント
 15 Node kubelet container runtime kube-apiserver 1. kubeletがkube-apiserverに対して
 自分のあるべき姿をWatchする


    2. kubeletがcontainer runtimeに指示を出す
 3. container runtimeがcontainerを立ち上げる
 container container container Linux Kernel
  10. NodeがNotReadyになる要因
 • StatusがUnknown
 ◦ kubeletがkube-apiserverに到達できていない 
 • StatusがFalse
 ◦ container

    runtimeが異常
 ◦ ノードがシャットダウン中
 ◦ キャパシティの設定が間違っている 
 20
  11. kubeletがkube-apiserverに到達できていない
 21 Node kubelet container runtime kube-apiserver • kubeletが起動できていない
 ◦

    kubeletの設定ミス
 • kubeletがハングアップ
 ◦ kubeletの一時的な不具合
 • ネットワーク的に到達できない
 ◦ OS側の設定ミス
 ▪ ストレージで永続化されている設定
 ▪ ipコマンドなどの一時的な設定
 ◦ kubeletの設定ミス
 ◦ 外部要因
 • 想定外
 container container container Linux Kernel
  12. container runtimeが異常
 22 Node kubelet container runtime kube-apiserver • container

    runtimeが起動できない
 ◦ container runtime設定ミス
 • container runtimeがハングアップ
 ◦ container runtimeの一時的な不具合
 • kubeletがcontainer runtimeを見つけられない
 ◦ kubeletの設定ミス
 • 想定外
 container container container Linux Kernel
  13. 障害の要因まとめ
 23 Node kubelet container runtime kube-apiserver container container container

    Linux Kernel アプリケーションのハングアップ 永続化されていない設定のミス 永続化された設定のミス 外部要因 想定外
  14. 自動修復の方法
 25 Node kubelet container runtime kube-apiserver container container container

    Linux Kernel アプリケーションのハングアップ 永続化されていない設定のミス 永続化された設定のミス 外部要因 想定外 アプリケーションの再起動 OSの再起動 filesystemのロールバック 
 必要なノード数を確保
  15. 自動修復機能の対応表
 26 
 AKEv2
 AKEv1
 GKE
 アプリケーションの再起動
 ◦
 ◦
 ◦


    OSの再起動
 ◦
 ◦
 ◦
 filesystemのロールバック
 ◦
 ×
 ◦
 必要なノード数を確保
 (Cluster Autoscaler)
 ◦
 ◦
 ◦
 https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-repair https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler
  16. OSの再起動
 • 基本的にはGKEの振る舞いをまねた動きを目指す
 29 Management Cluster Workload Cluster Core Cluster

    API Cluster API Provider OpenStack OpenStack VM Node Controller Machine Deployment Machine Deployment Machine Deployment Machine https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-repair
  17. OSの再起動
 • 基本的にはGKEの振る舞いをまねた動きを目指す
 30 Management Cluster Workload Cluster Core Cluster

    API Cluster API Provider OpenStack OpenStack VM Node Controller Machine Deployment Machine Deployment Machine Deployment Machine https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-repair ① 10分NotReadyが継続したNodeをドレイン ② NotReadyなNodeに紐付いているVMを再起動
  18. OSの再起動
 • 基本的にはGKEの振る舞いをまねた動きを目指す
 • 復旧できないノード・フラッピングするノードはどうする?
 ⇒ 現在進行形で試行錯誤中
 31 Management Cluster

    Workload Cluster Core Cluster API Cluster API Provider OpenStack OpenStack VM Node Controller Machine Deployment Machine Deployment Machine Deployment Machine https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-repair ① 10分NotReadyが継続したNodeをドレイン ② NotReadyなNodeに紐付いているVMを再起動
  19. /home
 /var
 /etc
 /tmp
 /usr
 その他
 GKEの場合
 35 https://cloud.google.com/container-optimized-os/docs/concepts/disks-and-filesystem?hl=ja (一部抜粋)

    /dev/dm-0 (ro)
 /dev/sda1 (rw)
 tmpfs (rw)
 再起動後に消失
 • OverlayFSはファイルシステム(FS)をかぶせることができる 
 • 参照は、上のFSから行い、なければ下のFSを参照 
 • 変更は上のFSに適用される 
 • コンテナの基礎技術 

  20. Cluster Autoscaler(ClusterAPI)
 • Clusterに必要なNodeを確保するようにClusterAPIを操作
 • リソースの抽象度がうまいので、ちゃんと動く
 50 Management Cluster Workload

    Cluster Core Cluster API Cluster API Provider OpenStack OpenStack VM Node Cluster Autoscaler Controller Machine Deployment Machine Deployment Machine Deployment Machine MachineDeploymentをWatch • annotationsからノード数の 上限・下限を取得 PodとNodeをWatch • Podのrequestsの総数に対してNodeが 足りているか確認 • 足りていなければMachineDeploymentの replicasを増やす
  21. 障害時のCluster Autoscalerの挙動
 • NotReadyなNodeはCluster Autoscalerにおいて
 有効なキャパシティとして計算されない
 ⇒ replicasを増やして新しいNodeをデプロイする
 51 Management

    Cluster Workload Cluster Core Cluster API Cluster API Provider OpenStack OpenStack VM Node Cluster Autoscaler Controller Machine Deployment Machine Deployment Machine Deployment Machine
  22. まとめ
 52 • GKEの手法はkubernetesのリポジトリに結構眠っている
 ◦ Autopilotは全然わかりませんでした 
 • Nodeの再起動をするコントローラは奥が深い
 •

    cloud-init + OverlayFSで手軽にfilesystemのロールバックを実現
 • Cluster Autoscalerがあればクラスタのキャパシティは確保可能
 ぜひ皆さんもNodeの自動修復を!!!!