序文
実際には、実稼働環境では、高可用性は避けられない問題です。K3s自体は複数の反復を経ており、HAソリューションは、現在の比較的安定したHAソリューションを形成するために継続的に最適化されています。
現在、2つの公式HAソリューションがあります。
-
組み込みDBの高可用性(実験的)
-
外部データベースを使用して高可用性を実現
組み込みDBの高可用性は現在実験段階です。この記事ではあまり紹介しませんので、以下を参照してください。
https://rancher.com/docs/k3s/latest/en/installation/ha-embedded/
外部データベースを使用して高可用性を実現するには、高可用性の外部データベースを構築する必要があります。現在、K3sはSQLite / etcd / MySQL / PostgreSQL / DQLiteなどのデータストアをサポートしており、さまざまなデータストアがさまざまな使用シナリオに直面しています。
現在、中国で最も使用されているパブリッククラウド環境はAlibaba Cloudです。仮想マシンを使用して、AlibabaCloud上にK3sHAを構築し、Alibaba CloudのRDSに接続できるため、別のデータベースを維持する手間が省けます。この記事では、よく知られているMySQLを選択してHAの練習を行います。PostgreSQLはMySQLに似ているため、この記事では繰り返しません。
アーキテクチャ図
上に示したように、エンドユーザーはSLBにアクセスし、SLBはトラフィックをバックエンドの2つのK3マスターHAに転送します。2つのK3マスターノードは、同じRDSによって作成された外部データベースに接続します。
アリババクラウドインスタンスを作成する
K3はHAを形成するために少なくとも2つのインスタンスを必要とするため、デモンストレーションのためにAlibabaCloud上に少なくとも2つのインスタンスを作成します。
アリババクラウドRDSを構成する
1. RDSインスタンスを作成するには、インスタンスタイプを選択しますMySQL 5.7
。このバージョンはK3で正式にサポートされています。必要に応じて、他のパラメータを設定できます。
2.ホワイトリストを設定します。ホワイトリストの内容は、K3sインスタンスのイントラネットIPに設定できます。設定が成功すると、データベース接続用の内部ネットワークアドレスが取得されます。rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com
3.使用するアカウントを作成普通账号(ksd)
するに
4.データベースを作成し、データベース名(k3s)、許可されたアカウント(ksd)を設定します
dockerで起動したmysqlを使用する前に、k3sの起動時に自動的に作成されるため、事前にデータベースを作成する必要はありません。ただし、Alibaba Cloud RDSでは、K3に必要なデータベースを最初にUIで作成する必要があります。
5.データベースパラメータを変更します
データパラメータinnodb_large_prefix
をに設定する必要がありますON
。そうしないと、K3の起動時にエラーが報告されます。
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Service hold-off time over, scheduling restart.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Scheduled restart job, restart counter is at 11.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: Stopped Lightweight Kubernetes.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: Starting Lightweight Kubernetes...
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ k3s[24934]: time="2020-07-29T20:08:07.145963348+08:00" level=info msg="Starting k3s v1.18.6+k3s1 (6f56fa1d)"
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ k3s[24934]: time="2020-07-29T20:08:07.159363656+08:00" level=fatal msg="starting kubernetes: preparing server: creating storage endpoint: building kine: Error 1071: Specified key was too long; max key length is 767 bytes"
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Failed with result 'exit-code'.
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: Failed to start Lightweight Kubernetes.
後のinnodb_large_prefix
ように修正ON
し、右上隅をクリックします[終了したらパラメータを送信します。
上記の手順が完了したら、K3sに必要な外部データベースが準備されました。K3sHAを起動しましょう。
K3sHAを実現
で同じコマンドk3s-master-1
をk3s-master-2
実行します。
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_DATASTORE_ENDPOINT='mysql://ksd:your_password@tcp(rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com:3306)/k3s' \
sh -s - server
しばらくすると、K3sHA環境が開始されました。
アリババクラウド上のプルK3のミラーが遅い場合は、ミラーを構成するか、対応するバージョンのオフラインパッケージをhttp://mirror.cnrancher.comからダウンロードしてから、次のリンクを参照してミラーをインポートできます:https://rancher.com/docs / k3s / latest / en / Installation / airgap /#prepare-the-images-directory-and-k3s-binary
root@k3s-master-2:~# kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system local-path-provisioner-6d59f47c7-tshfx 1/1 Running 0 16m 10.42.0.5 k3s-master-1 <none> <none>
kube-system metrics-server-7566d596c8-mrc94 1/1 Running 0 16m 10.42.0.2 k3s-master-1 <none> <none>
kube-system coredns-8655855d6-sxn7v 1/1 Running 0 16m 10.42.0.4 k3s-master-1 <none> <none>
kube-system helm-install-traefik-cmmsr 0/1 Completed 2 16m 10.42.0.3 k3s-master-1 <none> <none>
kube-system svclb-traefik-z6vlb 2/2 Running 0 11m 10.42.0.6 k3s-master-1 <none> <none>
kube-system svclb-traefik-f89x6 2/2 Running 0 11m 10.42.1.2 k3s-master-2 <none> <none>
kube-system traefik-758cd5fc85-chnbc 1/1 Running 0 11m 10.42.1.3 k3s-master-2 <none> <none>
root@k3s-master-2:~#
root@k3s-master-2:~# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3s-master-1 Ready master 16m v1.18.6+k3s1 172.17.207.15 <none> Ubuntu 18.04.4 LTS 4.15.0-106-generic containerd://1.3.3-k3s2
k3s-master-2 Ready master 16m v1.18.6+k3s1 172.17.207.16 <none> Ubuntu 18.04.4 LTS 4.15.0-106-generic containerd://1.3.3-k3s2
アリババクラウドSLBを介して統合アクセスを提供します
現在、利用性の高いMySQLとK3がありますが、複数のK3サーバーに統合アクセスエントリを提供するためのエントリがまだありません。これは、次の方法で実現できます。
-
L4層ロードバランサー
-
ラウンドロビンDNS
-
VIPまたはエラスティックIP
したがって、L4層の負荷分散にAlibaba CloudのSLBを直接使用し、ポート6443をバックエンドの2つのK3マスターに転送できます。
次に、k3sマスターノード/etc/rancher/k3s/k3s.yaml
をローカル~/.kube/config
ディレクトリにコピーしてから、サーバーアドレスをserver: https://39.106.185.201:6443
(SLBパブリックネットワークIP)に変更します。
次にkubectl get nodes
、トラフィックをSLBを介してK3マスターに転送できるかどうかをテストできます。
ksd@Hailong-MacBook-Pro ~ kubectl get nodes
Unable to connect to the server: x509: certificate is valid for 10.43.0.1, 127.0.0.1, 172.17.207.15, 172.17.207.16, not 39.106.185.201
このエラーは、K3s msterの起動時に自動的に作成される証明書が39.106.185.201
、このSLBのパブリックIPを信頼しないためです。この問題を解決するには、K3sマスターを更新してパラメーターを追加します--tls-san 39.106.185.201
。
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_DATASTORE_ENDPOINT='mysql://ksd:your_password@tcp(rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com:3306)/k3s' \
sh -s - server \
--tls-san 39.106.185.201
最後に、ローカルマシンに戻って再度実行しkubectl get nodes
ます。何も起こらない場合は、ノード情報を取得できるはずです。
ksd@Hailong-MacBook-Pro ~ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-master-2 Ready master 65m v1.18.6+k3s1
k3s-master-1 Ready master 65m v1.18.6+k3s1
追記
この記事では、AlibabaCloudのSLBとRDSを使用してK3sHAを実現する方法のみを紹介します。他のパブリッククラウドの動作は基本的に同じです。詳細なテストは行われていませんが、理論的にはサポートされているはずです。非公開のクラウド環境の場合は、必要に応じて適切なデータストアと対応するHAモードを選択できます。