輕量級 Kubernetes 集羣發行版 K3s 完全進階指南
深入理解官方文檔,輕鬆學會使用 K3S 工具!
K3s
是一個輕量級的 Kubernetes
發行版,它針對邊緣計算、物聯網等場景進行了高度優化。
-
CNCF
認證的Kubernetes
發行版 -
支持
X86_64
,ARM64
,ARMv7
平臺 -
單一進程包含
Kubernetes master
,kubelet
和containerd
1. K3S 工具介紹
爲你提供 k3s 的產品介紹
K3s
有以下增強功能:
-
打包爲單個二進制文件
-
把
K8S
相關的組件,比如kube-api
/kube-manager
都打包到同一個二進制文件裏面,這樣的話,只需要啓動這個文件就可以快速的啓動對應的組件。 -
使用基於 sqlite3 的默認存儲機制
-
同時支持使用
etcd3
、MySQL
和PostgreSQL
作爲存儲機制。 -
默認情況下是安全的
-
在
K3s
中有一個默認的證書管理機制 (默認一年有效期),也有一個可以輪轉證書的功能 (就是在小於九十天之內重啓K3s
的話,就會自動續一年)。 -
功能強大的
batteries-included
功能 -
就是雖然有些服務本身這個二進制文件並沒有提供,但是可以通過內置的服務,將配置文件放到指定的目錄下面,就可以在啓動的時候一併將該服務啓動或替換默認組件。
-
所有
K8S control-plane
組件都封裝在單個二進制文件和進程中 -
因爲封裝在二進制文件中,所以啓動的時候只有一個進程。好處在於只需要管理這個單一進程就可以了,同時也具備操作複雜集羣的能力。
-
最大程度減輕了外部依賴性
-
即稍新一點的
Linux
內核就可以了 (需要kernel
和cgroup
掛載)。
之所以叫做 K3S
是因爲希望安裝的 K8S
在內存佔用方面只是一半的大小,而一半大的東西就是一個 5
個字母的單詞,簡寫爲 K3S
。
-
生命週期
-
同時支持
3
個K8s
版本,支持的生命週期與K8s
相同 -
可以參考: Kubernetes 版本及版本偏差支持策略 進行學習
-
更新週期
-
當
K8s
更新新版本後,一般K3s
在一週內同步更新 -
可以通過 這個鏈接 獲取
latest
/stable
/testing
版本 -
我們默認安裝的是
stable
版本,可以運行通過命令進行查看 -
命名規範
-
v1.20.4+k3s1:
v1.20.4
爲K8s
版本,k3s1
爲補丁版本
# K3s軟件包需要的依賴項
containerd # 容器運行時(可以使用docker替代)
Flannel # 網絡
CoreDNS # DNS
CNI # CNI
Traefik # 默認的controller服務(apisix/ingress-controller)
iptables # 主機實用程序
service load balancer # 嵌入式服務負載均衡器
network policy controller # 嵌入式網絡策略控制器
# K3s適用於以下場景
CI
Development
ARM
嵌入 K8s
物聯網-IoT
邊緣計算-Edge
與此同時,Rancher
中國團隊推出了一款針對 K3s
的效率提升工具:AutoK3s。只需要輸入一行命令,即可快速創建 K3s
集羣並添加指定數量的 master
節點和 worker
節點。
2. K3S 快速入門
原理就是,將 K8S 的相關組件封裝到 K3S 的二進制文件中去!
原理就是,將 K8S
的相關組件封裝到 K3S
的二進制文件中去,然後啓動這二進制文件就可以啓動一個成熟的 K8S
集羣。我們可以看到 K3S
和 K8S
的架構基本差不多,其中 k3s-server
對應這個 control-plane
,而 k3s-agent
對應着 node
節點。
可以看到 k3s
中使用的默認存儲是 SQLite
(自帶),且默認的網絡使用的是 Flannel
(自帶)。當服務端和客戶端都啓動之後,通過 Tunnel-Proxy
這個組件進行通信,通過這個通道去管理網絡流量。在 agent
節點中,通過 kubelet
操作 contaninerd
來創建對應 Pod
。
- K3s 架構
K3S 工具進階指南
- K8s 架構
K3S 工具進階指南
國內的話,建議使用官方提供的 鏡像地址,這樣不但可以加速本地 K3s
的時候,而且方便部署和更新服務。這也是爲什麼建議國內使用 k3s-install.sh
部署服務的原因,因爲其內部使用的地址都是從國內去獲取的。
3. K3S 安裝事項
3.1 安裝指南
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
雖然可以通過下載二進制文件進行服務端和工作節點的運行 (./k3s server
),但是一旦我們退出進程,之前創建的節點也就立即銷燬了,所以還是建議使用腳本進行安裝。
# 主節點
$ ./k3s server
# 工作節點
$ ./k3s agent K3S_URL=xxx K3S_TOKEN=xxx
# 清除垃圾文件
$ rm -rf /etc/rancher /var/lib/rancher
- 鏡像加速
# 添加配置
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
EOF
# 重啓服務
$ sudo systemctl restart k3s
# 是否生效
$ sudo crictl info | grep -A 2 "endpoint"
K3s
提供了一個安裝腳本,可以方便的在 systemd
或 openrc
的系統上將其作爲服務安裝。運行此安裝後,K3s
服務將被配置爲在節點重啓後或進程崩潰或被殺死時自動重啓。
-
安裝內容
-
kubectl
、crictl
、ctr
-
k3s-killall.sh
、k3s-uninstall.sh
-
執行操作
-
將
kubeconfig
文件寫入到/etc/rancher/k3s/k3s.yaml
裏面 -
由
K3s
安裝的kubectl
工具將自動使用該文件的配置來運行 -
其他機器可以通過複製這個配置文件並修改
server
地址來操作K3s
集羣 -
主節點 - 192.168.100.100
# 安裝腳本
# https://get.k3s.io
$ curl -sfL https://get.k3s.io | sh -
# 建議使用這個安裝腳本(國內化了)
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_NODE_NAME=k3s1 \
K3S_KUBECONFIG_OUTPUT=/home/escape/.kube/config \
INSTALL_K3S_EXEC="--docker" sh -
# 查找stable分支版本信息
[INFO] Finding release for channel stable
[INFO] Using v1.23.6+k3s1 as release
# 獲取國內鏡像版本地址
[INFO] Downloading hash https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/k3s
[INFO] Verifying binary download
# 安裝k3s二進制工具並鏈接相關工具(內置)
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Skipping installation of SELinux RPM
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
# 安裝清除和卸載k3s生成的配置和工具
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
# 常見了兩個systemd的配置
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
# 啓動k3s服務
[INFO] systemd: Starting k3s
- 工作節點 - 192.168.100.101
# 工作節點上安裝並將它們添加到集羣
# https://docs.rancher.cn/docs/k3s/architecture/_index#註冊-agent-節點
$ curl -sfL https://get.k3s.io | \
K3S_URL=https://myserver:6443 \
K3S_TOKEN=mynodetoken sh -
# 建議使用這個安裝命令(國內化了)
# K3S_URL: 會使K3s以worker模式運行
# K3S_TOKEN: 使用的值存儲在你的服務器節點上
# K3S_NODE_NAME: 爲每個節點提供一個有效且唯一的主機名
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_NODE_NAME=k3s2 \
K3S_KUBECONFIG_OUTPUT=/home/escape/.kube/config \
K3S_URL=https://192.168.100.100:6443 \
K3S_TOKEN=mynodetoken sh -
# mynodetoken
$ sudo cat /var/lib/rancher/k3s/server/token
# 查找stable分支版本信息
[INFO] Finding release for channel stable
[INFO] Using v1.23.6+k3s1 as release
# 獲取國內鏡像版本地址
[INFO] Downloading hash https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/k3s
[INFO] Verifying binary download
# 安裝k3s二進制工具並鏈接相關工具(內置)
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Skipping /usr/local/bin/ctr symlink to k3s
# 安裝清除和卸載k3s生成的配置和工具
[INFO] Creating killall script /usr/local/bin/k3s-agent-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
# 常見了兩個systemd的配置
[INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO] systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
# 啓動k3s服務
[INFO] systemd: Starting k3s-agent
3.2 配置要求
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
-
[1] 先決條件
-
選擇上,兩個節點不能有相同的主機名
-
不修改主機名可以通過添加隨機後綴或指定主機名
# 爲每個節點添加隨機後綴
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.100.100:6443 \
K3S_TOKEN=xxx sh -s - --with-node-id
# 爲每個節點指定主機名
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
K3S_NODE_ INSTALL_K3S_MIRROR=cn \
K3S_URL=https://192.168.64.3:6443 K3S_TOKEN=xxx sh -
# 爲每個節點指定主機名
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.64.3:6443 \
K3S_TOKEN=xxx sh -s - --node-name k3s2
-
[2] 硬件信息
-
操作系統:可以在大多數現代
Linux
系統上運行 -
磁盤設備:
K3s
的性能取決於數據庫的性能 (建議使用SSD
硬盤) -
網絡相關:
K3s Server
節點的入站規則,所有出站流量都是允許的
-
[3] 安裝選項
-
官方安裝參數文檔
-
安裝選項示例演示
# 其實就把對應參數加到systemd配置文件裏面去了
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--docker" sh -
# 自動化部署(不用獲取token值了)
# 主節點和工作節點使用我們指定的key來通信
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_TOKEN=rancher-k3s sh -
$ sudo cat /var/lib/rancher/k3s/server/token
-
[4] 其他說明
-
運行
agent
時還必須設置K3S_TOKEN
-
以
K3S_
開頭的環境變量將被保留,供systemd/openrc
使用 -
沒有明確設置
exec
並設置K3S_URL
的話會將命令默認爲工作節點
3.3 命令參數
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
在整個 K3s 文檔中,你會看到一些選項可以作爲命令標誌和環境變量傳遞進來,那該如何使用標誌和環境變量呢?
- [1] 使用標誌和環境變量
# 使用標誌
$ curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -s -
$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
# 環境變量
$ curl -sfL https://get.k3s.io | \
INSTALL_K3S_EXEC="--flannel-backend none" sh -s -
$ curl -sfL https://get.k3s.io | \
sh -s - server --flannel-backend none
- [2] K3s Server/Agent - 常用配置
# write-kubeconfig
# 將管理客戶端的kubeconfig寫入這個文件
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_KUBECONFIG_OUTPUT=/root/.kube/config \
sh -
# 使用docker作爲容器運行時
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--docker" sh -
# 指定運行時工具
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--container-runtime-endpoint containerd" \
sh -
# 設置私有鏡像倉庫配置文件
# 默認配置文件: /etc/rancher/k3s/registries.yaml
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--private-registry xxx" \
sh -
# 針對多網卡主機安裝K3s集羣
# 默認多網卡會使用默認網關的那個卡
$ rout -n
# K3s server
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--node-ip=192.168.100.100" \
sh -
# K3s agent
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_URL=https://192.168.99.211:6443 K3S_TOKEN=xxx \
INSTALL_K3S_EXEC="--node-ip=192.168.100.100" \
sh -
# --tls-san
# 在TLS證書中添加其他主機名或IP作爲主機備用名稱
# 即在公網環境下允許通過公網IP訪問控制、操作遠程集羣
# 或者部署多個Server並使用LB進行負責,就需要保留公網地址
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC="--tls-san 1.1.1.1" \
sh -
# 獲取配置
$ kubectl get secret k3s-serving -n kube-system -o yaml
# 然後本機複製公網主節點對應的yaml文件即可本地操作了
$ scp ci@1.1.1.1:/etc/rancher/k3s/k3s.yaml ~/.kube/config
# 修改啓動的服務對應配置(調整節點的啓動的最大Pod數量)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--kubelet-arg=max-pods=200' \
sh -
# 修改啓動的服務對應配置(使用ipvs作爲服務調度工具)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--kube-proxy-arg=proxy-mode=ipvs' \
sh -
# 修改啓動的服務對應配置(調整服務啓動的端口範圍)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--kube-apiserver-arg=service-node-port-range=40000-50000' \
sh -
# kubelet-arg --kubelet-arg
# kube-apiserver --kube-apiserver-arg
# kube-proxy-arg --kube-proxy-arg
# kube-proxy-arg --kube-proxy-arg=proxy-mode=ipvs
# --data-dir
# 修改K3s數據存儲目錄
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--data-dir=/opt/k3s-data' \
sh -
# 禁用組件
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--disable traefik' \
sh -
# 自己加自己需要的服務
$ ls /var/lib/rancher/k3s/server/manifests
$ kubectl get pods -A | grep traefik
# 添加label和taint標識
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--node-label foo=bar,hello=world \
--node-taint key1=value1:NoExecute'
sh -
# 查看一下
$ kubectl describe nodes
- [3] K3s Server/Agent - 數據庫選項
# 指定數據源名稱
# 標誌位: --datastore-endpoint value
# 環境變量: K3S_DATASTORE_ENDPOINT
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--datastore-endpoint etcd' \
sh -
# cron規範中的快照間隔時間
# --etcd-snapshot-schedule-cron value
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--etcd-snapshot-schedule-cron * */5 * * *' \
sh -
3.4 網絡選項
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
默認情況下,K3s
將以 flannel
作爲 CNI
運行,使用 VXLAN
作爲默認後端,CNI
和默認後端都可以通過參數修改。要啓用加密,請使用下面的 IPSec
或 WireGuard
選項。
# 默認安裝K3s之後的網絡配置
$ sudo cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json
{
"Network": "10.42.0.0/16",
"EnableIPv6": false,
"EnableIPv4": true,
"IPv6Network": "::/0",
"Backend": {
"Type": "vxlan"
}
}
- 配置 Flannel 選項
這樣,我就可以在安裝 K3s
或者之後修改對應配置文件,來修改 Flannel
默認的後端網絡配置選項 (重啓會覆蓋不生效) 了。下面,我們演示下,如何修改爲 host-gw
模式。
# 主節點
# flannel-backend使用host-gw
# 該模式會把對端主機的IP當做默認網管(多Server情況)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--flannel-backend=host-gw' \
sh -
# 工作節點
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.100.100:6443 \
K3S_TOKEN=xxx sh -
# 默認的路由信息
$ route -n
0.0.0.0 172.16.64.1 0.0.0.0 UG 100 0 0 enp0s2
10.42.1.0 172.16.64.9 255.255.255.0 UG 0 0 0 enp0s2
# 查看配置之後的網絡配置
$ sudo cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json
{
"Network": "10.42.0.0/16",
"Backend": {
"Type": "host-gw"
}
}
- 啓用 Directrouting 特性
Flannel 自身的特性:當主機在同一子網時,啓用 direct routes
(如 host-gw
)。vxlan
只用於將數據包封裝到不同子網的主機上,同子網的主機之間使用 host-gw
,默認值爲 false
。
要添加我們就不能修改其對應的網絡配置文件,因爲重新安裝或者重啓都會把這個配置沖掉 (變成默認配置),所以需要折中下。我們自建一個網絡配置文件,然後在啓動的時候執行從哪個配置文件裏面加載對應配置。
# k3s的master和agent
$ sudo cat /etc/flannel/net-conf.json
{
"Network": "10.42.0.0/16",
"Backend": {
"Type": "vxlan",
"Directrouting": true
}
}
# k3s master
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--flannel-backend=host-gw' \
sh -
- 自定義 CNI
使用 --flannel-backend=none
(禁用) 運行 K3s
,然後在安裝你選擇的 CNI
。按照 Calico CNI 插件指南 來修改 Calico
的 YAML
配置文件,在 container_settings
部分中允許 IP
轉發。
# 加到Calico的YAML文件中
# 允許IP轉發(這個是K3s的一個限制;需要開啓)
"container_settings": {
"allow_ip_forwarding": true
}
- name: CALICO_IPV4POOL_CIDR
value: "192.168.200.0/24"
# 通過在主機上運行以下命令,確保設置已被應用(true)
$ sudo cat /etc/cni/net.d/10-canal.conflist
# calico
# 其中--cluster-cidr可不設置
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--flannel-backend=none \
--cluster-cidr=192.168.200.0/24"' \
sh -
# 啓動網絡服務
$ kubectl apply -f ./calico.yaml
3.5 外部數據庫
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
-
[1] 使用外部數據庫實現高可用安裝
-
兩個或多個
server
節點 -
零個或多個
agent
節點 -
外部數據存儲 (
Etcd/MySQL/PostgRES
) -
固定的註冊地址 (
LB
)
雖然單節點 k3s server
集羣可以滿足各種用例,但是對於需要穩定運行的重要環境,可以在 HA
配置中運行 K3s
,如何使用外部數據庫安裝一個高可用的 K3s
集羣?
K3S 安裝事項 - 外部數據庫
# 1.創建一個外部數據存儲
$ docker run --name some-mysql \
--restart=unless-stopped -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=password -d mysql:5.7
# 2.啓動k3s-server節點(有讀寫權限不用加庫名)
# mysql://username:password@tcp(hostname:3306)/database-name
# 可加污點 --node-taint CriticalAddonsOnly=true:NoExecute
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn sh - server \
--datastore-endpoint="mysql://root:password@ip:3306/k3s" \
--tls-san 172.31.13.97
# 3.配置固定的註冊地址(k3s-lb節點)
# Agent節點需要一個URL來註冊(LB)
$ cat >> /etc/nginx.conf <<EOF
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
upstream k3s_api {
least_conn;
server 172.31.2.134:6443 max_fails=3 fail_timeout=5s;
server 172.31.2.42:6443 max_fails=3 fail_timeout=5s;
}
server {
listen 6443;
proxy_pass k3s_api;
}
}
EOF
# 啓動服務
$ docker run -d --restart=unless-stopped \
-p 6443:6443 \
-v /etc/nginx.conf:/etc/nginx/nginx.conf \
nginx:1.14
# 4.加入Agent節點
# Agent會保存LB節點和每個Server節點的IP信息
# cat /var/lib/rancher/k3s/agent/etc/k3s-agent-load-balancer.json
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn
K3S_URL=https://172.31.13.97:6443 K3S_TOKEN=mynodetoken \
sh -
# 5.通過kubeconfig訪問K3s集羣
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-server-1 Ready control-plane,master 68s v1.20.7+k3s1
k3s-server-2 Ready control-plane,master 66s v1.20.7+k3s1
- [2] 嵌入式 DB 的高可用
要在這種模式下運行 K3s
,你必須有奇數的服務器節點,建議從三個節點開始。在嵌入式中,默認使用 Etcd
作爲高可用的數據庫。
# 服務器節點(啓動etcd集羣)
# SECRET我們預定一個key值
# 使用cluster-init標誌來啓用集羣
# 並使用一個標記作爲共享的密鑰來加入其他服務器到集羣中
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_TOKEN=SECRET \
sh -s - --cluster-init
# 查看類型
$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-xxx Ready control-plane,etcd,master 19h v1.23.6+k3s1
# 其他服務器節點(2/3)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_TOKEN=SECRET \
sh -s - --server https://<ip-or-host-server>:6443
# 查詢ETCD集羣狀態
# etcd證書默認目錄:/var/lib/rancher/k3s/server/tls/etcd
# etcd數據默認目錄:/var/lib/rancher/k3s/server/db/etcd
$ ETCDCTL_ENDPOINTS='https://172.31.12.136:2379,\
https://172.31.4.43:2379,\
https://172.31.4.190:2379' \
ETCDCTL_CACERT='/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt' \
ETCDCTL_CERT='/var/lib/rancher/k3s/server/tls/etcd/server-client.crt'\
ETCDCTL_KEY='/var/lib/rancher/k3s/server/tls/etcd/server-client.key' \
ETCDCTL_API=3 etcdctl endpoint status --write-out=table
- [3] 集羣數據存儲選項
使用 etcd
以外的數據存儲運行 K8S
的能力使 K3s
區別於其他 K8S
發行版。該功能爲 K8S
操作者提供了靈活性,可用的數據存儲選項允許你選擇一個最適合用例的數據存儲。
如果你的團隊沒有操作 etcd
的專業知識,可以選擇 MySQL
或 PostgreSQL
等企業級 SQL
數據庫。如果您需要在 CI/CD
環境中運行一個簡單的、短暫的集羣,可以使用嵌入式 SQLite
數據庫
如果你想使用外部數據存儲,如 PostgreSQL
、MySQL
或 etcd
,你必須設置 datastore-endpoint
參數,以便 K3s
知道如何連接到它,也可以指定參數來配置連接的認證和加密。下表總結了這些參數,它們可以作爲 CLI
標誌或環境變量傳遞。
作爲最佳實踐,我們建議將這些參數設置爲環境變量,而不是命令行參數,這樣你的數據庫證書或其他敏感信息就不會作爲進程信息的一部分暴露出來。
3.6 私有鏡像倉庫
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
K3s
默認使用 containerd
作爲容器運行時,所以在 docker
上配置鏡像倉庫是不生效的。K3s
鏡像倉庫配置文件由兩大部分組成:mirrors
和 configs
。
-
Mirrors
是一個用於定義專用鏡像倉庫的名稱和endpoint
的指令 -
Configs
部分定義了每個mirror
的TLS
和證書配置 -
對於每個
mirror
,你可以定義auth
和/
或tls
K3s registry
配置目錄爲:/etc/rancher/k3s/registries.yaml
。K3s
啓動時會檢查 /etc/rancher/k3s/
中是否存在 registries.yaml
文件,並指示 containerd
使用文件中定義的鏡像倉庫。如果你想使用一個私有的鏡像倉庫,那麼你需要在每個使用鏡像倉庫的節點上以 root
身份創建這個文件。
請注意,server
節點默認是可以調度的。如果你沒有在 server
節點上設置污點,那麼將在它們上運行工作負載,請確保在每個 server
節點上創建 registries.yaml
文件。
containerd
使用了類似 K8S
中 svc
與 endpoint
的概念,svc
可以理解爲訪問名稱,這個名稱會解析到對應的 endpoint
上。也可以理解 mirror
配置就是一個反向代理,它把客戶端的請求代理到 endpoint
配置的後端鏡像倉庫。mirror
名稱可以隨意填寫,但是必須符合 IP
或域名的定義規則。並且可以配置多個 endpoint
,默認解析到第一個 endpoint
,如果第一個 endpoint
沒有返回數據,則自動切換到第二個 endpoint
,以此類推。
# /etc/rancher/k3s/registries.yaml
# 同時可以設置多個mirrors地址
# 可以對mirrors設置權限和證書
mirrors:
"172.31.6.200:5000":
endpoint:
- "http://172.31.6.200:5000"
- "http://x.x.x.x:5000"
- "http://y.y.y.y:5000"
"rancher.ksd.top:5000":
endpoint:
- "http://172.31.6.200:5000"
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
configs:
"172.31.6.200:5000":
auth:
username: admin
password: Harbor@12345
tls:
cert_file: /home/ubuntu/harbor2.escapelife.site.cert
key_file: /home/ubuntu/harbor2.escapelife.site.key
ca_file: /home/ubuntu/ca.crt
# 鏡像都是從同一個倉庫獲取到的
$ sudo systemctl restart k3s.service
$ sudo crictl pull 172.31.6.200:5000/library/alpine
$ sudo crictl pull rancher.ksd.top:5000/library/alpine
這裏我們介紹下,如何使用 TLS
配置。
# 證書頒發機構頒發的證書
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"harbor.escapelife.site":
endpoint:
- "https://harbor.escapelife.site"
configs:
"harbor.escapelife.site":
auth:
username: admin
password: Harbor@12345
EOF
$ sudo systemctl restart k3s
# 自簽名證書
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"harbor2.escapelife.site":
endpoint:
- "https://harbor2.escapelife.site"
configs:
"harbor2.escapelife.site":
auth:
username: admin
password: Harbor@12345
tls:
cert_file: /home/ubuntu/harbor2.escapelife.site.cert
key_file: /home/ubuntu/harbor2.escapelife.site.key
ca_file: /home/ubuntu/ca.crt
EOF
$ sudo systemctl restart k3s
# 不使用TLS證書
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
EOF
$ sudo systemctl restart k3s
K3s
將會在 /var/lib/rancher/k3s/agent/etc/containerd/config.toml
中爲 containerd
生成 config.toml
。如果要對這個文件進行高級設置,你可以在同一目錄中創建另一個名爲 config.toml.tmpl
的文件,此文件將會代替默認設置。
# 完整示例
$ cat >> /etc/rancher/k3s/registries.yaml
mirrors:
"harbor.escapelife.site":
endpoint:
- "https://harbor.escapelife.site"
"harbor2.escapelife.site":
endpoint:
- "https://harbor2.escapelife.site"
"172.31.19.227:5000":
endpoint:
- "http://172.31.19.227:5000"
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
configs:
"harbor.escapelife.site":
auth:
username: admin
password: Harbor@12345
"harbor2.escapelife.site":
auth:
username: admin
password: Harbor@12345
tls:
cert_file: /home/ubuntu/harbor2.escapelife.site.cert
key_file: /home/ubuntu/harbor2.escapelife.site.key
ca_file: /home/ubuntu/ca.crt
3.7 離線安裝
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
離線安裝的過程主要分爲以下兩個步驟:
-
步驟 1:部署鏡像
-
部署私有鏡像倉庫
-
手動部署鏡像
-
步驟 2:安裝
K3s
工具 -
單節點安裝
-
高可用安裝
-
通過私有鏡像倉庫安裝 K3s
-
k3s-images.txt
包含對於版本依賴的鏡像文件 -
k3s-airgap-images-amd64.tar
包含對於版本的鏡像文件
# 將所需鏡像上傳到私有鏡像倉庫
# https://github.com/k3s-io/k3s/releases
可以從K3s鏡像列表獲取到版本,下載上傳到私有鏡像倉庫
# 創建鏡像倉庫(YAML)
# 按照私有鏡像倉庫配置指南創建並配置registry.yaml文件
$ mkdir -p /etc/rancher/k3s/
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"docker.io":
endpoint:
- "https://harbor.escapelife.site"
configs:
"docker.io":
auth:
username: admin
password: Harbor@12345
EOF
# 安裝單節點K3s集羣
# https://github.com/k3s-io/k3s/releases
可以從K3s倉庫獲取到版本(二進制文件)
# 獲取K3s安裝腳本
$ wget https://get.k3s.io -o ./install.sh
$ wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh
# 安裝K3s-server
$ INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
# 將agent加入到K3s集羣
$ INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken \
./install.sh
- 通過手動部署鏡像安裝 K3s
# 從Github頁面獲取你所運行的K3s版本及文件
# https://github.com/rancher/k3s/releases
k3s二進制文件+鏡像tar文件
# 將tar文件放在images目錄下
$ sudo mkdir -p /var/lib/rancher/k3s/agent/images/
$ sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
# 將k3s二進制文件放在/usr/local/bin/k3s路徑上
$ mv ./k3s /usr/local/bin/
$ chmod 755 /usr/local/bin/k3s
# 安裝K3s-server
$ INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
# 將agent加入到K3s集羣
$ INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken \
./install.sh
離線升級 K3s
版本,完成離線安裝 K3s
後,還可以通過腳本升級 K3s
版本,或啓用自動升級功能,以保持離線環境中的 K3s
版本與最新的 K3s
版本同步。
- 升級 K3s 版本
# 通過腳本升級
# https://github.com/rancher/k3s/releases
從Github頁面下載要升級到的K3s版本
# 替換
# 複製並替換每個節點上/usr/local/bin中的舊K3s二進制文件
$ mv ./k3s /usr/local/bin/
$ chmod 755 /usr/local/bin/k3s
$ wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh
# 重啓K3s服務
$ sudo systemctl restart k3s.service
3.8 儀表盤及卸載
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
推薦使用三種儀表盤工具,分別是對應是 Kubernetes Dashboard
、kube-explorer
和 Rancher UI
,其各自各有優劣。
- [1] Kubernetes Dashboard
# 部署Kubernetes儀表盤
$ GITHUB_URL=https://github.com/kubernetes/dashboard/releases
$ VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S \
${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
$ sudo k3s kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml
# 儀表盤RBAC配置
# 本指南中創建的admin-user將在儀表盤中擁有管理權限
$ sudo k3s kubectl create \
-f dashboard.admin-user.yml \
-f dashboard.admin-user-role.yml
# dashboard.admin-user.yml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
# dashboard.admin-user-role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 獲得Bearer-Token
$ sudo k3s kubectl -n kubernetes-dashboard \
describe secret admin-user-token | grep '^token'
# 本地訪問儀表盤
# https://192.168.100.100:8443
# https://www.escapelife.site/posts/180e93f1.html
# https://www.escapelife.site/posts/538ec6b1.html
$ sudo k3s kubectl proxy
$ sudo kubectl -n kubernetes-dashboard port-forward \
--address 0.0.0.0 svc/kubernets-dashboard 8443:443
# 升級儀表盤
$ sudo k3s kubectl delete ns kubernetes-dashboard
$ GITHUB_URL=https://github.com/kubernetes/dashboard/releases
$ VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
$ sudo k3s kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml
# ## 刪除儀表盤和admin-user配置
$ sudo k3s kubectl delete ns kubernetes-dashboard
$ sudo k3s kubectl delete clusterrolebinding kubernetes-dashboard
$ sudo k3s kubectl delete clusterrole kubernetes-dashboard
-
[2] kube-explorer
-
kube-explorer
是K8S
的便攜式資源管理器,沒有任何依賴 -
並提供了一個幾乎完全無狀態的
K8S
資源管理器
# 從發佈頁面下載二進制文件
# https://github.com/cnrancher/kube-explorer
# 運行
# --kubeconfig 可以不配置(自己可以找到)
$ ./kube-explorer --kubeconfig=/etc/rancher/k3s/kube.yaml \
--http-listen-port=9898 \
--https-listen-port=0
# 打開瀏覽器訪問
http://192.168.100.100:9898
-
[3] Rancher UI
-
可以將
K3s
導入到Rancher UI
中去管理 -
官網 導入 K3s 集羣 指導文檔
# 導入K3s集羣時,Rancher會將其識別爲K3s類型,並且附件額外功能
# 1.能夠升級K3s版本
# 2.可配置升級集羣時升級的最大節點數
# 3.在主機詳情頁能夠查看啓動K3s集羣時每個節點的配置參數和環境變量
# 配置K3s集羣以允許導入到Rancher
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn sh -s - \
--write-kubeconfig-mode 644
- [4] 卸載 K3s 服務
# 主節點
$ /usr/local/bin/k3s-uninstall.sh
# 工作節點
$ /usr/local/bin/k3s-agent-uninstall.sh
# 包括docker等信息一併清理
#!/bin/bash
KUBE_SVC='
kubelet
kube-scheduler
kube-proxy
kube-controller-manager
kube-apiserver
'
for kube_svc in ${KUBE_SVC};
do
# 停止服務
if [[ `systemctl is-active ${kube_svc}` == 'active' ]]; then
systemctl stop ${kube_svc}
fi
# 禁止服務開機啓動
if [[ `systemctl is-enabled ${kube_svc}` == 'enabled' ]]; then
systemctl disable ${kube_svc}
fi
done
# 停止所有容器
docker stop $(docker ps -aq)
# 刪除所有容器
docker rm -f $(docker ps -qa)
# 刪除所有容器卷
docker volume rm $(docker volume ls -q)
# 卸載mount目錄
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher;
do
umount $mount;
done
# 備份目錄
mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")
# 刪除殘留路徑
rm -rf /etc/ceph \
/etc/cni \
/opt/cni \
/run/secrets/kubernetes.io \
/run/calico \
/run/flannel \
/var/lib/calico \
/var/lib/cni \
/var/lib/kubelet \
/var/log/containers \
/var/log/kube-audit \
/var/log/pods \
/var/run/calico \
/usr/libexec/kubernetes
# 清理網絡接口
no_del_net_inter='
lo
docker0
eth
ens
bond
'
network_interface=`ls /sys/class/net`
for net_inter in $network_interface;
do
if ! echo "${no_del_net_inter}" | grep -qE ${net_inter:0:3}; then
ip link delete $net_inter
fi
done
# 清理殘留進程
port_list='
80
443
6443
2376
2379
2380
8472
9099
10250
10254
'
for port in $port_list;
do
pid=`netstat -atlnup | grep $port | awk '{print $7}' | awk -F '/' '{print $1}' | grep -v - | sort -rnk2 | uniq`
if [[ -n $pid ]]; then
kill -9 $pid
fi
done
kube_pid=`ps -ef | grep -v grep | grep kube | awk '{print $2}'`
if [[ -n $kube_pid ]]; then
kill -9 $kube_pid
fi
# 清理Iptables表
## 注意:如果節點Iptables有特殊配置,以下命令請謹慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain
systemctl restart docker
3.9 注意事項
理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!
-
Helm
-
如果需要使用
helm
操作K3s
集羣,需要創建~/.kube/conf
目錄 -
需要執行
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
命令 -
自動部署的清單
-
將由
rancher/helm-controller
在運行時安裝 -
目錄路徑:
/var/lib/rancher/k3s/server/manifests
-
目錄下面的每個
yaml
就代表這個一個需要啓動的服務
對於我們希望使用的組件,可以在啓動的時候禁用默認組件,在手動部署你需要的一些組件 (通常是放到一個指定目錄下面,隨着服務啓動自動拉起),從而達到靈活使用的目的。
# 查看所有Pod服務
# 比如helm/coredns也不是自帶的就是通過這個方式創建的
$ sudo kubectl get pods -A
-
註冊 Agent 節點
-
工作節點密碼存儲:
/etc/rancher/node/password
-
主節點的密碼存儲:
/var/lib/rancher/k3s/server/cred/node-passwd
在 agent
節點運行註冊命令,會和 server
節點發起 websocket
連接,然後會在工作節點上面創建一個隨機的密碼。然後會拿着這個密碼和工作節點的主機名,發送給主節點。然後主節點會將這個信息在保存 (k8s secrets
) 起來,隨後的任何嘗試都必須使用相同的密碼。
# 工作節點的密碼信息(password+hostname)
$ sudo cat /etc/rancher/node/password
# 查看主節點的密碼信息
# https://docs.rancher.cn/docs/k3s/architecture/_index#註冊-agent-節點
$ sudo kubectl get secret k3s2.node-password.k3s -o yaml -n kube-system
# 可以查看日誌信息驗證這個信息的存在
$ sudo tail -f 200 /var/log/syslog | grep k3s
# 發現節點信息提示NotReady狀態
# 可以嘗試刪除節點的密碼存儲信息,之後會自動獲取新的
$ sudo kubectl delete secret k3s2.node-password.k3s -n kube-system
- 自定義存儲類型
集羣啓動之後,默認會啓動一個 local-path
的組件,用於提供服務掛載存儲使用,其默認以 PVC
的形式。之後,將其存儲在 /var/lib/rancher/k3s/server/storageclass
目錄下面。
# 查看組件
$ sudo kubectl get pods -A
# 查看對應存儲
$ sudo kubectl get storageclass
# 可以使用參數修改默認存儲地址
# --default-local-storage-path value
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--etcd-snapshot-schedule-cron * */5 * * *' \
sh -
4. K3S 集羣升級
手動升級 + 自動升級
當升級 K3s
時,K3s
服務會重啓或停止,但 K3s
容器會繼續運行。要停止所有的 K3s
容器並重置容器的狀態,可以使用 k3s-killall.sh
腳本。killall
腳本清理容器、K3s
目錄和網絡組件,同時也刪除了 iptables
鏈和所有相關規則。集羣數據不會被刪除。
- [1] 手動升級 - 使用安裝腳本升級 K3s
你可以通過使用安裝腳本升級 K3s
,或者手動安裝所需版本的二進制文件。
# 升級到最新stable版本
$ curl -sfL https://get.k3s.io | sh -
# 升級到latest版本
$ curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=latest sh -
# 升級到v1.20的最新版本
$ curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL="v1.20" sh -
# 升級到指定版本
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -
- [2] 手動升級 - 使用二進制文件手動升級 K3s
你可以通過使用安裝腳本升級 K3s
,或者手動安裝所需版本的二進制文件。
# 從發佈下載所需版本的K3s二進制文件
https://github.com/rancher/k3s/releases
# 將下載的二進制文件複製到/usr/local/bin/k3s
$ mv ./k3s /usr/local/bin/k3s
# 停止舊的K3s二進制文件
$ curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL="v1.20" sh -
# 啓動新的K3s二進制文件
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -
你可以使用 Rancher
的 system-upgrad-controller
來管理 K3s
集羣升級。這是一種 Kubernetes
原生的集羣升級方法。它利用自定義資源定義 (CRD
)、計劃和控制器,根據配置的計劃安排升級。
控制器通過監控計劃和選擇要在其上運行升級 job
的節點來調度升級,計劃通過標籤選擇器定義哪些節點應該升級。當一個 job
成功運行完成後,控制器會給它運行的節點打上相應的標籤。
-
[3] 自動升級 - 使用二進制文件手動升級 K3s
-
k3s-upgrade
-
system-upgrade-controller
# 將system-upgrade-controller安裝到您的集羣中
$ kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/download/v0.6.2/system-upgrade-controller.yaml
# 配置計劃
# 建議您最少創建兩個計劃
# 升級server節點的計劃和升級agent節點的計劃
# Server plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: server-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/master # 選擇主節點
operator: In
values:
- "true"
serviceAccountName: system-upgrade
upgrade:
image: rancher/k3s-upgrade
version: v1.20.4+k3s1
# Agent plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: agent-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/master # 選擇工作節點
operator: DoesNotExist
prepare:
args:
- prepare
- server-plan
image: rancher/k3s-upgrade
serviceAccountName: system-upgrade
upgrade:
image: rancher/k3s-upgrade
version: v1.20.4+k3s1
# 自動升級到最新版本(不指定版本)
apiVersion: upgrade.cattle.io/v1
kind: Plan
...
spec:
...
upgrade:
image: rancher/k3s-upgrade
channel: https://update.k3s.io/v1-release/channels/stable
K3S 集羣升級
5. K3S 備份恢復
SQLite + etcd + 外部數據存儲
- [1] 使用嵌入式 SQLite 數據存儲進行備份和恢復
# 方式1:備份/恢復數據目錄
# 備份
$ cp -rf /var/lib/rancher/k3s/server/db /opt/db
# 恢復
$ systemctl stop k3s
$ rm -rf /var/lib/rancher/k3s/server/db
$ cp -rf /opt/db /var/lib/rancher/k3s/server/db
$ systemctl start k3s
# 方式2:通過 SQLite cli
# 備份
sqlite3 /var/lib/rancher/k3s/server/db/state.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> .backup "/opt/kine.db"
sqlite> .exit
# 恢復
$ sudo systemctl stop k3s
sqlite3 /var/lib/rancher/k3s/server/db/state.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> .restore '/opt/kine.db'
sqlite> .exit
$ sudo systemctl start k3s
當使用外部數據存儲時,備份和恢復操作是在 K3s
之外處理的。數據庫管理員需要對外部數據庫進行備份,或者從快照或轉儲中進行恢復。我們建議將數據庫配置爲執行定期快照。
- [2] 使用外部數據存儲進行備份和恢復
# 備份
$ mysqldump -uroot -p --all-databases --master-data > k3s-dbdump.db
# 恢復
$ systemctl stop k3s
$ mysql -uroot -p < k3s-dbdump.db
$ systemctl start k3s
- [3] 使用嵌入式 etcd 數據存儲進行備份和恢復
# 創建快照(K3s默認啓用快照)
# 快照目錄默認: /var/lib/rancher/k3s/server/db/snapshots
# 要配置快照間隔或保留的快照數量
--etcd-disable-snapshots 禁用自動etcd快照
--etcd-snapshot-schedule-cron 定時快照的時間點;認值爲每12小時觸發一次
--etcd-snapshot-retention 保留的快照數量;默認值爲5
--etcd-snapshot-dir 保存數據庫快照的目錄路徑
--cluster-reset 忘記所有的對等體;成爲新集羣的唯一成員
--cluster-reset-restore-path 要恢復的快照文件的路徑
當 K3s
從備份中恢復時,舊的數據目錄將被移動到/var/lib/rancher/k3s/server/db/etcd-old/
。然後 K3s
會嘗試通過創建一個新的數據目錄來恢復快照,然後從一個帶有一個 etcd
成員的新 K3s
集羣啓動 etcd
。
# 從快照恢復集羣
# 使用--cluster-reset選項運行K3s
# 同時給出--cluster-reset-restore-path
$ ./k3s server \
--cluster-reset \
--cluster-reset-restore-path=<PATH-TO-SNAPSHOT>
6. K3S 卷和存儲
介紹瞭如何通過 local storage provider 或 Longhorn 來設置持久存儲。
當部署一個需要保留數據的應用程序時,你需要創建持久存儲。持久存儲允許您從運行應用程序的 pod
外部存儲應用程序數據。即使應用程序的 pod
發生故障,這種存儲方式也可以使您維護應用程序數據。
- [1] 設置 Local Storage Provider 支持
K3s
自帶 Rancher
的 Local Path Provisioner
(LPP
),這使得能夠使用各自節點上的本地存儲來開箱即用地創建 pvc
。根據用戶配置,LPP
將自動在節點上創建基於 hostPath
的持久卷。它利用了 K8s
的 Local Persistent Volume
特性引入的特性,但它比 K8s
中內置的 local pv
特性更簡單的解決方案。
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-path-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 2Gi
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-test
namespace: default
spec:
containers:
- name: volume-test
image: nginx:stable-alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: volv
mountPath: /data
ports:
- containerPort: 80
volumes:
- name: volv
persistentVolumeClaim:
claimName: local-path-pvc
# 應用yaml服務
$ kubectl create -f pvc.yaml pod.yaml
# 確認PV和PVC已創建
$ kubectl get pv
$ kubectl get pvc
- [2] 設置 Longhorn 支持
K3s
支持 Longhorn
(是 K8s
的一個開源分佈式塊存儲系統)。
# 安裝Longhorn
# 將被安裝在命名空間longhorn-system中
$ kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: longhorn-volv-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 2Gi
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-test
namespace: default
spec:
containers:
- name: volume-test
image: nginx:stable-alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: volv
mountPath: /data
ports:
- containerPort: 80
volumes:
- name: volv
persistentVolumeClaim:
claimName: longhorn-volv-pvc
# 應用yaml服務
$ kubectl create -f pvc.yaml pod.yaml
# 確認PV和PVC已創建
$ kubectl get pv
$ kubectl get pvc
7. K3S 網絡相關
簡單介紹下 K3s 相關的網絡配置組件!
- CoreDNS
CoreDNS
是在 agent
節點啓動時部署的。要禁用,請在每臺服務器上運行 --disable coredns
選項。如果你不安裝 CoreDNS
,你將需要自己安裝一個集羣 DNS
提供商。
# 如何修改coredns參數
# /var/lib/rancher/k3s/server/manifests/coredns.yaml
# 該文件重啓K3s服務的話會導致coredns配置重新初始化
1.將coredns.yaml保存到其他目錄
2.通過 --disable coredns 禁用coredns
3.複製coredns.yaml到/var/lib/rancher/k3s/server/manifests/目錄並修改參數
- Traefik Ingress Controller
啓動 server
時,默認情況下會部署 Traefik
,對該文件的任何修改都會以類似 kubectl apply
的方式自動部署到 Kubernetes
中,將使用主機上的 80
和 443
端口。
# 操作和上面基本是一致的
# 請使用 --disable traefik 選項啓動每個server
# /var/lib/rancher/k3s/server/manifests/traefik.yaml
# 如何啓用 treafik2 dashboard
# http://traefik.example.com/dashboard
# Note: in a kubernetes secret the string (e.g. generated by htpasswd) must be base64-encoded first.
# To create an encoded user:password pair, the following command can be used:
# htpasswd -nb admin admin | openssl base64
apiVersion: v1
kind: Secret
metadata:
name: authsecret
namespace: default
data:
users: |2
YWRtaW46JGFwcjEkLkUweHd1Z0EkUjBmLi85WndJNXZWRFMyR2F2LmtELwoK
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
spec:
routes:
- match: Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
kind: Rule
services:
- name: api@internal
kind: TraefikService
middlewares:
- name: auth
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: auth
spec:
basicAuth:
secret: authsecret # Kubernetes secret named "secretName"
- Service Load Balancer
K3s
提供了一個名爲 Klipper Load Balancer
的負載均衡器,它可以使用可用的主機端口。允許創建 LoadBalancer
類型的 Service
,但不包括 LB
的實現。某些 LB
服務需要雲提供商,例如 Amazon EC2
。相比之下,K3s service LB
使得可以在沒有云提供商的情況下使用 LB
服務。
8. K3S 與 Helm
Helm
是 Kubernetes
的包管理工具。Helm Chart
爲 Kubernetes YAML
清單文件提供了模板化語法,可以通過 Helm
安裝對應的 chart
。K3s
不需要任何特殊的配置就可以使用 Helm
命令行工具。
- 自動部署 Helm charts
在 /var/lib/rancher/k3s/server/manifests
中找到的任何 Kubernetes
清單將以類似 kubectl apply
的方式自動部署到 K3s
。以這種方式部署的 manifests
是作爲 AddOn
自定義資源來管理的。你會發現打包組件的 AddOns
,如 CoreDNS
、Local-Storage
等。AddOns
是由部署控制器自動創建的,並根據它們在 manifests
目錄下的文件名命名。
# 查看運行AddOn資源
$ kubectl get addon -A
# 也可以將Helm-Chart作爲AddOns部署
https://github.com/rancher/helm-controller/
- 使用 Helm CRD
HelmChart CRD
捕獲了大多數你通常會傳遞給 helm
命令行工具的選項。下面是一個例子,說明如何從默認的 Chart
資源庫中部署 Grafana
,覆蓋一些默認的 Chart
值。請注意,HelmChart
資源本身在 kube-system
命名空間,但 Chart
資源將被部署到 monitoring
命名空間。
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: grafana
namespace: kube-system
spec:
chart: stable/grafana
targetNamespace: monitoring
set:
adminPassword: "NotVerySafePassword"
valuesContent: |-
image:
tag: master
env:
GF_EXPLORE_ENABLED: true
adminUser: admin
sidecar:
datasources:
enabled: true
9. K3S 高級選項
包含高級選項和配置
- 證書輪換
默認情況下,K3s
的證書在 12
個月內過期。如果證書已經過期或剩餘的時間不足 90
天,則在 K3s
重啓時輪換證書。
# 查詢K3s證書過期時間
$ for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; \
do \
echo $i;\
openssl x509 -enddate -noout -in $i; \
done
# 修改系統時間爲證書過期前90天或證書過期後
$ timedatectl set-ntp no
$ date -s 20220807
# 重啓K3s服務
$ service k3s restart
- Red Hat 和 CentOS 的額外準備
建議運行以下命令,關閉 firewalld
防火牆。
$ sudo systemctl disable firewalld --now
10. 參考鏈接
送人玫瑰,手有餘香!
-
[1] 文檔教程
-
K3s 中文文檔 - 國外
-
K3s 中文文檔 - 國內
-
K3s 國內鏡像站 - 加速
-
K3s 系列教程 - 官方製作
-
[2] 代碼地址
-
K3s 倉庫地址 - Github
-
[3] 周邊項目
-
K3s 周邊項目 - k3os
完全基於 K8S 管理的輕量級操作系統
- K3s 周邊項目 - autok3s
用於簡化 K3s
集羣部署和管理的輕量級工具
即在阿里雲和 aws
等雲服務器上面部署 k3s
-
K3s 周邊項目 - k3d
可以在
k3d
創建容器化的k3s
集羣可以使用容器在單臺計算機上啓動多節點
k3s
集羣 -
K3s 周邊項目 - harvester
基於
K8S
構建的開源超融合基礎架構 (HCI
) 軟件旨在替換
vSphere
和Nutanix
的開源替代方案 -
K3s 周邊項目 - octopus
主要用於邊緣計算相關
用於
K8S
和k3s
的輕量級雲原生設備管理系統集羣可以將邊緣設備作爲自定義
k8s
資源進行管理
本文轉載自:「 Escape 的博客 」,原文:https://url.hi-linux.com/ytP71 ,版權歸原作者所有。歡迎投稿,投稿郵箱: editor@hi-linux.com。
最近,我們建立了一個技術交流微信羣。目前羣裏已加入了不少行業內的大神,有興趣的同學可以加入和我們一起交流技術,在 「奇妙的 Linux 世界」 公衆號直接回復 「加羣」 邀請你入羣。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/kLmDLt7MSEfchYj8XsoQnQ