Kubernetes を 2500 ノードに拡張する際に発生する問題と解決策

Kubernetes を 2500 ノードに拡張する際に発生する問題と解決策

Kubernetes はバージョン 1.6 以降、5,000 を超えるノードをサポートできると主張していますが、数十から 5,000 までのノード数の増加に伴い、問題が発生することは避けられません。

この記事では、Kubernetes 5000 への道のりにおける Open API の経験、遭遇した問題、問題解決の試み、実際の問題の発見などについて説明します。

[[227083]]

遭遇した問題とその解決方法

質問1: 1〜500ノード後

質問:

kubectl がタイムアウトすることがあります (ps kubectl -v=6 ですべての API の詳細を表示できます)

解決を試みる:

  • 最初は kube-apiserver サーバーの負荷に問題があると思ったので、負荷分散を支援するためにプロキシをレプリカとして追加してみました。
  • しかし、バックアップ マスターが 10 個を超えると、問題は kube-apiserver が負荷に耐えられないことによるものではないことがわかります。 GKE は 32 コアの VM で 500 ノードをサポートできます。

理由:

上記の理由を除いて、マスター上の残りのサービス(etcd、kube-proxy)の確認を開始します。

  • etcdの調整を開始する
  • Datadog を使用して etcd スループットをチェックすると、異常なレイテンシが見つかりました (レイテンシの急上昇 ~100 ms)
  • Fio ツールを使用してパフォーマンスを評価したところ、IOPS (1 秒あたりの入力/出力) の 10% しか使用されておらず、書き込み遅延 (書き込み遅延 2 ミリ秒) によりパフォーマンスが低下していることがわかりました。
  • 各マシンのSSDをネットワークハードドライブからローカル一時ドライブ(SSD)に変更してみてください。
  • ~100msから200usまでの結果

質問2: ノードが約1000個ある場合

質問:

kube-apiserverはetcdから毎秒500MBを読み込むことが判明した。

解決を試みる:

  • Prometheus を通じてコン​​テナ間のネットワーク トラフィックを表示する

理由:

  • FluentdとDatadogは各ノードのデータを頻繁にクロールしていることが判明した。
  • 2 つのサービスのクロール頻度を減らすと、ネットワーク パフォーマンスは 500 MB/秒からほぼゼロに低下しました。

etcd のヒント: --etcd-servers-overrides を使用すると、Kubernetes イベント データをセグメントとして書き込み、異なるマシンで処理することができます (以下を参照)。

  1. --etcd-servers-overrides=/events#https://0.example.com:2381;https://1.example.com:2381;https://2.example.com:2381  

問題3: 1000~2000ノード

質問:

これ以上データを書き込めません。エラーが連鎖的に発生しました

kubernetes-ec2-autoscalerは、すべてのetcdが停止した後にのみ問題を返し、すべてのetcdをシャットダウンします。

解決を試みる:

  • etcd ハードディスクがいっぱいになっていると思いますが、SSD をチェックしたところ、まだ十分なスペースがあります。
  • 事前に設定されたスペース制限があるかどうかを確認し、2GBのサイズ制限があることを確認します。

解決:

  • etcd 起動パラメータに --quota-backend-bytes を追加します。
  • kubernetes-ec2-autoscaler ロジックを修正 - 50% を超える問題がある場合は、クラスターをシャットダウンします

各種サービスの最適化

Kubeマスターの高可用性

一般的に言えば、私たちのアーキテクチャは、kube-master (kube-apiserver、kube-scheduler、kube-control-manager を含む主要な Kubernetes サービス プロバイダー コンポーネント) と複数のスレーブで構成されます。ただし、高可用性を実現するには、次の方法を参照してください。

  • kube-apiserverは複数のサービスを設定し、再起動してパラメータ--apiserver-countを設定する必要があります。
  • kubernetes-ec2-autoscaler はアイドル状態のリソースを自動的にシャットダウンするのに役立ちますが、これは Kubernetes スケジューラの原則に反します。ただし、これらの設定により、リソースを最大限に集中させることができます。

  1. {
  2. 「種類」 : 「ポリシー」
  3. 「apiバージョン」 : 「v1」
  4. 「述語」 : [
  5. { "name" : "GeneralPredicates" },
  6. { "名前" : "MatchInterPodAffinity" },
  7. { "名前" : "NoDiskConflict" },
  8. { "名前" : "NoVolumeZoneConflict" },
  9. { "名前" : "PodToleratesNodeTaints" }
  10. ]、
  11. 「優先順位」 : [
  12. { "名前" : "MostRequestedPriority" , "重み" : 1},
  13. { "名前" : "InterPodAffinityPriority" "重み" : 2}
  14. ]
  15. }

上記はKubernetesスケジューラを調整する例です。 InterPodAffinityPriority の重みを増やすことで、目標を達成できます。参考までに、その他の例もご覧ください。

現在の Kubernetes スケジューラ ポリシーは動的切り替えをサポートしておらず、kube-apiserver を再起動する必要があることに注意してください (問題: 41600)

スケジューラポリシーの調整による影響

OpenAIはKubeDNSを使用していましたが、すぐに

質問:

DNS クエリが頻繁に失敗する (ランダムに発生する)

約200QPS以上のドメイン検索

解決を試みる:

  • なぜこのようなことが起こるのかを調べようとしたところ、一部のノードで 10 個を超える KuberDNS が実行されていることがわかりました。

解決:

  • スケジューラポリシーにより、多くのPODが集中する
  • KubeDNS は非常に軽量で、同じノードに簡単に割り当てることができるため、ドメイン検索が集中化されます。
  • POD アフィニティ (関連する紹介) を変更し、KubeDNS を別のノードに割り当てる必要があります。

  1. 親和性:
  2. ポッドアンチアフィニティ:
  3. スケジュール中は必須、実行中は無視:
  4. -重量: 100
  5. ラベルセレクター:
  6. 一致表現:
  7. -キー: k8s-app
  8. 演算子:  
  9. - kube-dns
  10. トポロジキー: kubernetes.io/ホスト名

新しいノードを作成するときにDockerイメージのプルが遅くなる

質問:

新しいノードが構築されるたびに、Dockerイメージのプルに30分かかります

解決を試みる:

  • 約 17 GB の大きなコンテナ イメージ Dota があり、ノード全体のイメージのプルに影響を及ぼします。
  • kubeletに他のイメージプルオプションがあるかどうかの確認を開始する

解決:

  • kubelet にオプション --serialize-image-pulls=false を追加してイメージのプルを有効にし、他のサービスが早くプルできるようにします。
  • このオプションでは、docker storgae を overlay2 に切り替える必要があります。
  • また、DockerイメージをSSDに保存すると、イメージのプルが速くなります。

補足: ソーストレース

  1. // serializeImagePulls を有効にする、Kubelet に画像を 1 つずつプルするように指示します。
  2. //一度.ノードデフォルトを変更しないことを推奨します
  3. //バージョン 1.9 未満docker デーモンまたはAufs ストレージ バックエンドを実行します。
  4. // 問題 #10959 に詳細が記載されています。
  5. SerializeImagePulls *bool `json: "serializeImagePulls" `

Dockerイメージのプル速度の向上

さらに、次の方法でプル速度を向上させることもできます。

  • kubeletパラメータ--image-pull-progress-deadlineを30分に増やす必要があります。
  • マルチスレッドダウンロードを有効にするには、dockerデーモンパラメータmax-concurrent-downloadを10に調整する必要があります。

ネットワークパフォーマンスの向上

フランネルのパフォーマンスの限界

OpenAIノード間のネットワークトラフィックは10~15GBit/sに達する可能性がありますが、Flannelによりトラフィックは2GBit/sまで低下します。

解決策は、フランネルを削除し、実際のネットワークを使用することです

  • ホストネットワーク: true
  • dnsポリシー: ClusterFirstWithHostNet

<<:  マルチクラウド戦略で避けるべき 5 つの間違い

>>:  この記事では、「エッジコンピューティング」とモノのインターネットの密接な関係について説明します。

推薦する

Kubernetes 上の Kafka のマルチクラスター展開を簡素化

翻訳者 |李睿レビュー |チョンロウApache Kafka (Kafka とも呼ばれる) は、Ap...

ITOps がクラウドに移行するのはなぜですか?

今日、企業の IT は大きな変化を遂げています。 Splunk による SignalFx の買収やソ...

回復力と拡張性に優れたクラウドネイティブアプリケーションを構築する

クラウドネイティブ アプリケーション設計により、ソフトウェア エンジニアは顧客のニーズを満たすことに...

クラウドコンピューティングのキーテクノロジー「仮想化技術」を探る

企業が成長するにつれて、ビジネスとアプリケーションは増加し続け、IT システムの規模はますます大きく...

JVM メモリ領域に関する面接の質問でまた負けたと聞きました。この記事をチェックしてください!

基本的な質問Javaメモリ領域(ランタイムデータ領域)の紹介Java オブジェクトを作成するプロセス...

AdMaster TechnologyのLiu Zhe氏:クラウドを使用するかどうかは需要次第

中国電子技術標準化研究所が主催し、51CTOが主催する「第7回中国クラウドコンピューティング標準およ...

Kubernetes がコンテナ戦争に勝利する方法

[[281345]]背景パースPaaS テクノロジーを一言でまとめると、「アプリケーション ホスティ...

見逃していたマーケティング手法!

ウェブサイトの立ち上げ、新製品の発売、製品の在庫一掃、季節外れの商品、価格競争など、さまざまな理由か...

VMware は高度な自動化を使用してハイブリッド ワークスペースを簡素化します

ほとんどの企業は、ハイブリッド ワーキング モデルをすでに実装しているか、将来的に実装する予定です。...

WeChat販売のウォームアップと成熟

著者には、わずか半年でWeChatプラットフォームを利用して古い顧客グループを集めたNikoという友...

天一クラウドは、技術革新を通じて、セキュリティ、信頼性、ユビキタス性、包括性に向けたクラウド開発を推進しています。

5月17日は世界電気通信デーです。中国電信天一クラウドは「赤い雲天一、安全で包括的」をテーマに、オン...

B2B 電子商取引開発会社の分析! B2Bモールシステムの開発・構築の基準は以下のとおりです。

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますB2B開発...

Hujiang.comの副社長がデジタル出版分野におけるHujiang.comの鮮明な事例を紹介

12月15日、internet2share.comは上海でデジタル出版の今後の発展の道についてのサロ...

初心者の SEO 担当者は、日々の最適化作業を適切に実行するにはどうすればよいでしょうか?

SEO(検索エンジン最適化)、または検索エンジン最適化とは、簡単に言えば、適切な手段を使用してウェブ...

道威道:動画サイトの著作権調査:中小規模の動画サイトが抑制される

著作権戦争(TechWeb の写真)動画サイトでの人気テレビ番組の再生状況調査(TechWebチャー...