EdgeX Foundry
This document demonstrates how to install Yurt-Device-Controller,Yurt-EdgeX-Manager, and manage edge leaf devices via cloud native style based on virtual devices.
For more details about these two components, please refer to Yurt-Device-Controller, Yurt-EdgeX-Manager
If you don’t have an OpenYurt on hand, you can use yurtctl to create one or convert from an exist Kubernetes cluster.
Environment
OpenYurt v0.5.0+
You should first install Yurt-app-manager.
Deploy CoreDNS for every edge node
Set ServiceTopology to
kubernetes.io/hostnamefor CoreDNS service. For details, please refer to ServiceTopology
1. install yurt-edgex-manager and create an EdgeX insatnce
install yurt-edgex-manager
$ kubectl apply -f https://github.com/openyurtio/yurt-edgex-manager/releases/download/v0.2.0/yurt-edgex-manager.yaml# check status of yurt-edgex-manager$ kubectl get pods -n edgex-system |grep edgexedgex-controller-manager-6c99fd9f9f-b9nnk 2/2 Running 0 6d22h
Create a nodepool named hangzhou, join node into this nodepool.
$ export WORKER_NODEPOOL="hangzhou"$ export EDGE_NODE="node1"# create nodepool hangzhou$ cat <<EOF | kubectl apply -f -apiVersion: apps.openyurt.io/v1alpha1kind: NodePoolmetadata:name: $WORKER_NODEPOOLspec:type: EdgeEOF# join edge node into nodepool hangzhou$ kubectl label node $EDGE_NODE apps.openyurt.io/desired-nodepool=hangzhou# check node status$ kubectl get nodepoolNAME TYPE READYNODES NOTREADYNODES AGEhangzhou Edge 0 1 6d22h
create EdgeX Foundry instance in nodepool hangzhou and deploy edgex-device-virtual
apiVersion: device.openyurt.io/v1alpha1kind: EdgeXmetadata:name: edgex-sample-beijingspec:version: jakartapoolname: hangzhou---apiVersion: apps/v1kind: Deploymentmetadata:labels:org.edgexfoundry.service: edgex-device-virtualname: edgex-device-virtualspec:replicas: 1selector:matchLabels:org.edgexfoundry.service: edgex-device-virtualstrategy:type: Recreatetemplate:metadata:labels:org.edgexfoundry.service: edgex-device-virtualspec:hostname: edgex-device-virtualnodeSelector:apps.openyurt.io/nodepool: hangzhoucontainers:- name: edgex-device-virtualimage: openyurt/device-virtual:2.1.0imagePullPolicy: IfNotPresentports:- containerPort: 59900name: "tcp-59900"protocol: TCPenv:- name: MESSAGEQUEUE_HOSTvalue: edgex-redis- name: SERVICE_HOSTvalue: edgex-device-virtualenvFrom:- configMapRef:name: common-variablesstartupProbe:tcpSocket:port: 59900periodSeconds: 1failureThreshold: 120livenessProbe:tcpSocket:port: 59900restartPolicy: Always---apiVersion: v1kind: Servicemetadata:labels:org.edgexfoundry.service: edgex-device-virtualname: edgex-device-virtualspec:ports:- name: "tcp-59900"port: 59900protocol: TCPtargetPort: 59900selector:org.edgexfoundry.service: edgex-device-virtualtype: NodePort
check EdgeX instance status
$ kubectl get edgexNAME READY SERVICE READYSERVICE DEPLOYMENT READYDEPLOYMENTedgex-sample-hangzhou true 9 9 9 9
2. install yurt-device-controller
install CRDs of yurt-device-controller
$ kubectl apply -f https://raw.githubusercontent.com/openyurtio/yurt-device-controller/main/config/setup/crd.yaml
use UnitedDeployment to deploy yurt-device-controller instance in nodepool hangzhou. It should be pointed out that we use cluster-admin ClusterRole just for demo purpose
apiVersion: apps.openyurt.io/v1alpha1kind: UnitedDeploymentmetadata:labels:controller-tools.k8s.io: "1.0"name: ud-devicenamespace: defaultspec:selector:matchLabels:app: ud-devicetopology:pools:- name: hangzhounodeSelectorTerm:matchExpressions:- key: apps.openyurt.io/nodepooloperator: Invalues:- hangzhoureplicas: 1tolerations:- operator: ExistsworkloadTemplate:deploymentTemplate:metadata:creationTimestamp: nulllabels:app: ud-devicespec:selector:matchLabels:app: ud-devicestrategy: {}template:metadata:creationTimestamp: nulllabels:app: ud-devicecontrol-plane: controller-managerspec:containers:- args:- --health-probe-bind-address=:8081- --metrics-bind-address=127.0.0.1:8080- --leader-elect=false- --namespace=default- --v=5command:- /yurt-device-controllerimage: openyurt/yurt-device-controller:v0.2.0imagePullPolicy: IfNotPresentlivenessProbe:failureThreshold: 3httpGet:path: /healthzport: 8081scheme: HTTPinitialDelaySeconds: 15periodSeconds: 20successThreshold: 1timeoutSeconds: 1name: managerreadinessProbe:failureThreshold: 3httpGet:path: /readyzport: 8081scheme: HTTPinitialDelaySeconds: 5periodSeconds: 10successThreshold: 1timeoutSeconds: 1resources:limits:cpu: 100mmemory: 512Mirequests:cpu: 100mmemory: 512MisecurityContext:allowPrivilegeEscalation: falsednsPolicy: ClusterFirstrestartPolicy: AlwayssecurityContext:runAsUser: 65532---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: ud-rolebindingroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-adminsubjects:- kind: ServiceAccountname: defaultnamespace: default
check whether yurt-device-controller has been deployed successful
$ kubectl get pod |grep yurt-device-controlleryurt-device-controller-xxxxxx-sf7xz-79c9cbf4b7-mbfds 1/1 Running 0 6d22h
3. Check virtual devices synced from EdgeX
The device-virtual-go driver will automatically create and register 5 virtual devices of different kinds upon start, yurt-device-controller will then sync them to OpenYurt. You can use kubectl to check it:
$ kubectl get deviceNAME NODEPOOL SYNCED AGEhangzhou-random-binary-device hangzhou true 19hhangzhou-random-boolean-device hangzhou true 19hhangzhou-random-float-device hangzhou true 19hhangzhou-random-integer-device hangzhou true 19hhangzhou-random-unsignedinteger-device hangzhou true 19h
4. Uninstall and cleanup
$ export WORKER_NODEPOOL="hangzhou"$ export EDGE_NODE="node1"# 1.1 delete all device, deviceservice, deviceprofile资源$ kubectl delete device --all$ kubectl delete deviceprofile --all$ kubectl delete deviceservice --all# 1.2 uninstall yurt-device-controller$ kubectl delete uniteddeployment yurt-device-controller$ kubectl delete clusterrolebinding ud-rolebinding# 1.3 delete CRDs of yurt-device-controller$ kubectl delete -f https://raw.githubusercontent.com/openyurtio/yurt-device-controller/main/config/setup/crd.yaml# 2.1 delete EdgeX instance$ kubectl delete edgex --all# 2.2 uninstall yurt-edgex-manager$ kubectl delete -f https://github.com/openyurtio/yurt-edgex-manager/releases/download/v0.2.0/yurt-edgex-manager.yaml# (optional)# 3.1 remove node from nodepool$ kubectl label node $EDGE_NODE apps.openyurt.io/desired-nodepool-# 3.2 delete nodepool$ kubectl delete nodepool $WORKER_NODEPOOL
