高效邊緣流處理方案:使用 OpenYurt 部署和管理 eKuiper

LF Edge eKuiper 是輕量級物聯網數據分析和流處理軟件,通常在邊緣端運行。它提供了一個管理儀表板來管理一個或多個 eKuiper 實例。通常,儀表板部署在雲節點中,用於管理跨多個邊緣節點的 eKuiper 實例。

在大多數情況下,出於安全或其他考慮,邊緣節點在物理上無法從雲節點訪問。這使得部署變得困難,並且無法進行雲到邊緣管理。OpenYurt 改變了這種情況。OpenYurt 基於原生 Kubernetes 構建,可以對其進行擴展以無縫支持邊緣計算。簡而言之,OpenYurt 使用戶能夠管理在邊緣基礎設施中運行的應用程序,就像它們在雲基礎設施中運行一樣。

從 v0.4.0 版本開始,OpenYurt 將正式支持部署和管理 eKuiper。在本教程中,我們就將爲大家講解如何在 OpenYurt 集羣中部署 eKuiper 及其儀表板,並利用 yurt 隧道實現從雲到邊緣的管理。 爲了模擬雲節點和邊緣節點可能位於不同網絡區域的真實場景,我們使用了一個兩節點的 kubernetes 集羣。eKuiper 實例將部署到邊緣節點,儀表板將部署到雲節點。

使用 OpenYurt 部署和管理 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

接下來,安裝 Golang,然後構建 OpenYurt

最後,安裝 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 並填寫如下表格。

創建 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儀表板

很棒!現在我們可以通過儀表板在邊緣管理 eKuiper,就像它部署在雲端一樣。參照 manager ui 教程,可以從雲端創建和管理 eKuiper 的流、規則和插件以及任何類似的管理工作。

擴展閱讀

如果您想了解 LF Edge eKuiper 或者 OpenYurt 的更多特性,請閱讀下面的參考資料:

版權聲明: 本文爲 EMQ 原創,轉載請註明出處。

原文鏈接:https://www.emqx.com/zh/blog/edge-stream-processing-solution-deploying-and-managing-ekuiper-with-openyurt

技術支持:如對本文或 EMQ 相關產品有疑問,可訪問 EMQ 問答社區 https://askemq.com 提問,我們將會及時回覆支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章