SlideShare a Scribd company logo
Kubernetesのワーカーノードを

自動修復するために必要だったこと

CyberAgent - Hiroki Kawahara

CloudNative Days Tokyo 2021

自己紹介

● 川原 大輝(かわはら ひろき)

● 2021年4月入社

● CyberAgent group Infrastructure Unit所属

● 自宅ラック勢

○ Kubernetes

○ ZFS

○ Minio

○ MySQL

○ Elastic Cloud on Kubernetes

○ Harbor

○ 僕の考える最強のクラウドストレージ


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
Kubernetesの全体像

4
https://kubernetes.io/ja/docs/concepts/overview/components/
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を管理するためのクラスタ

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を管理するためのクラスタ

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に

ジョインさせる

そもそもNodeの障害とは?

8
KubernetesにおけるNodeのNotReady

9
主にこれ

※ NodeがReadyでも障害状態であることはありますが、今回は対象外です 

  弊社でも、つい最近もありました :innocent: 

NodeのCondition

● Nodeの状態を示す

○ Type ReadyはPodが配置可能であること


○ Type DiskPressureはディスクの残容量が低下


● Type ReadyがFalse / Unknown

⇒ kubectlにおいてNotReadyと表示される

10
https://kubernetes.io/ja/docs/concepts/architecture/nodes/#condition
NodeのCondition

● Nodeの状態を示す

○ Type ReadyはPodが配置可能であること


○ Type DiskPressureはディスクの残容量が低下


● Type ReadyがFalse / Unknown

⇒ kubectlにおいてNotReadyと表示される

11
https://kubernetes.io/ja/docs/concepts/architecture/nodes/#condition
状態を確認した最後の時間

NodeのCondition

12
https://kubernetes.io/ja/docs/concepts/architecture/nodes/#condition
● Nodeの状態を示す

○ Type ReadyはPodが配置可能であること


○ Type DiskPressureはディスクの残容量が低下


● Type ReadyがFalse / Unknown

⇒ kubectlにおいてNotReadyと表示される

最後に状態遷移した時間

NodeのCondition

13
https://kubernetes.io/ja/docs/concepts/architecture/nodes/#condition
Ready な Node は True

kubeletを人為的に落としたNodeは

Unknownとなっている

なぜNodeがNotReadyになるの?

14
ノード上のコンポーネント

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
Type ReadyをFalseにしている実装

16
https://github.com/kubernetes/kubernetes/blob/0cd75e8fec62a2531637e80bb950ac9983cac1b0/pkg/kubelet/nodestatus/setters.go#L510-L539
Type ReadyをFalseに設定する実装

17
https://github.com/kubernetes/kubernetes/blob/0cd75e8fec62a2531637e80bb950ac9983cac1b0/pkg/kubelet/nodestatus/setters.go#L510-L539
container runtimeのエラーの確認

Type ReadyをFalseに設定する実装

18
https://github.com/kubernetes/kubernetes/blob/0cd75e8fec62a2531637e80bb950ac9983cac1b0/pkg/kubelet/nodestatus/setters.go#L510-L539
ノードがシャットダウン中かどうか

Type ReadyをFalseに設定する実装

19
https://github.com/kubernetes/kubernetes/blob/0cd75e8fec62a2531637e80bb950ac9983cac1b0/pkg/kubelet/nodestatus/setters.go#L510-L539
キャパシティの確認

NodeがNotReadyになる要因

● StatusがUnknown

○ kubeletがkube-apiserverに到達できていない


● StatusがFalse

○ container runtimeが異常

○ ノードがシャットダウン中

○ キャパシティの設定が間違っている


20
kubeletがkube-apiserverに到達できていない

21
Node
kubelet
container runtime
kube-apiserver ● kubeletが起動できていない

○ kubeletの設定ミス

● kubeletがハングアップ

○ kubeletの一時的な不具合

● ネットワーク的に到達できない

○ OS側の設定ミス

■ ストレージで永続化されている設定

■ ipコマンドなどの一時的な設定

○ kubeletの設定ミス

○ 外部要因

● 想定外

container
container
container
Linux Kernel
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
障害の要因まとめ

23
Node
kubelet
container runtime
kube-apiserver
container
container
container
Linux Kernel
アプリケーションのハングアップ
永続化されていない設定のミス
永続化された設定のミス
外部要因
想定外
原因がだいたいわかったところで、

自己修復する手法を考える

24
自動修復の方法

25
Node
kubelet
container runtime
kube-apiserver
container
container
container
Linux Kernel
アプリケーションのハングアップ
永続化されていない設定のミス
永続化された設定のミス
外部要因
想定外
アプリケーションの再起動
OSの再起動
filesystemのロールバック 

必要なノード数を確保
自動修復機能の対応表

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
アプリケーションの再起動

● Liveness Probeのような形で、ヘルスチェックした上で再起動

● GKEの手法がkubernetesリポジトリに含まれているので採用

27
https://github.com/kubernetes/kubernetes/blob/master/cluster/gce/gci/health-monitor.sh 

アプリケーションの再起動

● Liveness Probeのような形で、ヘルスチェックした上で再起動

● GKEの手法がkubernetesリポジトリに含まれているので採用

● 公式はCRIとDockerに対応

○ CRIに対応しているruntimeに使えるため、ContainerdとCRI-Oに対応


28
https://github.com/kubernetes/kubernetes/blob/master/cluster/gce/gci/health-monitor.sh 

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
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を再起動
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を再起動
filesystemをロールバックするにあたって

● 再起動によって間違った設定が消える必要がある

● 一部のディレクトリはロールバックしない

○ /var/log : ログは調査に利用するため、残しておく


○ /var/lib/containerd : emptyDirなどが格納されるため、可能な限り残したい


32
GKEの場合

33
https://cloud.google.com/container-optimized-os/docs/concepts/disks-and-filesystem?hl=ja (一部抜粋)
/home

/var

/etc

/tmp

/usr

その他

GKEの場合

34
https://cloud.google.com/container-optimized-os/docs/concepts/disks-and-filesystem?hl=ja (一部抜粋)
/dev/dm-0 (ro)

/dev/sda1 (rw)
 tmpfs (rw)

再起動後に消失

/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に適用される 

● コンテナの基礎技術 

ルートファイルシステムを

リードオンリーにするのは大変

36
逆に消えてもいいところだけ、

tmpfsでオーバーレイしよう!!

37
/etc/cni.net.d

/home

/var

/etc

/usr

その他

AKEv2の場合

38
/dev/vda1 (rw)

tmpfs (rw)

再起動後に消失

/dev/vda1 (bind)

起動時の動き

39
オーバーレイするtmpfs

(upper dir)を用意

起動時の動き

40
各ディレクトリを

オーバーレイしていく

起動時の動き

41
upper dirを削除

これで動くのは謎だけど、ディレクトリがきれいになる

起動時の動き

42
rootfsをリマウント

起動時の動き

43
書き込み可能にしたいディレクトリにバインド

起動時の動き

44
掃除

起動時の動き

45
このスクリプトを

いい感じのタイミングで

実行する

いいタイミングってなんだよ

46
systemdとの戦い

● 結論は以下の通り

○ local-fs.targetが完了してから各種アプリケーションが実行される


⇒ local-fs.targetの一環として先ほどのスクリプトを実行


● systemd-analyze plotで起動時の動きを確認できる

47
初回起動時

● Kubernetesの設定(/etc/kubernetes)は...

○ 永続化する必要がある

○ 書き換えられると障害につながりやすい


● kubeadmの実行後にオーバーレイする必要がある

48
⇒ cloudinitのkubeadm実行後に、

スクリプトとsystemd serviceを差し込む

オーバーレイできない一部ディレクトリについて

CNIのディレクトリ(/opt/cni/bin, /etc/cni/net.d, /usr/libexec/kubernetes) 

● kubeadmによって構成が終了したあとに、オーバーレイとCNIのインストー
ルのどちらがさきに実行されるかコントロールできない

⇒ 永続化で統一

sssd(/usr/lib/x86_64-linux-gnu/ldb/modules/ldb) 

● カーネルのバグのため、カーネルアップグレードまでの暫定措置

● SSSD on docker container (Ubuntu) - Stack Overflow 

49
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を増やす
障害時の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
まとめ

52
● GKEの手法はkubernetesのリポジトリに結構眠っている

○ Autopilotは全然わかりませんでした


● Nodeの再起動をするコントローラは奥が深い

● cloud-init + OverlayFSで手軽にfilesystemのロールバックを実現

● Cluster Autoscalerがあればクラスタのキャパシティは確保可能

ぜひ皆さんもNodeの自動修復を!!!!


More Related Content

PPTX
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
インフラCICDの勘所
PDF
Dockerからcontainerdへの移行
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
インフラCICDの勘所
Dockerからcontainerdへの移行
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー

What's hot (20)

PPTX
Dockerからcontainerdへの移行
PPTX
「おうちクラウド」が今熱い!
PDF
CloudFrontのリアルタイムログをKibanaで可視化しよう
PDF
20190911 AWS Black Belt Online Seminar AWS Batch
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
[AKIBA.AWS] VGWのルーティング仕様
PPTX
本当は恐ろしい分散システムの話
PDF
AWSではじめるDNSSEC
PDF
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
PDF
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
Kuberneteの運用を支えるGitOps
PPTX
Slurmのジョブスケジューリングと実装
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
PDF
マルチテナント化で知っておきたいデータベースのこと
PPTX
サポート エンジニアが Azure Networking をじっくりたっぷり語りつくす会
PDF
20190521 AWS Black Belt Online Seminar Amazon Simple Email Service (Amazon SES)
PDF
Serverless時代のJavaについて
PDF
AWSではじめるMLOps
Dockerからcontainerdへの移行
「おうちクラウド」が今熱い!
CloudFrontのリアルタイムログをKibanaで可視化しよう
20190911 AWS Black Belt Online Seminar AWS Batch
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
[AKIBA.AWS] VGWのルーティング仕様
本当は恐ろしい分散システムの話
AWSではじめるDNSSEC
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
コンテナ未経験新人が学ぶコンテナ技術入門
Kuberneteの運用を支えるGitOps
Slurmのジョブスケジューリングと実装
Python 3.9からの新定番zoneinfoを使いこなそう
マルチテナント化で知っておきたいデータベースのこと
サポート エンジニアが Azure Networking をじっくりたっぷり語りつくす会
20190521 AWS Black Belt Online Seminar Amazon Simple Email Service (Amazon SES)
Serverless時代のJavaについて
AWSではじめるMLOps
Ad

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

PPTX
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
PDF
Infra: Kubernetes and GKE, Network
PDF
これから始めるAzure Kubernetes Service入門
PDF
CyberAgentのインフラについて メディア事業編 #catechchallenge
PDF
【解説】IKE(IIJ Kubernetes Engine):= Vanilla Kubernetes + 何?
 
PDF
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
PDF
Kubernetes Operator for vSphere VM
PDF
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
PDF
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
PDF
k8sクラスタ構築
PDF
Rancher 2.0 Technical Preview & Bluemix Kubernetes Cluster Import
PPTX
kubetnetes etc.. & Rancher2.0 Technical Preview -import BLUMIX K8S Clusters-
PPTX
Virtual Kubelet and Virtual Node
PDF
【サイボウズ インターンシップ2025】Kubernetes基盤開発コース説明資料
PDF
Kubernetes上のWindows Server コンテナーのマイクロサービス間分離
PPTX
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]
PPTX
AKS と ACI を組み合わせて使ってみた
PDF
kpackによるコンテナイメージのビルド
PPTX
ASP.NET vNextの全貌
PDF
Kubernete超概要
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Infra: Kubernetes and GKE, Network
これから始めるAzure Kubernetes Service入門
CyberAgentのインフラについて メディア事業編 #catechchallenge
【解説】IKE(IIJ Kubernetes Engine):= Vanilla Kubernetes + 何?
 
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
Kubernetes Operator for vSphere VM
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
k8sクラスタ構築
Rancher 2.0 Technical Preview & Bluemix Kubernetes Cluster Import
kubetnetes etc.. & Rancher2.0 Technical Preview -import BLUMIX K8S Clusters-
Virtual Kubelet and Virtual Node
【サイボウズ インターンシップ2025】Kubernetes基盤開発コース説明資料
Kubernetes上のWindows Server コンテナーのマイクロサービス間分離
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]
AKS と ACI を組み合わせて使ってみた
kpackによるコンテナイメージのビルド
ASP.NET vNextの全貌
Kubernete超概要
Ad

More from h-otter (13)

PDF
自作クラウド基盤 n0stack in ICTSC 2018
PDF
自作クラウド基盤 n0stack と開発自動化の気持ち
PDF
自作クラウド基盤 n0stack と ソフトウェア開発の気持ち
PDF
自宅サーバラックの勧め 〜ファシリティ編〜
PDF
Openflowの気持ち
PDF
NiFiの紹介
PDF
ICTSC8 Backboneの紹介
PDF
給料の気持ち
PDF
自宅サーバラックの勧め ~In osc nagoya~
PDF
自宅サーバラックの勧め 簡易版
PDF
透過 L2 BRIDGE NAT
PDF
自宅サーバラックの勧め BGP4編
PPTX
MMA Tech:Talk 2017-1 仮想化技術的なあれ
自作クラウド基盤 n0stack in ICTSC 2018
自作クラウド基盤 n0stack と開発自動化の気持ち
自作クラウド基盤 n0stack と ソフトウェア開発の気持ち
自宅サーバラックの勧め 〜ファシリティ編〜
Openflowの気持ち
NiFiの紹介
ICTSC8 Backboneの紹介
給料の気持ち
自宅サーバラックの勧め ~In osc nagoya~
自宅サーバラックの勧め 簡易版
透過 L2 BRIDGE NAT
自宅サーバラックの勧め BGP4編
MMA Tech:Talk 2017-1 仮想化技術的なあれ

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