KubeCon Recap-Platform migration at Scale-Kubernetes Meetup #51Kohei Ota, Architect at HPE/CNCF Ambassador
View Slide
© 2022 Cloud Native Computing Foundation2自己紹介Kohei Ota (@inductor)•Architect at HPE•CNCF Ambassador•KubeCon EU 2022 Track co-chair (Operation)•Google Developer Expert (GCP)•CloudNative Days Tokyo organiser•Container Runtime Meetup organiser
© 2022 Cloud Native Computing Foundation3Session info of this recap1. Mercedes-Benzの事例a. Keynote: 7 Years of Running Kubernetes forMercedes-Benzb. How to Migrate 700 Kubernetes Clusters toCluster API with Zero Downtime2. 稼働中のコンテナランタイムを変更した事例a. Keep Calm and Containerd On! by Intuit Inc
Migrating 700 Kubernetes Clusters toCluster API with Zero Downtime after 7years operation at Mercedes-Benz
7年間稼働してきたメルセデスベンツの700にもわたるクラスターを、ダウンタイムなしでCluster APIに移行した事例
© 2022 Cloud Native Computing Foundation6
© 2022 Cloud Native Computing Foundation7
© 2022 Cloud Native Computing Foundation8
© 2022 Cloud Native Computing Foundation92015年ごろからOpenStack上に複数のKubernetesクラスターを運用移行当時は計700個近くのクラスターがOpenStack基盤の地域に点在現在は900近くまで増えた🎉
© 2022 Cloud Native Computing Foundation10エンタープライズ規模でのFOSS(Fully Open Source)● ダイムラーでもかつてはクローズドな技術スタックを使っていた● 2014年ごろから自動化を含めOSSをエンタープライズで使うための取り組みをGreen field approachを用いて開始● オープンソース利用のガイドラインを策定○ https://opensource.mercedes-benz.com/manifesto/● コミュニティへの貢献を怠らない
インフラ構成 (Before/After)
© 2022 Cloud Native Computing Foundation12
© 2022 Cloud Native Computing Foundation13OpenStack + Terraformで仮想マシンの管理AnsibleでOS上のランタイムを展開💡VM時代の典型的な管理方法
© 2022 Cloud Native Computing Foundation14
© 2022 Cloud Native Computing Foundation15Cluster APIでクラスターの管理カスタムコントローラーとFluxCDの組合せ💡GitOpsでKubernetesネイティブな管理方法
Why Cluster API?
© 2022 Cloud Native Computing Foundation17
© 2022 Cloud Native Computing Foundation18Cluster APIを使うと...1. クラスターのライフサイクル2. クラスターに参加するマシンの管理3. 構成設定(kubeadm config)これらがすべてKubernetesのCRDで管理できる
© 2022 Cloud Native Computing Foundation19Cluster APIを使うと...1. クラスターのライフサイクル2. クラスターに参加するマシンの管理3. 構成設定(kubeadm config)これらがすべてKubernetesのCRDで管理できるCluster API Providerの存在が大きいAWS/GCP/Azure/OpenStackvSphere/Dockerなど、APIのあるIaaSでノードをセットアップできる仕組みhttps://cluster-api.sigs.k8s.io/reference/providers.html
© 2022 Cloud Native Computing Foundation20
© 2022 Cloud Native Computing Foundation21管理用クラスターの亀 (Cluster API)の力を使って、全ゾーンの中で最大 200近くのワークロードクラスターを集約して管理するようになった
© 2022 Cloud Native Computing Foundation22管理用クラスターの亀 (Cluster API)の力を使って、全ゾーンの中で最大 200近くのワークロードクラスターを集約して管理するようになった200ものクラスターを既存の Terraform +Ansibleで管理するくらいだったら ClusterAPIでシュッてやりたい気持ちは本当にそうだねという感じ
ゼロダウンタイムに関する考慮事項
© 2022 Cloud Native Computing Foundation24ゼロダウンタイムの要件と実現方法● 要件○ ユーザー(クラスター利用者/開発者)はワークロードのデプロイが不要○ コントロールプレーン・ワーカーどちらも無停止で実施● Why?○ 基盤の根本技術を変えるというインフラの理由でワークロードを停止させるべきでない○ 開発環境やバッチ処理など様々なワークロードが世界中にある● 実現方法○ OpenStackで管理されているKubernetesクラスターのVM、ルーター、LBaaSなどのオブジェクトをTerraformによる管理からCluster API管理に置換○ クラスターの構成管理はAnsible + kubeadmだが、そこも全部Cluster API管理に置換
© 2022 Cloud Native Computing Foundation25ゼロダウンタイムの要件と実現方法● 要件○ ユーザー(クラスター利用者/開発者)はワークロードのデプロイが不要○ コントロールプレーン・ワーカーどちらも無停止で実施● Why?○ 基盤の根本技術を変えるというインフラの理由でワークロードを停止させるべきでない○ 開発環境やバッチ処理など様々なワークロードが世界中にある● 実現方法○ OpenStackで管理されているKubernetesクラスターのVM、ルーター、LBaaSなどのオブジェクトをTerraformによる管理からCluster API管理に置換○ クラスターの構成管理はAnsible + kubeadmだが、そこも全部Cluster API管理に置換💡`terraform import` みたいなやつで メタデータを取り込めば実現できそう
© 2022 Cloud Native Computing Foundation26メタデータの移行● すべてのOpenStackリソースはTerraformで管理されている● OpenStack上にはAnsible + kubeadmで作られたクラスターが既にある● Cluster APIはInfra Providerによるインフラリソースのカスタムリソース管理と、クラスター自体の管理をkubeadmの力で実現している→ Terraform stateにあるマシンのメタデータをCluster API Provider OpenStackに食わせて、kubeadm configをKubeadmControlPlaneに食わせればええやん!!!
クラスター移行のステップ
© 2022 Cloud Native Computing Foundation28
© 2022 Cloud Native Computing Foundation291. OpenStack側のメタデータをCluster APIのオブジェクトに置換2. ワーカーノード及びマシンセットをCluster APIのオブジェクトに置換3. コントロールプレーンとKubeadmの構成情報をCluster APIのオブジェクトに置換
© 2022 Cloud Native Computing Foundation30
© 2022 Cloud Native Computing Foundation31
© 2022 Cloud Native Computing Foundation32
© 2022 Cloud Native Computing Foundation33
© 2022 Cloud Native Computing Foundation34
© 2022 Cloud Native Computing Foundation35そんなこんなでクラスターの移行自体は完了・OpenStack上のリソース・Kubernetesの構成設定の両方がKubernetesのカスタムリソースで管理できるようになった🥳🥳
学びと今後の予定
© 2022 Cloud Native Computing Foundation37移行作業時の学び● ちゃんとゼロダウンタイムだったのか?○ クラスター: Yes○ ワークロード: No● なんで?○ Pod Disruption Budgets(PDB)などの、利用者側で仕込んでおくべき設定が入っていないワークロードが存在○ クラスターのバージョンアップ時などに停止時間が発生(Node drain処理)○ Cluster API側でできること■ Pre-Drain/Pre-Terminateアノテーションの付与■ Cluster APIのカスタムコントローラー側で、クラスター構成変更に伴って発生する drainやボリュームデタッチなどの処理について考慮してくれるようになる● クラスター移行はちゃんと演習しておきましょう○ 完全自動化された日常的なビルドテスト■ レガシー構成からCluster APIへの移行■ Cluster APIを用いた新規クラスターの作成やバージョンアップなど
© 2022 Cloud Native Computing Foundation38今後の展望● AnsibleからFluxへの完全な移行● Cluster API 新機能の導入● Cluster API Metrics Exporterへの貢献● 既存基盤と同じ利用ができるような仕組みを備えた上でパブリッククラウド利用も視野に
Migrating Running Docker toContainerd at Scale
そこそこの規模で稼働中のDockerをContainrdに置き換える話
© 2022 Cloud Native Computing Foundation41Intuitのインフラについて● 財務関係のSaaS・ソフトウェアを展開するテックカンパニー● 200以上のクラスター● 16000以上のノード● 5000人以上の開発者が利用
© 2022 Cloud Native Computing Foundation42
© 2022 Cloud Native Computing Foundation43Kubernetes 1.24で削除されるDockershim● DockershimはKubernetes上でDockerを動作させるためのブリッジインターフェース(Docker API <-> CRI)● CRIで標準化されたランタイム規格はDocker自体とは関連がない(そもそもDockerはKubernetesよりも昔から存在するため)● CRIネイティブなContainerdやCRI-Oが十分枯れてきたため、メンテナンスコストが高いDockershimをKubernetesのメインストリームから排除することでコード量が大幅に削減される○ https://qiita.com/y1r96/items/37483ffd17e21f060331
© 2022 Cloud Native Computing Foundation44
© 2022 Cloud Native Computing Foundation46
© 2022 Cloud Native Computing Foundation47
© 2022 Cloud Native Computing Foundation48主な影響範囲● Logging (JSON -> TEXT format)● Docker CLI (CLIが変わるだけなので割愛)● kubelet config (設定変更だけなので割愛)● CNI(時間があれば後で詳しく説明します)
Logging
© 2022 Cloud Native Computing Foundation50Docker logging vs CRI logging● Fluentd DaemonSetsをクラスターアドオンとしてデプロイ○ ログの収集、パース、アグリゲーターへの転送を担当● Fluentdで収集するログの中でもコンテナログが最も重要度が高い○ Docker -> Containerdでロギングフォーマットが変更された
© 2022 Cloud Native Computing Foundation51
© 2022 Cloud Native Computing Foundation52● CRIのログには標準フォーマットがある○ “timestamp stream tag logMessage”○ fluentdでフォーマットを定めて解決● パースの処理をfluentdでさせたらパフォーマンスの劣化を観測● DaemonSetのfluentdはPodで動くので、上記設定は事前に反映しておかないとログの欠損が発生
CNIに関する考慮
© 2022 Cloud Native Computing Foundation54Node NodeNodePod Pod Pod PodKubernetesネットワークの構成要素: CNIPod network(overlay)Service Network(overlay)Node Network(not overlay)veth veth veth vetheth0 eth0 eth0CNI (Container Network Interface)1. ノードネットワークの疎通性を担保(VXLAN/BGP/クラウドのVPCなどのSDN)2. Podに仮想NICを割当3. PodのIPアドレスを割当
© 2022 Cloud Native Computing Foundation55CNIについて● 外の世界のネットワークとKubernetesのネットワークをつなげる役割○ クラウドのVPCやノードの制御に使うBGP、あるいはVXLANなどのホストレベルのネットワークを認識できる● 各Podに割り当てる仮想NICの管理○ コンテナ作成時にランタイムが作ったNW namespaceに対してvNICをアタッチ● 各PodのIPアドレス管理(要するにIPAM)○ コンテナは揮発性が高いので、CNIがIPAMのデーモンを管理してIPアドレスを管理し、Serviceのエンドポイント情報を書き換える
© 2022 Cloud Native Computing Foundation56CNIについて● 外の世界のネットワークとKubernetesのネットワークをつなげる役割○ クラウドのVPCやノードの制御に使うBGP、あるいはVXLANなどのホストレベルのネットワークを認識できる● 各Podに割り当てる仮想NICの管理○ コンテナ作成時にランタイムが作ったNW namespaceに対してvNICをアタッチ● 各PodのIPアドレス管理(要するにIPAM)○ コンテナは揮発性が高いので、CNIがIPAMのデーモンを管理してIPアドレスを管理し、Serviceのエンドポイント情報を書き換える今回のポイント
© 2022 Cloud Native Computing Foundation57CNI IPAM-Dのライフサイクル● KubernetesでPodを作成するとき、内部的にはkubeletがCRIランタイムに命令を発行○ CRIランタイムでは、コンテナ作成時にnamespaceを作成し、CNIのIPAMが利用可能なアドレスをそこに割り当てる
© 2022 Cloud Native Computing Foundation58CNI IPAM-Dのライフサイクル● KubernetesでPodを作成するとき、内部的にはkubeletがCRIランタイムに命令を発行○ CRIランタイムでは、コンテナ作成時にnamespaceを作成し、CNIのIPAMが利用可能なアドレスをそこに割り当てる同じノード上で明示的にランタイムを変えると、既存のコンテナが見えなくなるので一時的にいなかったことになってしまう(IPAMが壊れる)
© 2022 Cloud Native Computing Foundation59
© 2022 Cloud Native Computing Foundation60ジェネリックな名前でランタイムを指定することで、kubeletとCNIがそこの変更を意識しなくてもいいようにする
性能変化
© 2022 Cloud Native Computing Foundation62
© 2022 Cloud Native Computing Foundation63一応ちゃんとよくなった、らしい。
まとめ
© 2022 Cloud Native Computing Foundation65所感● 今回はBlue GreenやCanaryではなくin-placeで全部を移行する事例を紹介● Cluster APIに移行する方法はかなり知恵を絞った感じがして面白い● ランタイム移行のアプローチも王道といえば王道だが、ノードを作成して入れ替えてもよさそうなのにin-placeでやったのはかなり頑張ったなと思った○ 実際に確認したわけではなく想像だが、ノード数・クラスタ数ともに規模が大きいのでインフラコストも新規作成の管理コストもかさむことを懸念したのかなと思う
© 2022 Cloud Native Computing Foundation66参考資料● 前半事例(Cluster API)の資料○ https://static.sched.com/hosted_files/kccnceu2022/10/KubeConEU22_MBTI_ClusterAPI_Migrate_700_Clusters.pdf● 前半事例(ランタイム)の資料○ https://static.sched.com/hosted_files/kccnceu2022/2a/Containerd_KubeCon_EU_2022.pdf○動画リンクは現時点ではまだ上がっていないので割愛
Thank you for your attention!The CNCF aims to help end users connect with other end users, recruit talent, and adoptcloud native successfully in a vendor neutral environment.