云原生管理端设备
本文档主要讲述如何在已有的OpenYurt集群上安装Yurt-Device-Controller 和 Yurt-EdgeX-Manager组件,并通过部署虚拟端设备来展示如何通过云原生的方式管理边缘端设备。
对于有兴趣的读者,可以去相关的github仓库参考本文使用组件的具体实现:Yurt-Device-Controller 和 Yurt-EdgeX-Manager
如果你还没有OpenYurt集群,你可以使用 yurtctl工具 来初始化一个OpenYurt集群或将一个Kubernetes集群转换为OpenYurt集群。
环境要求
OpenYurt v0.5.0+
安装了 Yurt-app-manager 组件
与master不在同一局域网下的节点都需要部署coreDNS pod
将访问coreDNS service的流量改为节点池内闭环,参考教程
1. 安装yurt-edgex-manager并创建一个EdgeX实例
安装部署yurt-edgex-manager
# 如果期望部署edgex的节点是arm64架构,则使用以下的yaml文件# kubectl apply -f https://raw.githubusercontent.com/openyurtio/yurt-edgex-manager/main/Documentation/yurt-edgex-manager-arm64.yaml$ kubectl apply -f https://raw.githubusercontent.com/openyurtio/yurt-edgex-manager/main/Documentation/yurt-edgex-manager.yaml# 检查状态$ kubectl get pods -n edgex-system |grep edgexedgex-controller-manager-6c99fd9f9f-b9nnk 2/2 Running 0 6d22h
创建一个hangzhou边缘节点池,并将边缘节点加入到hangzhou节点池
$ export WORKER_NODEPOOL="hangzhou"$ export EDGE_NODE="node1"# 创建hangzhou节点池$ cat <<EOF | kubectl apply -f -apiVersion: apps.openyurt.io/v1alpha1kind: NodePoolmetadata:name: $WORKER_NODEPOOLspec:type: EdgeEOF# 将边缘节点加入hangzhou节点池$ kubectl label node $EDGE_NODE apps.openyurt.io/desired-nodepool=hangzhou# 检查节点池状态$ kubectl get nodepoolNAME TYPE READYNODES NOTREADYNODES AGEhangzhou Edge 0 1 6d22h
在hangzhou节点池中创建edgex foundry实例,并在edgex中部署虚拟设备edgex-device-virtual
$ export WORKER_NODEPOOL="hangzhou"# 如果部署节点是arm64,则改为"edgexfoundry/docker-device-virtual-go-arm64:1.3.0"$ export VIRTUAL_DEVICE_IMAGE="edgexfoundry/docker-device-virtual-go:1.3.0"$ cat <<EOF | kubectl apply -f -apiVersion: device.openyurt.io/v1alpha1kind: EdgeXmetadata:name: edgex-sample-$WORKER_NODEPOOLspec:version: hanoipoolname: $WORKER_NODEPOOLadditinalservices:- metadata:name: edgex-device-virtualspec:type: NodePortselector:app: edgex-device-virtualports:- name: httpport: 49990protocol: TCPtargetPort: 49990nodePort: 30090additinaldeployments:- metadata:name: edgex-device-virtualspec:selector:matchLabels:app: edgex-device-virtualtemplate:metadata:labels:app: edgex-device-virtualspec:hostname: edgex-device-virtualcontainers:- name: edgex-device-virtualimage: $VIRTUAL_DEVICE_IMAGEimagePullPolicy: IfNotPresentports:- name: httpprotocol: TCPcontainerPort: 49990envFrom:- configMapRef:name: common-variablesenv:- name: Service_Hostvalue: "edgex-device-virtual"EOF
检查edgex-foundry的部署状态
$ kubectl get edgexNAME READY SERVICE READYSERVICE DEPLOYMENT READYDEPLOYMENTedgex-sample-hangzhou true 9 9 9 9
2. 安装并部署yurt-device-controller
安装yurt-device-controller 相关的CRD
$ kubectl apply -f https://raw.githubusercontent.com/openyurtio/yurt-device-controller/main/config/setup/crd.yaml
使用YurtAppSet在hanghzou节点池中部署一个yurt-device-controller实例
$ export WORKER_NODEPOOL="hangzhou"$ cat <<EOF | kubectl apply -f -apiVersion: apps.openyurt.io/v1alpha1kind: YurtAppSetmetadata:labels:controller-tools.k8s.io: "1.0"name: yurt-device-controllerspec:selector:matchLabels:app: yurt-device-controllerworkloadTemplate:deploymentTemplate:metadata:labels:app: yurt-device-controllerspec:template:metadata:labels:app: yurt-device-controllercontrol-plane: controller-managerspec:containers:- args:- --health-probe-bind-address=:8081- --metrics-bind-address=127.0.0.1:8080- --leader-elect=falsecommand:- /yurt-device-controllerimage: openyurt/yurt-device-controller:latestimagePullPolicy: IfNotPresentlivenessProbe:httpGet:path: /healthzport: 8081initialDelaySeconds: 15periodSeconds: 20name: managerreadinessProbe:httpGet:path: /readyzport: 8081initialDelaySeconds: 5periodSeconds: 10resources:limits:cpu: 100mmemory: 30Mirequests:cpu: 100mmemory: 20MisecurityContext:allowPrivilegeEscalation: falsesecurityContext:runAsUser: 65532terminationGracePeriodSeconds: 10topology:pools:- name: $WORKER_NODEPOOLnodeSelectorTerm:matchExpressions:- key: apps.openyurt.io/nodepooloperator: Invalues:- $WORKER_NODEPOOLreplicas: 1tolerations:- effect: NoSchedulekey: apps.openyurt.io/exampleoperator: ExistsrevisionHistoryLimit: 5---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:name: default-cluster-adminsubjects:- kind: ServiceAccountname: defaultnamespace: defaultroleRef:kind: ClusterRolename: cluster-adminapiGroup: ""---EOF
检查yurt-device-controller是否部署成功
$ kubectl get pod |grep yurt-device-controlleryurt-device-controller-beijing-sf7xz-79c9cbf4b7-mbfds 1/1 Running 0 6d22h
3. 查看同步上来设备相关信息
可以通过以下命令查看同步上来设备相关信息
$ kubectl get device$ kubectl get deviceservice$ kubectl get deviceprofile
4. 卸载相关组件并清理环境
$ export WORKER_NODEPOOL="hangzhou"$ export EDGE_NODE="node1"# 1.1 删除所有device, deviceservice, deviceprofile资源$ kubectl delete device --all$ kubectl delete deviceprofile --all$ kubectl delete deviceservice --all# 1.2 删除部署的yurt-device-controller$ kubectl delete yurtappset yurt-device-controller$ kubectl delete clusterrolebinding default-cluster-admin# 1.3 删除device, deviceservice, deviceprofile资源相关的crd$ kubectl delete -f https://raw.githubusercontent.com/openyurtio/yurt-device-controller/main/config/setup/crd.yaml# 2.1 删除所有edgex实例$ kubectl delete edgex --all# 2.2 卸载yurt-edgex-manager# 如果使用的arm64版本的,使用以下命令# kubectl delete -f https://raw.githubusercontent.com/openyurtio/yurt-edgex-manager/main/Documentation/yurt-edgex-manager-arm64.yaml$ kubectl delete -f https://raw.githubusercontent.com/openyurtio/yurt-edgex-manager/main/Documentation/yurt-edgex-manager.yaml# (以下步骤可选)# 3.1 将边缘节点移除hangzhou节点池$ kubectl label node $EDGE_NODE apps.openyurt.io/desired-nodepool-# 3.2 删除hangzhou节点池$ kubectl delete nodepool $WORKER_NODEPOOL
