轻量级 Kubernetes 集群发行版 K3s 完全进阶指南
公眾號關注?「奇妙的 Linux 世界」
設為「星標」,每天帶你玩轉 Linux !
深入理解官方文檔,輕松學會使用 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 架構
-
K8s 架構
國內的話,建議使用官方提供的 鏡像地址,這樣不但可以加速本地 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_NAME="k3s2"?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節點的入站規則,所有出站流量都是允許的
-
| 協議 | 端口 | 源 | 描述 |
|---|---|---|---|
| TCP | 6443 | K3s agent 節點 | Kubernetes API Server |
| UDP | 8472 | K3s server 和 agent 節點 | 僅對 Flannel VXLAN 需要 |
| TCP | 10250 | K3s server 和 agent 節點 | Kubelet metrics |
| TCP | 2379-2380 | K3s server 節點 | 只有嵌入式 etcd 高可用才需要 |
-
[3] 安裝選項
-
官方安裝參數文檔
-
安裝選項示例演示
-
| Environment Variable | Description |
|---|---|
INSTALL_K3S_EXEC |
用于在服務中啟動 K3s 的后續子命令 |
K3S_CONFIG_FILE |
指定配置文件的位置 |
K3S_TOKEN |
用于將 server/agent 加入集群的共享 secret 值 |
K3S_TOKEN_FILE |
用于將 server/agent 加入集群的共享 secret 文件 |
INSTALL_K3S_VERSION |
指定下載 K3s 的版本 |
K3S_TOKEN_FILE |
指定 ?cluster-secret/token 的文件目錄 |
INSTALL_K3S_SKIP_START |
將不會啟動 K3s 服務 |
INSTALL_K3S_SKIP_DOWNLOAD |
用于離線安裝;設置之后不會下載遠程工具 |
#?其實就把對應參數加到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"}
}
| CLI Flag 和 Value | 描述 |
|---|---|
--flannel-backend=vxlan |
使用 VXLAN 后端(默認) |
--flannel-backend=host-gw |
使用 host-gw 后端 |
--flannel-backend=ipsec |
使用 IPSEC 后端;對網絡流量進行加密 |
--flannel-backend=wireguard |
使用 WireGuard 后端;對網絡流量進行加密 |
-
配置 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_CIDRvalue:?"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 HA 方案
-
雖然單節點 k3s server 集群可以滿足各種用例,但是對于需要穩定運行的重要環境,可以在 HA 配置中運行 K3s,如何使用外部數據庫安裝一個高可用的 K3s 集群?
| 主機名 | 角色 | IP |
|---|---|---|
| k3s-server-1 | k3s master | 172.31.2.134 |
| k3s-server-2 | k3s master | 172.31.2.42 |
| k3s-db | DB | 172.31.10.251 |
| k3s-lb | LB | 172.31.13.97 |
| k3s-agent | k3s agent | 172.31.15.130 |
#?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=cnK3S_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 標志或環境變量傳遞。
| CLI Flag | 環境變量 | 描述 |
|---|---|---|
--datastore-endpoint |
K3S_DATASTORE_ENDPOINT |
指定一個 PostgresSQL、MySQL 或 etcd 連接字符串。用于描述與數據存儲的連接。這個字符串的結構是特定于每個后端的,詳情如下。 |
--datastore-cafile |
K3S_DATASTORE_CAFILE |
TLS 證書頒發機構(CA)文件,用于幫助確保與數據存儲的通信安全。如果你的數據存儲通過 TLS 服務請求,使用由自定義證書頒發機構簽署的證書,你可以使用這個參數指定該 CA,這樣 K3s 客戶端就可以正確驗證證書。 |
--datastore-certfile |
K3S_DATASTORE_CERTFILE |
TLS 證書文件,用于對數據存儲進行基于客戶端證書的驗證。要使用這個功能,你的數據存儲必須被配置為支持基于客戶端證書的認證。如果你指定了這個參數,你還必須指定datastore-keyfile參數。 |
--datastore-keyfile |
K3S_DATASTORE_KEYFILE |
TLS 密鑰文件,用于對數據存儲進行基于客戶端證書的認證。更多細節請參見前面的datastore-certfile參數。 |
作為最佳實踐,我們建議將這些參數設置為環境變量,而不是命令行參數,這樣你的數據庫證書或其他敏感信息就不會作為進程信息的一部分暴露出來。
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:?adminpassword:?Harbor@12345tls:cert_file:?/home/ubuntu/harbor2.escapelife.site.certkey_file:?/home/ubuntu/harbor2.escapelife.site.keyca_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:?adminpassword:?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:?adminpassword:?Harbor@12345tls:cert_file:?/home/ubuntu/harbor2.escapelife.site.certkey_file:??/home/ubuntu/harbor2.escapelife.site.keyca_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:?adminpassword:?Harbor@12345"harbor2.escapelife.site":auth:username:?adminpassword:?Harbor@12345tls:cert_file:?/home/ubuntu/harbor2.escapelife.site.certkey_file:??/home/ubuntu/harbor2.escapelife.site.keyca_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:?adminpassword:?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-usernamespace:?kubernetes-dashboard#?dashboard.admin-user-role.yml
apiVersion:?rbac.authorization.k8s.io/v1
kind:?ClusterRoleBinding
metadata:name:?admin-user
roleRef:apiGroup:?rbac.authorization.k8s.iokind:?ClusterRolename:?cluster-admin
subjects:-?kind:?ServiceAccountname:?admin-usernamespace:?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/bashKUBE_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'?]];?thensystemctl?stop?${kube_svc}fi#?禁止服務開機啟動if?[[?`systemctl?is-enabled?${kube_svc}`?==?'enabled'?]];?thensystemctl?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;
doumount?$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;
doif?!?echo?"${no_del_net_inter}"?|?grep?-qE?${net_inter:0:3};?thenip?link?delete?$net_interfi
done#?清理殘留進程
port_list='
80
443
6443
2376
2379
2380
8472
9099
10250
10254
'for?port?in?$port_list;
dopid=`netstat?-atlnup?|?grep?$port?|?awk?'{print?$7}'?|?awk?-F?'/'?'{print?$1}'?|?grep?-v?-?|?sort?-rnk2?|?uniq`if?[[?-n?$pid?]];?thenkill?-9?$pidfi
donekube_pid=`ps?-ef?|?grep?-v?grep?|?grep?kube?|?awk?'{print?$2}'`if?[[?-n?$kube_pid?]];?thenkill?-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-plannamespace:?system-upgrade
spec:concurrency:?1cordon:?truenodeSelector:matchExpressions:-?key:?node-role.kubernetes.io/master?#?選擇主節點operator:?Invalues:-?"true"serviceAccountName:?system-upgradeupgrade:image:?rancher/k3s-upgradeversion:?v1.20.4+k3s1#?Agent?plan
apiVersion:?upgrade.cattle.io/v1
kind:?Plan
metadata:name:?agent-plannamespace:?system-upgrade
spec:concurrency:?1cordon:?truenodeSelector:matchExpressions:-?key:?node-role.kubernetes.io/master?#?選擇工作節點operator:?DoesNotExistprepare:args:-?prepare-?server-planimage:?rancher/k3s-upgradeserviceAccountName:?system-upgradeupgrade:image:?rancher/k3s-upgradeversion:?v1.20.4+k3s1
#?自動升級到最新版本(不指定版本)
apiVersion:?upgrade.cattle.io/v1
kind:?Plan
...
spec:...upgrade:image:?rancher/k3s-upgradechannel:?https://update.k3s.io/v1-release/channels/stable
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?k3ssqlite3?/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-pvcnamespace:?default
spec:accessModes:-?ReadWriteOncestorageClassName:?local-pathresources:requests:storage:?2Gi#?pod.yaml
apiVersion:?v1
kind:?Pod
metadata:name:?volume-testnamespace:?default
spec:containers:-?name:?volume-testimage:?nginx:stable-alpineimagePullPolicy:?IfNotPresentvolumeMounts:-?name:?volvmountPath:?/dataports:-?containerPort:?80volumes:-?name:?volvpersistentVolumeClaim: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:-?ReadWriteOncestorageClassName:?longhornresources:requests:storage:?2Gi#?pod.yaml
apiVersion:?v1
kind:?Pod
metadata:name:?volume-testnamespace:?default
spec:containers:-?name:?volume-testimage:?nginx:stable-alpineimagePullPolicy:?IfNotPresentvolumeMounts:-?name:?volvmountPath:?/dataports:-?containerPort:?80volumes:-?name:?volvpersistentVolumeClaim: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?base64apiVersion:?v1
kind:?Secret
metadata:name:?authsecretnamespace:?default
data:users:?|2YWRtaW46JGFwcjEkLkUweHd1Z0EkUjBmLi85WndJNXZWRFMyR2F2LmtELwoK---
apiVersion:?traefik.containo.us/v1alpha1
kind:?IngressRoute
metadata:name:?traefik-dashboard
spec:routes:-?match:?Host(`traefik.example.com`)?&&?(PathPrefix(`/api`)?||?PathPrefix(`/dashboard`))kind:?Ruleservices:-?name:?api@internalkind:?TraefikServicemiddlewares:-?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:?grafananamespace:?kube-system
spec:chart:?stable/grafanatargetNamespace:?monitoringset:adminPassword:?"NotVerySafePassword"valuesContent:?|-image:tag:?masterenv:GF_EXPLORE_ENABLED:?trueadminUser:?adminsidecar: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 世界」 公眾號直接回復 「加群」 邀請你入群。
你可能還喜歡
點擊下方圖片即可閱讀
超贊,又一 Markdown 神器!可直接畫思維導圖,還支持 VSCode 和 Vim
點擊上方圖片,『美團|餓了么』外賣紅包天天免費領
更多有趣的互聯網新鮮事,關注「奇妙的互聯網」視頻號全了解!
總結
以上是生活随笔為你收集整理的轻量级 Kubernetes 集群发行版 K3s 完全进阶指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构----二叉树叶子结点到根节点的
- 下一篇: 台式电脑如何截屏_买台式电脑如何避免成为