LF Edge eKuiper 是輕量級物聯網數據分析和流處理軟件,通常在邊緣端運行。它提供了一個管理儀表板來管理一個或多個 eKuiper 實例。通常,儀表板部署在雲節點中,用於管理跨多個邊緣節點的 eKuiper 實例。
在大多數情況下,出於安全或其他考慮,邊緣節點在物理上無法從雲節點訪問。這使得部署變得困難,並且無法進行雲到邊緣管理。OpenYurt 改變了這種情況。OpenYurt 基於原生 Kubernetes 構建,可以對其進行擴展以無縫支持邊緣計算。簡而言之,OpenYurt 使用戶能夠管理在邊緣基礎設施中運行的應用程序,就像它們在雲基礎設施中運行一樣。
從 v0.4.0 版本開始,OpenYurt 將正式支持部署和管理 eKuiper。在本教程中,我們就將爲大家講解如何在 OpenYurt 集羣中部署 eKuiper 及其儀表板,並利用 yurt 隧道實現從雲到邊緣的管理。 爲了模擬雲節點和邊緣節點可能位於不同網絡區域的真實場景,我們使用了一個兩節點的 kubernetes 集羣。eKuiper 實例將部署到邊緣節點,儀表板將部署到雲節點。
先決條件
在本教程中,雲節點和邊緣節點都必須安裝 kubernetes 及其依賴項。在雲節點中,需要使用 OpenYurt 和 helm 等工具來部署 eKuiper。
確保雲節點具有外部 ip,以便邊緣節點可以訪問它。還要確保邊緣節點是內部結點,以便雲節點無法訪問它。
雲節點安裝工作
首先,安裝 kubeadm 及其依賴項,如 docker 引擎。詳情請查看安裝 kubeadm 的官方文檔。注意,OpenYurt 不支持高於 1.20 的 kubernetes 版本,所以請安裝 1.20.x 或以下版本。 對於類似 debian 的系統,使用如下命令安裝:
sudo apt-get install -y kubelet=1.20.8-00 kubeadm=1.20.8-00 kubectl=1.20.8-00
最後,安裝 helm,因爲我們將通過 helm chart 部署 eKuiper。
在本教程中,雲節點的主機名是 cloud-node
。您可以修改您的主機名以匹配此名稱,或者您必須將本教程中所有出現的 cloud-node
替換爲您的雲節點主機名。
邊緣節點安裝工作
只需在邊緣節點中安裝 kubeadm
。
在本教程中,邊緣節點的主機名是 edge-node
。您可以修改您的主機名以匹配此名稱,或者您必須將本教程中所有出現的 edge-node
替換爲您的邊緣節點主機名。
設置 Kubernetes 集羣
我們將通過 kubeadm
配置 kubernetes 集羣,並讓邊緣節點加入集羣。
假設您的雲節點的外部 IP 是 34.209.219.149
。在雲節點中,輸入以下命令,我們將得到類似下面的結果。
# sudo kubeadm init --control-plane-endpoint 34.209.219.149 --kubernetes-version stable-1.20
[init] Using Kubernetes version: v1.20.8
...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authoritiesand service account keys on each node and then running the following as root:
kubeadm join 34.209.219.149:6443 --token i24p5i.nz1feykoggszwxpq \
--discovery-token-ca-cert-hash sha256:3aacafdd44d1136808271ad4aafa34e5e9e3553f3b6f21f972d29b8093554325 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 34.209.219.149:6443 --token i24p5i.nz1feykoggszwxpq \
--discovery-token-ca-cert-hash sha256:3aacafdd44d1136808271ad4aafa34e5e9e3553f3b6f21f972d29b8093554325
通過命令,我們指定外部 ip 作爲控制平面端點,以便邊緣節點可以訪問,並將 kubernetes 版本指定爲 1.20,這是 OpenYurt 中支持的最新版本。
按照輸出中的說明設置 kubeconfig。然後複製要在邊緣節點中使用的 kubeadm join
命令。
在邊緣節點,運行復制的命令:
sudo kubeadm join 34.209.219.149:6443 --token i24p5i.nz1feykoggszwxpq \
--discovery-token-ca-cert-hash sha256:3aacafdd44d1136808271ad4aafa34e5e9e3553f3b6f21f972d29b8093554325
如果一切順利,返回雲節點並輸入以下命令以獲取 k8s 節點列表,確保您可以獲得 2 個節點:
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
cloud-node NotReady control-plane,master 17m v1.20.8 172.31.6.118 <none> Ubuntu 20.04.2 LTS 5.4.0-1045-aws docker://20.10.7
edge-node NotReady <none> 17s v1.20.8 192.168.2.143 <none> Ubuntu 20.04.2 LTS 5.4.0-77-generic docker://20.10.7
如果節點狀態爲 'NotReady',則可能是未配置容器網絡。我們可以按照此處的描述安裝 kubernetes 網絡插件。例如,安裝 Weave Net 插件:
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 |tr -d '\n')"
幾分鐘後,運行 kubectl get nodes -o wide
,節點應該已準備就緒。
至此,我們已經創建了一個具有兩個節點的 k8s 集羣:cloud-node 和 edge-node。
使雲節點可訪問
在 kubectl get nodes -o wide
返回的結果中,如果 cloud-node 的內部 IP 不是可訪問的外部 IP,我們需要使其可訪問。您可以爲節點指定外部 IP。但是,在大多數像 AWS 這樣的雲平臺,機器沒有外部 IP,我們需要添加 iptables 規則,將內部 IP 的訪問轉化到外部 IP。假設雲節點的內部 IP 爲 172.31.0.236
,在雲節點中添加 iptables 規則。
$ sudo iptables -t nat -A OUTPUT -d 172.31.0.236 -j DNAT --to-destination 34.209.219.149
在邊緣節點中添加另一個 iptables 規則。
$ sudo iptables -t nat -A OUTPUT -d 172.31.0.236 -j DNAT --to-destination 34.209.219.149
通過運行 ping 172.31.0.236
,確保在邊緣節點中可以訪問 172.31.0.236
。
將 eKuiper 實例部署到邊緣
eKuiper 作爲邊緣流處理軟件,通常部署在邊緣端。我們將使用 eKuiper helm chart 來加速部署。
$ git clone https://github.com/lf-edge/ekuiper
$ cd ekuiper/deploy/chart/Kuiper
爲了將 eKuiper 部署到 edge-node,我們將修改 helm chart 中的模板文件。編輯 template/StatefulSet.yaml
第 38 行以添加 nodeName 和 hostNetwork,如下所示。其中, edge-node
是邊緣節點的主機名字,如果您的主機名不同,請更改以匹配您的邊緣主機名。
...
spec:
nodeName: edge-node
hostNetwork: true
volumes:
{{- if not .Values.persistence.enabled }}
...
保存更改並通過 helm 命令部署 eKuiper:
$ helm install ekuiper .
您將運行兩個新服務。
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ekuiper ClusterIP 10.99.57.211 <none> 9081/TCP,20498/TCP 22h
ekuiper-headless ClusterIP None <none> <none> 22h
通過驗證 pod,ekuiper 應該在 edge-node
中運行。
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ekuiper-0 1/1 Running 0 22h 10.244.1.3 edge-node <none> <none>
ekuiper
rest 服務在集羣內運行,端口爲 9081。我們可以通過在邊緣節點中鍵入以下命令來檢查服務連接,其中 192.168.2.143
是邊緣節點內網 ip。
$ curl http://192.168.2.143:9081
{"version":"1.2.0","os":"linux","upTimeSeconds":81317}
將 eKuiper 儀表板部署到雲端
我們將使用 kmanager.yaml 和 kubectl 工具在雲節點中部署 ekuiper 儀表板。eKuiper manager 是一個基於 web 的用戶界面。在配置文件中,我們爲 eKuiper manager 定義了部署和服務。
首先,我們需要確保文件中使用的儀表盤版本跟 eKuiper 版本相匹配。打開並修改 kmanager.yaml 第21行,確保版本正確。
...
containers:
- name: kmanager
image: emqx/kuiper-manager:1.2.1
...
然後,運行 kubectl 命令
$ kubectl apply -f kmanager.yaml
運行 get 服務,你將得到如下結果:
$kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ekuiper ClusterIP 10.99.57.211 <none> 9081/TCP,20498/TCP 120m
ekuiper-headless ClusterIP None <none> <none> 120m
kmanager-http NodePort 10.99.154.153 <none> 9082:32555/TCP 15s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 33h
儀表板在端口 32555
的雲節點中運行。因此,在瀏覽器中使用 url http://34.209.219.149:32555 打開儀表板。使用默認用戶名和密碼登錄:admin/public。
我們的目標是在邊緣節點管理 eKuiper 實例。因此,我們將在上一節中設置的邊緣節點中添加一個 eKuiper 服務作爲儀表板中的服務。
1、創建 Add Service
並填寫如下表格。
2、服務創建完成後,點擊服務名稱 ekuiper
並切換到 system
頁面。連接應該被斷開,這樣我們就會得到關於連接的錯誤信息。那是因爲 http://192.168.2.143:9081/
是邊緣端 eKuiper 服務的內網地址, 不能直接從雲端訪問。
在下一節中,我們將設置 yurt 隧道,讓儀表板管理 edge 端的 eKuiper 實例。
設置 yurt 隧道
我們將使用 OpenYurt 將隧道設置爲雲和邊緣節點之間的通信管道。因爲我們需要連接到邊緣的 9081
端口,我們必須在 yurt 隧道中設置端口映射。
在雲節點中,打開 openyurt/config/setup/yurt-tunnel-server.yaml
文件,編輯 configmap 第31行 yurt-tunnel-server-cfg
,添加 nat-ports-pair,如下所示。
apiVersion: v1
kind: ConfigMap
metadata:
name: yurt-tunnel-server-cfg
namespace: kube-system
data:
dnat-ports-pair: "9081=10264"
然後編輯第 175 行以添加 cloud-node 外部 ip 作爲證書 ip。僅當雲節點沒有公共 ip 和使用 NAT 規則設置時才需要這樣做。
...
args:
- --bind-address=$(NODE_IP)
- --insecure-bind-address=$(NODE_IP)
- --proxy-strategy=destHost
- --v=2
- --cert-ips=34.209.219.149
...
然後,我們將 kubernetes 集羣轉換爲 OpenYurt 集羣。
$ _output/bin/yurtctl convert --cloud-nodes cloud-node --provider kubeadm
接下來我們將通過分別部署 yurt-tunnel-server 和 yurt-tunnel-agent 手動設置 yurt 隧道。
在設置 yurt 隧道服務器之前,我們先給雲節點添加一個標籤。
$ kubectl label nodes cloud-node openyurt.io/is-edge-worker=false
然後,我們可以部署 yurt 隧道服務器:
$ kubectl apply -f config/setup/yurt-tunnel-server.yaml
接下來,我們可以設置 yurt 隧道代理。和之前一樣,我們給邊緣節點添加一個標籤,允許在邊緣節點上運行 yurt 隧道代理:
kubectl label nodes edge-node openyurt.io/is-edge-worker=true
並且,應用 yurt-tunnel-agent. yaml 文件:
kubectl apply -f config/setup/yurt-tunnel-agent.yaml
代理和服務器運行後,我們應該可以從儀表板管理 ekuiper。返回瀏覽器中的儀表板,單擊服務名稱 ekuiper
並切換到 system
選項卡,我們應該會發現該服務是健康的,如下圖所示:
很棒!現在我們可以通過儀表板在邊緣管理 eKuiper,就像它部署在雲端一樣。參照 manager ui 教程,可以從雲端創建和管理 eKuiper 的流、規則和插件以及任何類似的管理工作。
擴展閱讀
如果您想了解 LF Edge eKuiper 或者 OpenYurt 的更多特性,請閱讀下面的參考資料:
版權聲明: 本文爲 EMQ 原創,轉載請註明出處。
技術支持:如對本文或 EMQ 相關產品有疑問,可訪問 EMQ 問答社區 https://askemq.com 提問,我們將會及時回覆支持。