企業級實戰模組十一:邊緣計算的輕量級K3S
1 K3S的介紹
1.1 介紹
k3s 是 經過CNCF認證的由Rancher公司開發維護的一個輕量級的 Kubernetes 發行版 核心機制還是和k 8s 一樣,但是剔除了很多外部依賴以及 K8s 的 alpha 、beta 特性,同時改變了部署方式和執行方式,目的是輕量化 K8s 簡單來說, K3s就是閹割版 K8s,消耗資源極少 。它主要用於邊緣計算 、物聯網等場景。K3s 具有以下特點
-
-
apiserver 、 schedule 等元件全部簡化,並以程序的形式執行在節點上 把程式都 打包為單個二進位制檔案 每個程式只需要佔用 1 00M 記憶體
-
使用基於 sqlite3 的輕量級儲存後端作為預設儲存機制。同時支援使用 etcd3 、 MySQL 和 PostgreSQL作為儲存機制
-
預設使用 local path provisioner 提供本地儲存卷
-
預設安裝了 Helm controller 和 Traefik Ingress controller
-
所有 Kubernetes control plane 元件的操作都封裝在單個二進位制檔案和程序中,使 K3s 具有自動化和管理包括證書分發在內的複雜叢集操作的能力。
-
減少外部依賴,作業系統只需要安裝較新的核心(centos7.6就可以,不需要升級核心)以及支援cgroup即可k3s安裝包已經包含了containerd、Flannel、CoreDNS,非常方便地一鍵式安裝,不需要額外安裝Docker、Flanne等元件。
1)邊緣計算介紹
邊緣計算也稱為邊緣處理,是一種將伺服器放置在本地裝置附近的 網路技術 解決資料傳輸的延遲問題。這樣的處理 方式 是在感測器附近或 者 裝置產生資料的位置進行的,因此稱之為邊緣。
“邊緣”特指計算資源在地理分佈上更加靠近裝置,而遠離雲資料中心的資源節點。典型的邊緣計算分為物聯網(例如:智慧城市,智慧家居,大型商店等)和非物聯網(例如:遊戲,CDN 等)場景。
舉個例子:原來取錢存錢 ,必須去銀行排隊,那現在我們在住的附近有自動取款機,可以直接取錢,減少了排隊等待時間,還能就近解決,更加安全
2)邊緣計算應用場景
《福布斯》技術委員會的12 位成員研究了一些企業的用例,在這些用例中, 都使用了邊緣計算:
應用一:改進醫療裝置效能和資料管理
在醫療場景下,邊緣計算主要幫助醫療保健體系的IT基礎架構,具體來說,是防止醫療裝置管理的應用程式發生延遲。在邊緣計算的支援下,無需構建集中的資料中心,可對關鍵資料進行本地化,在安全性、響應速度和有效性上有更佳表現。
應用二:本地零售的實時資料分析
邊緣計算的主要目的,是讓運算儘可能接近資料來源。在零售場景中,以往企業都是將各分支的資料彙總到中心位置進行分析,再進行決策和行動。而通過邊緣計算,零售店鋪可以在本地就進行資料處理和優化,這樣組織的行動反饋就能更快更及時。
應用三:消費者資料隱私
處理高度敏感的消費者 資料的公司發現,由於資料洩漏成本高昂,雲端計算很危險。因此,許多這類公司 正在將邊緣計算用於處理消費者資料,因為它為他們提供了更多的安全和控制選擇。這可能會使企業工作流程複雜化,但它可以帶來好處,特別是在醫療資料公司中。 Sean Byrnes, Outlier
應用四: 物聯網
物聯網是企業為獲得更好的資料、客戶體驗、現場營銷和更智慧的流程而實施的智慧的重大轉變。邊緣計算使網路的執行水平能夠為物聯網提供高效能。接近實時的速度意味著使用者體驗可以非常出色,並且可以為企業帶來更好、更有效的運營。Frank Cit tadino, QOS Networks
應用五: 視訊監控和分析
視訊監控已經部署在邊緣,以及視訊分析。視訊產生的資料是所有其他來源資料總和的 10 倍。這是一個很好的例子,說明您需要在資料中心之外開始處理的資料型別,以最大限度地減少通過網路移動和儲存的資料量。此外,它還允許企業對可操作的資料做出實時決策 Bill Galloway Pivot3 Inc.
應用六:工業操作
工廠車間處理等工業操作需要海量資料的快速響應。這些資料中的大部分被丟棄,但能夠通過檢測邊緣資料中的異常來使工廠操作員能夠及時對工廠車間的 問題做出反應。這樣可以間接減少停機從而提高生產率。 Randal Kenworthy Cognizant
應用七: 智慧建築
隨著我們的會議室和設施變得越來越智慧化,將會有一種把所有東西都放到雲端的誘惑。考慮到安全性和穩定性,在站點上託管資料將會有一些好處。我們已經看到了基於雲的照明在網路中斷時可能會令人沮喪的問題,而工作場所的可靠性甚至更重要。 Luke Wallace, Bottle Rocket
應用八: 無人駕駛汽車
汽車行業已投入數十億資金開發邊緣計算技術。為了安全執行,這些車輛需要收集和分析有關其 周圍環境,方向和天氣狀況的大量資料,以及與道路上的其他車輛進行通訊。 Arnie Gordon Arlyn Scales
應用九: 機頂盒
Edge AI 可以在機頂盒裝置上執行一個低佔用空間的智慧引擎,可以實時分析資料,對 AI 進行編碼,在本地解決問題並向上遊伺服器提供智慧反饋。與基本自動化(邊緣機器人流程自動化機器人)相結合,AI 引擎可以自我修復並在本地解決許多問題。 Ankur Garg Hotify Inc.
1.2 為什麼叫做K3S
我們希望安裝的Kubernetes 在記憶體佔用方面只是 原來 一半的大小。Kubernetes是一個10個字母的單詞 ,簡寫為 k8s 所以,Kubernetes 一半大的東西就是有 5 個字母的單詞,簡寫為 K3S。K3S沒有全稱,也沒有官方的發音。
K3s適用於以下場景:
-
邊緣計算 Edge
-
物聯網 IoT
-
CI:持續整合
-
Development:開發
-
ARM
-
嵌入K8s
由於執行K3s 所需的資源相對較少,所以 K3s 也適用於開發和測試場景。在這些場景中,如果開發或測試人員需要對某些功能進行驗證,或對某些問題進行重現,那麼使用 K3s 不僅能夠縮短啟動叢集的時間,還能夠減少叢集需要消耗的資源。與此同時, Rancher 中國團隊推出了一款針對 K3s 的效率提升工具: AutoK3s 。只需要輸入一行命令,即可快速建立 K3s 叢集並新增指定數量的 master 節點和 worker節點。
ARM介紹:
ARM64和 ARMv7 都支援二進位制檔案和多源映象。 k3s 在小到樹莓派或大到 AWS a1.4xlarge 32GiB 伺服器的環境中均能出色工作。
1.3 K3S架構
1)單節點 的 k3s 架構
k3s server節點是執行k3s server命令的機器(裸機或者虛擬機器),而k3s Agent 節點是執行k3s agent命令的機器。
單點架構只有一個控制節點(在 K3s 裡叫做server node,相當於 K8s 的 master node),而且K3s的資料儲存使用 sqlite 並內建在了控制節點上
在這種配置中,每個 agent 節點都註冊到同一個 server 節點。K3s 使用者可以通過呼叫server節點上的K3s API來操作Kubernetes資源。
2)高可用 的 K3S 架構
雖然單節點k3s 叢集可以滿足各種用例,但對於 Kubernetes control plane 的正常執行至關重要的環境,可以在高可用配置中執行 K3s 。一個高可用 K3s 叢集由以下幾個部分組成:
-
K3s Server 節點 兩個或者更多的server節點將為 Kubernetes API 提供服務並執行其他 control-plane 服務
-
外部資料庫 外部資料儲存(與單節點 k3s 設定中使用的嵌入式 SQLite 資料儲存相反)
3)邊緣計算應用案例 分析
在進行資訊化、智慧化改造的過程中,首先第一步,就是要獲取底層系統的全方位的資料。因此 需要部署大量的邊緣裝置來採集資料、分析資料,通過這些資料進行建模,大量的邊緣裝置一般離散的分佈在不同機房、廠區、甚至是不同的地理區域 。
需求 運維角度來講:
-
管理這些邊緣裝置,保持邊緣裝置上執行的服務的高可用性;
-
快速的上線、升級
-
配置的快速更改與應用
以上案例來自曾永傑,上海全應科技有限公司運維經理,曾在華為西安研究所云計算部門承擔軟體測試工程師、專案交付、線上運維等工作職責,當前工作主要為 CI/CD 流程的建設與維護、應用的容器化改革和容器雲平臺的運維管理
2 K3S和K8S之間的區別
K8s和 k3s 各有優劣。若是你要進行大型的叢集部署,建議你選擇使用 K8s ;若是你處於邊緣計算等小型部署的場景或僅僅須要部署一些非核心叢集進行開發 測試,那麼選擇 k3s 則是價效比更高的選擇。
-
雲端計算場景用k8s
-
邊緣計算場景用 k3s
在實際的應用部署中,幾乎沒有任何差異,至少到目前為止,一般k8s能滿足的場景,k3s也能滿足,相信,通過不斷的迭代,k3s在未來會更完善邊緣場景。
3 K3S的安裝部署
3.1 環境介紹
安裝k3s服務的作業系統要求:
-
Linux 的核心版本在3.10以上
-
每臺伺服器上至少要有512MB的記憶體空間
-
硬碟中可用的儲存空間必須大於500 MB
叢集角色 | IP地址 | 安裝元件 |
---|---|---|
Server節點 | 192.168.5.3 | K3s-server、containerd |
Agent節點 | 192.168.5.4 | K3s-agent、containerd |
Agent節點 | 192.168.5.5 | K3s-agent、containerd |
3.2 節點初始化(所有節點)
# 關閉防火牆
systemctl stop firewalld && systemctl disable firewalld
# 關閉selinux
setenforce 0 && sed -i 's/enforcing/disabled/' /etc/selinux/config
# 關閉swap
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
# 根據規劃設定主機名
hostnamectl set-hostname k3s-agent-02 && bash
# 將叢集節點新增到hosts檔案
cat <<EOF>> /etc/hosts
192.168.5.3 k3s-server-01
192.168.5.4 k3s-agent-01
192.168.5.5 k3s-agent-02
EOF
# 將橋接的IPv4 流量傳遞到iptables 的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
# 時間同步
yum -y install ntpdate vim git wget && ntpdate time.windows.com
3.3 安裝containerd(所有節點)
1)新增yum倉庫
cat <<EOF> /etc/yum.repos.d/tsinghua.repo
[tsinghua]
name=tsinghua
baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/7/x86_64/
gpgcheck=0
EOF
2)安裝並啟動
yum -y install containerd
systemctl enable containerd && systemctl start containerd
3)檢視安裝版本資訊
ctr -version
4)containerd 常用命令
# 映象
# 容器
# 其他指令
3.4 安裝Server節點
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
sh -
systemctl enable k3s && systemctl status k3s
# 驗證是否安裝成功
k3s kubectl get nodes
# 檢視系統服務啟動狀態
k3s kubectl get pods -n kube-system
3.5 提取join token
新增worker節點時。需要一個 join token 。 Join token 存在於master 節點的檔案系統上。
cat /var/lib/rancher/k3s/server/node-token
3.6 安裝agent節點
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.5.3:6443 \
K3S_TOKEN=K1052c359b630c5301160f572a1b04e3350120649a664794e1d016337e3545b998f::server:4a2088e7f279e9d28b32254eabdc10b8 \
sh -
檢視節點資訊
k3s kubectl get nodes
4 K3S部署應用演示
4.1 部署nginx
1)部署
cat <<EOF> nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: dev
spec:
selector:
app: nginx-pod
type: NodePort
ports:
- port: 80
targetPort: 80
EOF
k3s kubectl apply -f nginx.yaml
2)檢視
k3s kubectl get pods,svc -n dev
4.2 部署mysql
1)安裝nfs環境
# 在所有節點上安裝nfs服務
yum install nfs-utils -y
# 準備一個共享目錄
mkdir /data/nfs -pv
# 將共享目錄以讀寫許可權暴露給192.168.5.0/24網段中的所有主機
vim /etc/exports
/data/nfs 192.168.5.0/24(rw,no_root_squash)
# 啟動nfs服務
systemctl restart nfs && systemctl enable nfs
# 檢視是否建立成功
showmount -e 192.168.5.3
2)部署
cat <<EOF> mysql.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: dev
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
nfs:
server: 192.168.5.3 #nfs伺服器地址
path: /data/nfs #共享檔案路徑
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
namespace: dev
spec:
selector:
app: mysql-pod
type: NodePort
ports:
- port: 3306
targetPort: 3306
EOF
k3s kubectl apply -f mysql.yaml
3)檢視
k3s kubectl get pods,svc -n dev
4.3 部署postgresql
1)部署
cat <<EOF> postgresql.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
namespace: dev
spec:
serviceName: postgresql
replicas: 1
selector:
matchLabels:
app: postgresql
template:
metadata:
labels:
app: postgresql
spec:
volumes:
- name: hostpath
hostPath:
path: /home/data/pgdata
containers:
- image: postgres:11-alpine
imagePullPolicy: Always
name: postgres11
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: hostpath
env:
- name: POSTGRES_PASSWORD
value: qwe@123456
- name: POSTGRES_USER
value: pgroot
- name: POSTGRES_DB
value: dest
---
apiVersion: v1
kind: Service
metadata:
name: postgresql-service
namespace: dev
spec:
type: NodePort
ports:
- port: 5432
targetPort: 5432
selector:
app: postgresql-pod
EOF
k3s kubectl apply -f postgresql.yaml
2)檢視
k3s kubectl get pods,svc -n dev
5 解除安裝K3S
5.1 解除安裝server節點
/usr/local/bin/k3s-uninstall.sh
5.2 解除安裝agent節點
/usr/local/bin/k3s-agent-uninstall.sh本文摘抄或總結其他筆記,筆記不涉及任何商業用途,如果侵權請及時聯絡處理