原先只有三台主機,1主2Worker
手邊正好有機器空了出來,但雙數不能做標準的ETCD會腦裂
只好先再弄一個DB出來,然後將原先的sqlite給匯入,做成雙主
目前都是用WG打通的,所以就不介紹WG
從機器開始來。
要弄到DB就要先裝DOCKER
新機性能好,先裝
sudo apt update && sudo apt install -y curl
curl -fsSL https://get.docker.com | sh
sudo mkdir -p /opt/k3s-postgres/data
試跑
docker run -d \
--name k3s-postgres \
--restart always \
-p 10.99.99.5:5432:5432 \
-e POSTGRES_USER=k3s \
-e POSTGRES_PASSWORD=123 \
-e POSTGRES_DB=k3s \
-v /opt/k3s-postgres/data:/var/lib/postgresql/data \
postgres:16-alpine
回到原先的MASTER
nc -zv 10.99.99.5 5432
試試有沒有通? 沒有的話去到新機檢查
docker ps -a
看看是什麼狀況
docker logs -f xxxx
看一下是什麼ERROR 導修重啟? 或是為什麼啟動不成功?
印出並複製 NODE_TOKEN(步驟三會用到)
sudo cat /var/lib/rancher/k3s/server/node-token
我上步沒成功是因為我用了"特殊符號",如果你也是,記得"轉換"
ss -tlnp | grep 5432
再次確認,有沒有起來?
再來回到主1,先停掉它
systemctl stop k3s
將舊 Master (chunk01) 的 SQLite 資料無損遷移至 PostgreSQL,一定要先備份
sudo mkdir -p /root/k3s-db-backup
sudo cp -a /var/lib/rancher/k3s/server/db/state.db* /root/k3s-db-backup/
正常來說,WORKER節點上的POD都還是能正常工作的,不影響。除非你是把流量都導到MASTER1來
再來是轉換和匯入(格式一定要轉換,因為sqlite出來的精度不同,會有錯誤
ERROR本人
HINT: You will need to rewrite or cast the expression.
psql:/root/k3s-inserts.sql:405: ERROR: column "value" is of type bytea but expression is of type bit
LINE 1: ...onfigmaps/default/kube-root-ca.crt',1,0,0,93898,0,X'6b387300...
^
HINT: You will need to rewrite or cast the expression.
psql:/root/k3s-inserts.sql:406: ERROR: column "value" is of type bytea but expression is of type bit
LINE 1: ...6,'/registry/ipaddresses/10.43.0.1',1,0,0,93897,0,X'6b387300...
^
HINT: You will need to rewrite or cast the expression.
psql:/root/k3s-inserts.sql:407: ERROR: column "value" is of type bytea but expression is of type bit
LINE 1: .../services/specs/default/kubernetes',1,0,0,93895,0,X'6b387300...
^
HINT: You will need to rewrite or cast the expression.
psql:/root/k3s-inserts.sql:408: ERROR: column "value" is of type bytea but expression is of type bit
LINE 1: ...secrets/default/pgbouncer-users-v2',1,0,0,93397,0,X'6b387300...
^
HINT: You will need to rewrite or cast the expression.
psql:/root/k3s-inserts.sql:409: ERROR: column "value" is of type bytea but expression is of type bit
LINE 1: ...argocd/argocd-server-669df64bf',0,0,96815,96926,0,X'6b387300...
^
HINT: You will need to rewrite or cast the expression.
psql:/root/k3s-inserts.sql:410: ERROR: column "value" is of type bytea but expression is of type bit
LINE 1: ...ices/specs/argocd/argocd-server',0,0,1738,97217,0,X'6b387300...
^
HINT: You will need to rewrite or cast the expression.
psql:/root/k3s-inserts.sql:411: ERROR: column "value" is of type bytea but expression is of type bit
LINE 1: ...gistry/secrets/default/env-v6',0,0,94466,100570,0,X'6b387300...
sudo apt update && sudo apt install -y sqlite3 postgresql-client
# 將 state.db(包含 -wal 最新紀錄)匯出為 SQL
sqlite3 /var/lib/rancher/k3s/server/db/state.db ".dump kine" > /root/k3s-dump.sql
# 過濾出純資料寫入語句,並將 SQLite 的二進位格式 X'...' 轉為 PostgreSQL 的 '\x...'
grep "^INSERT INTO" /root/k3s-dump.sql > /root/k3s-inserts.sql
sed -i "s/,X'/,'\\\\x/g" /root/k3s-inserts.sql
MASTER1 的 /etc/rancher/k3s/config.yaml 這個一定要改,因為原先是用server: 開頭的,它不會自動
# 註解掉原本的 server: 設定
sudo sed -i 's|^server:|#server:|g' /etc/rancher/k3s/config.yaml
# 加入外部資料庫連線字串(請替換為你的實際編碼後密碼)
echo 'datastore-endpoint: "postgres://k3s:This email address is being protected from spambots. You need JavaScript enabled to view it. .5:5432/k3s?sslmode=disable"' | sudo tee -a /etc/rancher/k3s/config.yaml
讓 K3s 自動建表並匯入 舊資料
# 啟動 10 秒讓 K3s 在 PostgreSQL 自動建立標準的 kine 資料表結構,然後停止
sudo systemctl start k3s
sleep 10
sudo systemctl stop k3s
你剛剛沒有失誤,就不用清空。但我是一直試錯。
# 清空剛產生的空資料表,並將你的真實歷史資料倒進去(請填入未編碼的原始密碼)
PGPASSWORD='123' psql -h 10.99.99.5 -U k3s -d k3s -c "TRUNCATE TABLE kine RESTART IDENTITY;"
PGPASSWORD='123' psql -h 10.99.99.5 -U k3s -d k3s -v ON_ERROR_STOP=1 -q -f /root/k3s-inserts.sql
# 校正 PostgreSQL 的自增序列編號,避免後續新增資料 ID 衝突
PGPASSWORD='123' psql -h 10.99.99.5 -U k3s -d k3s -c "SELECT setval('kine_id_seq', (SELECT MAX(id) FROM kine));"
啟動 MASTER1 並取得叢集加入金鑰(Token)
sudo systemctl start k3s
sleep 15
上面的目的是讓它跑一下,待CPU降下後,過一下再切掉
看一下原先的資料是不是都在,都顯示出來
kubectl get nodes -o wide
# 印出 Token 供下一階段新機加入使用
sudo cat /var/lib/rancher/k3s/server/node-token
到新機建立 K3s 設定檔 /etc/rancher/k3s/config.yaml
sudo mkdir -p /etc/rancher/k3s
cat << 'EOF' | sudo tee /etc/rancher/k3s/config.yaml
datastore-endpoint: "postgres://k3s:This email address is being protected from spambots. You need JavaScript enabled to view it. .5:5432/k3s?sslmode=disable"
token: "<貼上第二階段印出的_NODE_TOKEN>"
node-ip: "10.99.99.5"
flannel-iface: "wg0"
flannel-backend: "wireguard-native"
node-label:
- "region=eu"
EOF
裝SERVER版,也在新機,版本記得要相同最好。
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.36.3+k3s1" sh -s - server
好了後,驗證一下狀態
k get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
m11 Ready control-plane 87d v1.36.3+k3s1 10.99.99.3 <none> Debian GNU/Linux 12 (bookworm) 6.17.7-joeyblog-bbrv3 (amd64) containerd://2.3.2-k3s2
m2 Ready control-plane 49m v1.36.3+k3s1 10.99.99.5 <none> Debian GNU/Linux 13 (trixie) 6.12.113+deb13-cloud-amd64 (amd64) containerd://2.3.2-k3s2
53247a Ready <none> 87d v1.36.3+k3s1 10.99.99.1 <none> Debian GNU/Linux 12 (bookworm) 6.18.18-x64v3-xanmod1 (amd64) containerd://2.3.2-k3s2
53247b Ready <none> 87d v1.36.3+k3s1 10.99.99.2 <none> Debian GNU/Linux 12 (bookworm) 6.18.18-x64v3-xanmod1 (amd64) containerd://2.3.2-k3s2
四臺到齊!
再來是要搬PV!