この記事では、HAProxy や Keepalived、Ansible に依存せずに、1 つのコマンドで Kubernetes 高可用性クラスターを構築する方法を説明します。 apiserver の負荷分散はカーネル IPVS を通じて実行され、apiserver の健全性検出が提供されます。アーキテクチャを下の図に示します。 このプロジェクトは sealos と呼ばれ、高可用性インストールを適切にサポートできる、シンプルでクリーン、軽量で安定した Kubernetes インストール ツールを目指しています。実際、強力なものを作るのは難しくありませんが、それを極めてシンプルで柔軟性があり、スケーラブルなものにするのはより困難です。したがって、実装中はこれらの原則に従う必要があります。 設計原則sealos の特徴と利点:
Ansible を使わないのはなぜですか?バージョン 1.0 は確かに Ansible を使用して実装されていますが、ユーザーはまず Ansible をインストールする必要があり、Ansible をインストールするには Python といくつかの依存関係をインストールする必要があります。ユーザーの手間を省くために、Ansible はコンテナーに配置されて使用されます。キーレス使用を設定せず、ssh-pass などが必要な場合は、私にとっては満足のいくものではなく、私が望むミニマリストではありません。 そこで、依存関係のないバイナリ ファイル ツールを考案したいと考えました。ファイル配布やリモートコマンドは SDK を呼び出すことで実装されるため、他に依存することはありません。強迫性障害の私はこれでようやく満足しました。 Keepalived と HAProxy を使用しないのはなぜですか?HAProxyをstatic podで動かす場合、大きな問題はなく、管理も比較的容易です。 Keepalived 用のオープンソース Ansible スクリプトのほとんどは、yum や apt などでインストールされますが、これは非常に制御しにくく、次のような欠点があります。
そこで、この問題を解決するために、コンテナ内で Keepalived を実行しました (コミュニティが提供するイメージは基本的に利用できません)。変革の過程では多くの問題が発生しましたが、幸いなことに最終的には解決されました。 結局のところ、私はそれにうんざりしていたため、HAProxy と Keepalived を削除して、よりシンプルで信頼性の高いソリューションを見つけられないかと考えていましたが、実際にそれを見つけました。 ローカルワークロードに Envoy または Nginx を使用しないのはなぜですか?高可用性の問題はローカル負荷を通じて解決します。 ローカル負荷を説明すると、各ノードでロード バランサーが起動され、アップストリームは 3 つのマスターです。 IPVS、Envoy、Nginx など、負荷分散方法は多数あります。最終的にカーネル IPVS を使用します。 Envoy のようなロード バランサーを使用する場合は、各ノードでプロセスを実行する必要があり、これによりリソースがさらに消費されるため、望ましくありません。 IPVS は実際には追加のプロセス LVScare も実行しますが、LVScare は IPVS ルールの管理のみを担当します。 kube-proxy と同様に、実際のトラフィックは依然として非常に安定したカーネルを通過するため、処理のためにパケットをユーザー モードに投入する必要はありません。 アーキテクチャ実装に問題があり、Envoy や他のシステムの使用が非常に困難になっています。つまり、参加時に負荷分散が確立されていない場合はスタックしてしまい、kubelet が起動しなくなります。したがって、最初に Envoy を起動する必要があります。つまり、静的ポッドを使用して Envoy を管理することはできません。これは、上記の Keepalived ホストの展開と同じ問題です。静的ポッドを使用すると、相互依存と論理デッドロックが発生します。鶏は卵が先だと言い、卵は鶏が先だと言います。結局、誰も望むものを手に入れることはできない。 IPVS を使用する場合は異なります。参加する前に IPVS ルールを設定し、参加してルールを保護できます。 apiserver にアクセスできなくなると、すべてのノード上の対応する IPVS ルールは自動的にクリアされ、マスターが通常の状態に戻ったときに再度追加されます。 kubeadm をカスタマイズする理由は何ですか?まず、kubeadm は証明書の有効期限をハードコードしているため、これを 99 年にカスタマイズする必要があります。ほとんどの人は自分で新しい証明書に署名できますが、私たちは個別のツールに依存したくないので、ソースコードを変更するだけです。 次に、参加時に 2 つのことを行う必要があるため、ローカル ロードを実行するときに kubeadm コードを変更するのが最も便利です。 1 つ目は参加前に IPVS ルールを作成すること、2 つ目は静的ポッドを作成することです。 kubeadm をカスタマイズしないと、静的 Pod ディレクトリがすでに存在するというエラーが報告されます。このエラーを無視するのは賢明ではありません。そして、kubeadm は、この機能を実装するための非常に便利な SDK をいくつか提供しています。 これを実行すると、コア機能が kubeadm に統合され、sealos は上位レベルのコマンドを配布および実行するための軽量ツールになります。ノードを追加するときに、kubeadm を直接使用することもできます。 チュートリアル依存関係をインストールする
インストール マルチマスター HA の場合は、次のコマンドを実行します。
そして、他には何もありません...はい、高可用性クラスターがインストールされました。混乱していると感じますか?とても簡単で早いです! 単一マスターと複数ノード:
キーレスまたはキーペアを使用します:
パラメータの説明:
その他のパラメータ:
インストールが正常かどうかを確認します。
ノードの追加 まず、join コマンドを取得し、マスター上で実行します。
super kubeadm を使用することもできますが、参加するときに --master パラメータを追加する必要があります。
sealos join コマンドを使用することもできます:
カスタム kubeadm 構成ファイルの使用たとえば、ドメイン名 sealyun.com を証明書に追加するなど、kubeadm 構成ファイルをカスタマイズする必要がある場合があります。 まず、構成ファイル テンプレートを取得する必要があります。
次に、kubeadm-config.yaml.tmpl を変更し、sealyun.com を構成に追加します。
注: 他の部分を変更する必要はありません。sealos がテンプレートのコンテンツを自動的に入力します。 最後に、--kubeadm-config を使用して、デプロイ中に構成ファイル テンプレートを指定します。
バージョンアップグレードこのチュートリアルでは、バージョン 1.14 から 1.15 へのアップグレードを例に説明します。他のバージョンの原理も同様です。これを理解したら、公式チュートリアルを参照してください。 アップグレードプロセス
kubeadm のアップグレード オフライン パッケージをすべてのノードにコピーし、cd kube/shell && sh init.sh を実行します。ここで、kubeadm、kubectl、kubelet のバイナリ ファイルが更新され、より高いバージョンのイメージがインポートされます。 コントローラーノードのアップグレード
kubelet を再起動します。
実際、kubelet のアップグレードは非常に単純かつ大まかです。新しいバージョンの kubelet を /usr/bin にコピーし、kubelet サービスを再起動するだけです。プログラムが使用中で上書きが許可されていない場合は、kubelet を停止してからコピーしてください。 kubelet bin ファイルは conf/bin ディレクトリにあります。 他の制御ノードをアップグレードします。
ノードのアップグレード ノードを削除します (状況によって異なりますが、必要に応じて直接実行できます)。
kubelet 設定を更新します。
次に、kubelet をアップグレードします。また、バイナリを置き換えて、kubelet サービスを再起動します。
失われた愛を思い出す:
確認する
バージョン情報が正しければ、アップグレードは基本的に成功します。 kubeadm upgrade apply は何をしますか?
ソースコードのコンパイル netlink ライブラリが使用されるため、次の 1 つのコマンドのみを使用してコンテナー内でコンパイルすることをお勧めします。
go mod を使用している場合は、ベンダーコンパイルを指定する必要があります。
アンインストール
シーロス実装原則実行プロセス
ノードは仮想 IP を介して複数のマスターに接続する必要があるため、apiserver へのすべてのリクエストはドメイン名を介してアクセスされます。 apiserver にアクセスするための各ノードの kubelet と kube-proxy の仮想アドレスは異なり、kubeadm は構成ファイルで 1 つのアドレスしか指定できないため、ドメイン名が使用されますが、各ノードによって解決される IP は異なります。 IP アドレスが変更された場合は、解決アドレスを変更するだけで済みます。 ローカルカーネル負荷 このようにして、各ノードはローカル カーネル ロード バランシングを通じてマスターにアクセスできます。
IPVS を保護するために、ノード上で LVScare の静的ポッドが開始されます。 apiserver にアクセスできなくなると、すべてのノード上の対応する IPVS ルールは自動的にクリアされ、マスターが通常の状態に戻ったときに再度追加されます。 ノードに次の 3 つの項目を追加すると、直感的にわかります。
kubeadm のカスタマイズ sealos は kubeadm にほとんど変更を加えず、主に証明書の有効期限を延長し、join コマンドを拡張しました。以下では主に join コマンドの変換について説明します。 まず、マスター アドレス リストを指定するために、join コマンドに --master パラメータを追加します。
この方法で、IPVS ロード バランシングを実行するためのマスター アドレス リストを取得できます。 制御ノードでも単一のマスターでもない場合は、IPVS ルールのみを作成します。コントロール ノード上に作成する必要はなく、独自の apiserver に接続するだけです。
次に、IPVS を保護するために lvscare 静的ポッドを作成します。
そのため、sealos を使用しない場合でも、カスタマイズされた kubeadm を直接使用してクラスターをデプロイできますが、少し面倒です。インストール手順は以下の通りです。 kubeadm 構成ファイル:
master0 で次のコマンドを実行します (vip アドレスが 10.103.97.100 であると仮定)。
master1 で次のコマンドを実行します (vip アドレスが 10.103.97.101 であると仮定)。
master2 で次のコマンドを実行します (vip アドレスが 10.103.97.102 であると仮定)。
ノードに参加するときは、--master パラメータを追加してマスター アドレス リストを指定します。
オフラインパッケージ構造分析
|
<<: セキュリティを犠牲にすることなくDevOpsをクラウドに移行する方法
>>: 最新のクラウド コンピューティング セキュリティのベスト プラクティスを適用する方法
新しい技術用語が継続的に出現することは避けられませんが、現在最も人気のある用語はエッジ コンピューテ...
翻訳者 |李睿校正 |孫淑娟 梁策企業や組織は毎年末に、事業規模の拡大やクラウドコストの削減など、翌...
現在、多くの初心者は、セクションや機能の追加、URL構造の変更など、Webサイトの関連情報の変更に注...
11月4日のウェブマスターネットワーク(www.admin5.com)によると、アリババは最近、アリ...
エッジ コンピューティングは、スーパー クラウド コンピューティングの次のステップです。データ需要が...
昨日、第11期全国人民代表大会常務委員会第30回会議で投票が行われ、ネットワーク情報の保護強化に関す...
Hostyunは最近、香港のクラウドデータセンターに「[Hong Kong AMD-Puhui]」と...
この記事では、JVM メモリ モデル、クラス ローダー、GC 回復アルゴリズム、GC コレクターなど...
racknerd は、ロサンゼルスの multacom データ センター (DC-02) に設置され...
インターネットは急速に発展していますが、バナーを使用して商品を宣伝することが依然として最善の方法です...
世界最高のギターのウェブサイトをデザインしている自分を想像してみてください。このサイトには、さまざま...
ウェブマスター業界でソフト記事が人気を博すにつれ、刷新されたソフト記事チェーンも登場しました。新世代...
こんな風に感じたことはありませんか。Baidu で何かや質問を検索したとき、返される結果が満足のいく...
Zenlayerはトルコに独自のデータセンターを持ち、トルコのクラウドサーバー、トルコの独立サーバー...
みなさんこんにちは。私はHongtu Internetです。 2 か月前、下水道ウェブサイトの最適化...