
RFO 是 Rancher For openEuler 的縮寫,旨在面向 openEuler 打造 Rancher 基礎(chǔ)平臺。其中最核心的工作是打造一款面向 openEuler 生態(tài)的 Kubernetes 發(fā)行版。它基于上游 RKE2 的技術(shù)棧,構(gòu)建物采用 openEuler base image,致力于滿足國內(nèi)更加注重的安全合規(guī)標(biāo)準(zhǔn),對 openEuler LTS 版本擁有優(yōu)秀的兼容性。
SUSE 在歐拉開源社區(qū)中成立了 ??RFO SIG??,以社區(qū)協(xié)作方式運(yùn)作產(chǎn)品迭代,并將 RFO 發(fā)行版的工作成果進(jìn)行開源(??https://gitee.com/rfolabs/rfo)。??
(資料圖)
RFO 發(fā)行版的主要愿景如下:
完整可溯源的工程化。確保核心組件的構(gòu)建記錄和端到端測試結(jié)果均可溯源。產(chǎn)品化開箱即用。確保 RFO 的安裝部署可以快速上手,并支持從 Rancher Prime 配置部署。充分依托 openEuler 生態(tài)。確保核心組件的構(gòu)建使用 openEuler 生態(tài)體系,依托 openEuler container image 進(jìn)行最終打包。軟件供應(yīng)鏈安全與合規(guī)。確保核心組件的分發(fā)產(chǎn)物不可篡改,并致力于提供等保加固的 Kubernetes 集群環(huán)境。多樣性算力支持。提供面向 AMD64 和 ARM64 以及 RISC-V 等多樣性算力的 Kubernetes 基礎(chǔ)設(shè)施。RFO SIG 于 2022 年 9 月初在歐拉開源社區(qū)成立,歷經(jīng) 3 個月的工程迭代,我們正式推出 RFO 發(fā)行版的 GA 版本,歡迎試用并在 Rancher 社區(qū)和歐拉開源社區(qū)進(jìn)行反饋。目前有以下已測試的版本可供使用:v1.23.14+rfor1/v1.24.8+rfor1/v1.25.4+rfor1 ,后續(xù)我們也會長期跟蹤 Kubernetes 的上游版本演進(jìn)。
基于 RFO v1.24.8+rfor1 版本以及 openEuler 22.03-LTS 進(jìn)行快速上手演示。
安裝準(zhǔn)備步驟需要在所有主機(jī)上運(yùn)行:
1. 查看 OS 版本:
cat /etc/os-release
輸出:
NAME="openEuler"VERSION="22.03 LTS"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 LTS"ANSI_COLOR="0;31"
2. 配置 NetworkManager 進(jìn)行忽略 Canal CNI 的 veth 接口
touch /etc/NetworkManager/conf.d/rfo-canal.confcat >> /etc/NetworkManager/conf.d/rfo-canal.conf << EOF[keyfile]unmanaged-devices=interface-name:cali*;interface-name:flannel*EOFsystemctl disable nm-cloud-setup.service nm-cloud-setup.timersystemctl reload NetworkManager
3. 停止 openEuler 防火墻服務(wù),RFO 中默認(rèn)的 Canal CNI 與 Firewalld 網(wǎng)絡(luò)棧有沖突,需要禁用 Firewalld
systemctl stop firewalldsystemctl disable firewalld
1. 使用 install 腳本安裝 RFO:
curl -sfL https://gitee.com/rfolabs/rfo/raw/rfo-master/install-rfo.sh | INSTALL_RFO_VERSION="v1.24.8+rfor1" sh -
該腳本只能通過 root 用戶或 sudo 運(yùn)行
安裝結(jié)果如下:
[INFO] using v1.24.8+rfor1 as release[INFO] downloading checksums at https://rfolabs.oss-cn-shenzhen.aliyuncs.com/rfo/releases/v1.24.8%2Brfor1/sha256sum-amd64.txt[INFO] downloading tarball at https://rfolabs.oss-cn-shenzhen.aliyuncs.com/rfo/releases/v1.24.8%2Brfor1/rfo.linux-amd64.tar.gz[INFO] verifying tarball[INFO] unpacking tarball file to /usr/local
2. 啟用 rfo-server 服務(wù)
systemctl enable rfo-server
3. 啟動 rfo-server 服務(wù)
systemctl start rfo-server.service
4. (可選)查看 rfo-server 服務(wù)日志
journalctl -u rfo-server -f
運(yùn)行此安裝程序后:
??rfo-server?
?服務(wù)將被安裝。??rfo-server?
?服務(wù)將被配置為在節(jié)點重啟后或進(jìn)程崩潰或被殺時自動重啟。其他的實用程序?qū)⒈话惭b在??/var/lib/rancher/rfo/bin/?
?。它們包括??kubectl?
?,??crictl?
?, 和??ctr.?
?注意,這些默認(rèn)不在你的路徑上。還有兩個清理腳本會安裝到??/usr/local/bin/rfo?
?的路徑上。它們是??rfo-killall.sh?
?和??rfo-uninstall.sh?
?。一個 kubeconfig 文件將被寫入??/etc/rancher/rfo/rfo.yaml?
?。一個可用于注冊其他 server 或 agent 節(jié)點的令牌將在??/var/lib/rancher/rfo/server/node-token?
?文件中創(chuàng)建。注意:如果你要添加額外的 server 節(jié)點,則總數(shù)必須為奇數(shù)。需要奇數(shù)來維持選舉數(shù)。
1. 運(yùn)行安裝程序
curl -sfL https://gitee.com/rfolabs/rfo/raw/rfo-master/install-rfo.sh | INSTALL_RFO_VERSION="v1.24.8+rfor1" INSTALL_RFO_TYPE="agent" sh -
2. 啟用 rfo-agent 服務(wù)
systemctl enable rfo-agent.service
3. 配置 rfo-agent 服務(wù)
mkdir -p /etc/rancher/rfo/vim /etc/rancher/rfo/config.yaml
config.yaml 的內(nèi)容。
server: https://:9345token:
其中 token 可以在 server 節(jié)點中運(yùn)行??cat /var/lib/rancher/rfo/server/node-token?
?命令獲取。
?
?rfo server?
?進(jìn)程通過端口??9345?
?監(jiān)聽新節(jié)點的注冊。正常情況下,Kubernetes API 仍可在端口 6443 上使用。
4. 啟動服務(wù)
systemctl start rfo-agent.service
5. (可選)查看 rfo-agent 服務(wù)日志
journalctl -u rfo-agent -f
在安裝完成 rfo-server 節(jié)點后,即可以在 server 節(jié)點中使用內(nèi)置的 kubectl 以及 kubeconfig 配置訪問集群:
export KUBECONFIG=/etc/rancher/rfo/rfo.ymlexport PATH=/var/lib/rancher/rfo/bin:$PATHkubectl get pods --all-namespaceshelm ls --all-namespaces
或在指令中指定 kubeconfig 文件位置:
kubectl --kubeconfig /etc/rancher/rfo/rfo.yml get pods --all-namespaceshelm --kubeconfig /etc/rancher/rfo/rfo.yml ls --all-namespaces
若希望在集群外部訪問集群,則可以復(fù)制??/etc/rancher/rfo/rfo.yml?
?配置文件到你位于集群外部的機(jī)器上,作為??~/.kube/config?
?。然后將文件中??127.0.0.1?
?替換為你的 RFO 服務(wù)器的 IP 或主機(jī)名。??kubectl?
?現(xiàn)在可以管理你的 RFO 集群了。
RFO 基于 RKE2 進(jìn)行重新打包制作而成,具有 RKE2 所有的功能特點,吸取了開發(fā)和維護(hù)輕量級 Kubernetes 發(fā)行版 K3s 的經(jīng)驗教訓(xùn),并將其應(yīng)用于構(gòu)建一個具有 K3s 易用性的企業(yè)級發(fā)行版。這意味著,RFO 在最簡單的情況下是一個單一的二進(jìn)制文件,需要在所有參與 Kubernetes 集群的節(jié)點上安裝和配置。一旦啟動,RFO 就能夠引導(dǎo)和監(jiān)督每個節(jié)點上的角色合適的 agent,同時從網(wǎng)絡(luò)上獲取所需的內(nèi)容。以下為 RFO 架構(gòu)示意圖:
以下組件為 RFO 在項目中使用的 Kubernetes 組件,其中大部分經(jīng)過重新打包并使用 openEuler base image 進(jìn)行分發(fā)
在使用??install.sh?
?腳本進(jìn)行安裝時,rfo 將會以 linux system service 的方式安裝到系統(tǒng)中,使用 systemd 作為??RFO Supervisor?
?。其余方式(包括下載 rfo binary 直接啟動)并不推薦,某些場景下會沒有??RFO Supervisor?
?角色監(jiān)控 RFO 運(yùn)行狀態(tài),導(dǎo)致 kubelet 等程序常駐后臺運(yùn)行。
一般情況下,RFO 以安裝包的方式進(jìn)行分發(fā),安裝包中只包含??rfo?
?二進(jìn)制本體、systemd service 配置文件以及卸載腳本。其余組件將在 RFO 啟動后,根據(jù)啟動節(jié)點的角色進(jìn)行拉取并安裝啟動。
在 RFO 運(yùn)行的時候,你可以使用??etcd-snapshot?
?子命令來進(jìn)行 etcd 快照管理。功能包括:
RFO 內(nèi)置 ??Helm Controller??,它使用 HelmChart 自定義資源定義(CRD)來管理 Helm chart。
??HelmChart 資源定義??捕獲了你通常傳遞給??helm?
?命令行工具的大部分選項。下面是一個例子,說明你如何從默認(rèn)的 chart 資源庫部署 Grafana,覆蓋一些默認(rèn)的 chart 值。注意,HelmChart 資源本身在??kube-system?
?命名空間中,但 chart 的資源將被部署到??monitoring?
?命名空間。
apiVersion: helm.cattle.io/v1kind: HelmChartmetadata: name: grafana namespace: kube-systemspec: chart: stable/grafana targetNamespace: monitoring set: adminPassword: "NotVerySafePassword" valuesContent: |- image: tag: master env: GF_EXPLORE_ENABLED: true adminUser: admin sidecar: datasources: enabled: true
另外 RFO 支持通過??HelmChartConfig?
?資源來自定義部署,允許覆蓋作為 HelmCharts 部署的打包組件(如 Canal、CoreDNS、Nginx-Ingress 等)的值。??HelmChartConfig?
?資源必須與其對應(yīng)的 HelmChart 的名稱和命名空間相匹配,并支持提供額外的??valuesContent?
?,作為一個額外的值文件傳遞給??helm?
?命令。
注意:HelmChart?
?spec.set?
?值覆蓋 HelmChart 和 HelmChartConfig??spec.valuesContent?
?設(shè)置。
例如對上文例子中的 Grafana helm chart 進(jìn)行自定義 Grafana image 的 tag,可以創(chuàng)建一個 Kubernetes 資源文件,并用以下內(nèi)容填充它,并使用??kubectl apply -f
?進(jìn)行應(yīng)用:
apiVersion: helm.cattle.io/v1kind: HelmChartConfigmetadata: name: grafana namespace: kube-systemspec: valuesContent: |- image: tag: 9.3.2
RFO 中的證書默認(rèn)在 12 個月后到期。如果證書已經(jīng)過期或剩余時間少于 90 天,可以使用??certificate?
?子命令對證書進(jìn)行輪換,當(dāng) RFO 重新啟動時,證書將被輪換。
systemctl stop rfo-server
你也可以通過傳遞??--service?
?標(biāo)志來輪換單個服務(wù),例如:??rfo certificate rotate --service api-server?
?。
RFO 支持通過子命令??secrets-encrypt?
?開啟對 Secret 進(jìn)行靜態(tài)加密,開啟后會自動進(jìn)行以下操作:
{ "kind": "EncryptionConfiguration", "apiVersion": "apiserver.config.Kubernetes.io/v1", "resources": [ { "resources": ["secrets"], "providers": [ { "aescbc": { "keys": [{ "name": "aescbckey", "secret": "xxxxxxxxxxxxxxxxxxx" }], }, }, { "identity": {} }, ], }, ],}將該配置作為 encryption-provider-config 傳遞給 Kubernetes APIServer
一旦啟用,任何創(chuàng)建的 secret 都將用這個密鑰進(jìn)行加密。請注意,如果你禁用加密,那么任何加密的 secret 將無法讀取,直到你使用相同的密鑰再次啟用加密。
RFO 設(shè)計上與 Openeuler 緊密結(jié)合,在安全合規(guī)性上與 Openeuler 系統(tǒng)一致;并在持續(xù)集成流水線中,基于 Openeuler 容器鏡像運(yùn)行 sonobuoy 測試,保證 RFO 發(fā)行版兼容 CNCF 認(rèn)證的 Kubernetes 發(fā)行版功能要求。
RFO 的維護(hù)與發(fā)布周期與 RKE2 以及 Kubernetes 版本生命周期一致,并遵循以下原則:
RKE2 小版本將會根據(jù)改動內(nèi)容,在 RKE2 release 后一周內(nèi)進(jìn)行跟進(jìn);如出現(xiàn)的改動與 RFO 無關(guān),則跳過小版本發(fā)布RKE2 大版本目前會跟進(jìn) Kubernetes 大版本進(jìn)行維護(hù),在 RKE2 release 后兩周內(nèi)進(jìn)行跟進(jìn)針對 openEuler OS 的更新,遵循以下原則:
只針對 openEuler LTS(long term support)版本發(fā)布對應(yīng)的 RFO 版本,目前經(jīng)驗為 2 年一個新 LTS 版本,在新版本發(fā)布后 RFO 會在最近一個 RFO Release 進(jìn)行跟進(jìn)當(dāng) openEuler 出現(xiàn)致命或高等級系統(tǒng)漏洞的情況下,發(fā)布 RFO 小版本進(jìn)行跟進(jìn)RFO 除 RKE2 原生的功能外,目前以測試整合 openEuler 操作系統(tǒng)為目標(biāo)進(jìn)行維護(hù),并計劃后續(xù)添加以下支持:
ARM64 平臺支持內(nèi)置 iSula 運(yùn)行時支持后續(xù)規(guī)劃主要圍繞構(gòu)建物安全可信認(rèn)證以及擴(kuò)充構(gòu)建物分發(fā)途徑開展。
構(gòu)建物安全可信認(rèn)證主要包括以下方面,確保核心組件的分發(fā)產(chǎn)物不可篡改,并致力于提供等保加固的 Kubernetes 集群環(huán)境:
針對分發(fā)的容器鏡像,進(jìn)行鏡像簽名針對分發(fā)的 RFO charts,進(jìn)行 helm charts 簽名擴(kuò)充構(gòu)建物分發(fā)途徑主要包括以下方面:
支持離線鏡像制作以及離線部署構(gòu)建 RFO 以及 ??kube-explorer?? RPM 包并通過 openEuler 的軟件源進(jìn)行分發(fā)