自宅Rancher鯖をクラスタ化

サーバー
この記事は約9分で読めます。

これで安心して落とせるね

入れ方を間違えたRancherサーバー

元々VPNの鯖として使っていたUbuntu20.04 LTSが入ったMacMini機にRancherのドキュメント見ながらk3sを入れましたが、Rancher的にはk3sのDBにデフォルトのSQLiteを使わず外部のDBを使えーって書いてありますが設定忘れた民

後からetcd化とかするよ

最終的にはVMに全部移す

構成

  • HA proxy
    • 172.16.1.65
    • 172.16.1.66
  • vip
    • 172.16.1.67
  • k3s node
    • 172.16.1.68
    • 172.16.1.69
    • 172.16.1.70

172.16.1.68が現時点でRancherが動作しているk3sサーバー

172.16.1.67が最終的にRancherのエンドポイントとする仮想IPアドレス(NIC等インターフェースは存在しないが応答できるIPアドレス)

k3s etcd化

k3sは--cluster-initオプションを指定して起動するとSQLiteからetcdにマイグレーションしてくれます。

一旦k3sを止めてからオプションを指定して手動起動します

# 一旦停止する
systemctl stop k3s
# etcdに変換
k3s server --cluster-init
# マイグレーションログが流れる
# 適当な時間動かしたら止める(Ctrl+C)
# 通常起動
systemctl start k3s

k3s クラスタ化

etcd化できたらクラスタ化します

ノード1172.16.1.68で連携に必要なトークンを取得します

# トークンの確認
cat /var/lib/rancher/k3s/server/token

追加するノード(172.16.1.69,172.16.1.70)で以下のコマンドを実行します

curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=<VERSION> K3S_TOKEN=<TOKEN> sh -s - server --server https://<Node1のIP>:6443

コマンド実行後Rancherのクラスター一覧画面で追加できていることを確認できます

これでノードレベルで落ちなくなりましたヤッター

HAProxy + Keepalived

ここから問題になるのはRancherで使うドメインがIPアドレス固定な点

もちろんこのままDNSに3レコードあれば正しく動いている間は問題ありませんが、偏ってしまったりノードが落ちたときにDNS解決したIPアドレスが運悪く落ちてるノードだったりするとRancherの画面やkubectlコマンドでアクセスできません。

よってここをHAProxyで生きているノードで応答できるようにします。

HA Proxyノードに設定を追加します

sudo apt-get install haproxy keepalived

/etc/haproxy/haproxy.cfg

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http




frontend k3s-frontend
    bind *:6443
    mode tcp
    option tcplog
    default_backend k3s-backend

backend k3s-backend
    mode tcp
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s
    server server-1 172.16.1.68:6443 check
    server server-2 172.16.1.69:6443 check
    server server-3 172.16.1.70:6443 check

frontend rancher-frontend
    bind *:443
    mode tcp
    option tcplog
    default_backend rancher-backend

backend rancher-backend
    mode tcp
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s
    server server-1 172.16.1.68:443 check
    server server-2 172.16.1.69:443 check
    server server-3 172.16.1.70:443 check

/etc/keepalived/keepalived.conf

global_defs {
  enable_script_security
  script_user root
}

vrrp_script chk_haproxy {
    script '/usr/bin/killall -0 haproxy' # faster than pidof
    interval 2
}

vrrp_instance haproxy-vip {
    interface eth0 # 受け取るインターフェース
    state MASTER # MASTER on lb-1, BACKUP on lb-2
    priority 200 # 200 on lb-1, 100 on lb-2

    virtual_router_id 51

    virtual_ipaddress {
        172.16.1.67/24
    }

    track_script {
        chk_haproxy
    }
}

二つのノードに設定を入れて(keeepalived.confは適切に設定)サービスを再起動します

systemctl restart haproxy keepalived

あとはRancherインストール時に使用したホスト名を仮想IP(172.16.1.67)に設定すれば画面が出てきます

これで落ちにくいRancherの出来上がり~

一応Ingressを設定すればそのほかのホスト名からアクセスできますがHelmでアプデするときに設定が上書きされるのでおそらく消えます。(ホスト名変更はHelmコマンドからやったほうがよさそう)

ちゃんとTLSのホスト名も忘れずに

あぷで

ついでにアプデがてらホスト名変更

kubectl get secret -n cattle-system sh.helm.release.v1.rancher.v4
# NAME TYPE DATA AGE
#sh.helm.release.v1.rancher.v4 helm.sh/release.v1 1 71d
kubectl delete secret -n cattle-system sh.helm.release.v1.rancher.v4
helm upgrade rancher rancher-stable/rancher --namespace cattle-system --set hostname=rancher-server1.example.com --version=2.9.2

なぜか更新途中で止まってたみたいなので強制削除後更新

Resolving a fleet-agent that is stuck in the...

また証明書が吹っ飛ぶので再設定

apiVersion: cert-manager.io/v1
kind: Certificate
spec:
  dnsNames:
     - rancher-server1.example.com

https://x.com/uesitananame55/status/1844371327723110823

壊れちゃった

なおった

参考

高可用性組み込みetcd | K3s
組み込みetcd(HA)は、Raspberry PiのようなSDカードを使用する遅いディスク上でパフォーマンスの問題が発生する可能性があります。
Helm CLI Quick Start | Rancher
These instructions capture a quick way to set up a proof-of-concept Rancher installation.

 

コメント