乐趣区

关于iot:高效边缘流处理方案使用-OpenYurt-部署和管理-eKuiper

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

接下来,装置 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 并填写如下表格。

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 的更多个性,请浏览上面的参考资料:

  • eKuiper Github 代码库
  • eKuiper 参考指南
  • OpenYurt 教程
  • eKuiper 治理控制台教程

版权申明:本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/…

技术支持:如对本文或 EMQ 相干产品有疑难,可拜访 EMQ 问答社区 https://askemq.com 发问,咱们将会及时回复反对。

退出移动版