架构图
image.png
MQTT
安装mqtt(也可以选择docker运行)
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto-dev
sudo apt-get install mosquitto-clients
sudo service mosquitto status
测试mqtt
#打开一个终端,执行以下命令订阅主题"mqtt"
mosquitto_sub -h localhost -t "mqtt" -v
#打开另外一个终端,发布消息到主题 “mqtt”
mosquitto_pub -h localhost -t "mqtt" -m "Hello MQTT"
创建应用
kubeedge examples
git clone https://github.com/kubeedge/examples.git
本章将使用 Web Demo 这个例子
创建CRD
cd $GOPATH/src/github.com/kubeedge/examples/web-demo/kubeedge-web-app/deployments/
kubectl create -f kubeedge-speaker-model.yaml
kubectl create -f kubeedge-speaker-instance.yaml
deviceModel(描述某一类设备)
apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:
name: speaker-model
namespace: default
spec:
properties:
- name: track # 属性名称
description: music track to play # 描述
type:
string: # 值类型
accessMode: ReadWrite #可读写
defaultValue: '' # 默认值
device(设备实例)
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:
name: speaker-01
labels:
description: 'Speaker'
manufacturer: 'test'
spec:
deviceModelRef:
name: speaker-model # 关联的device model
nodeSelector: # 节点选择(这里是节点的标签)
nodeSelectorTerms:
- matchExpressions:
- key: 'kubernetes.io/hostname'
operator: In
values:
- aaa
创建云上的控制应用
cd $GOPATH/src/github.com/kubeedge/examples/web-demo/kubeedge-web-app/deployments/
kubectl create -f kubeedge-web-app.yaml
这里加上环境变量
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: kubeedge-web-app
name: kubeedge-web-app
namespace: default
spec:
selector:
matchLabels:
k8s-app: kubeedge-web-app
template:
metadata:
labels:
k8s-app: kubeedge-web-app
spec:
nodeSelector:
node-role.kubernetes.io/master: ""
hostNetwork: true
containers:
- name: kubeedge-web-app
image: xiangxinyong/kubeedge-web-app:v2.6
imagePullPolicy: IfNotPresent
env:
- name: KUBERNETES_SERVICE_HOST
value: "你的ip" # 修改
- name: KUBERNETES_SERVICE_PORT
value: "6443"
command: ["sleep"]
args: ["10000000"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: kubeedge-web-app
namespace: default
rules:
- apiGroups: ["devices.kubeedge.io"]
resources: ["devices"]
verbs: ["get", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: kubeedge-web-app-rbac
namespace: default
subjects:
- kind: ServiceAccount
name: default
roleRef:
kind: Role
name: kubeedge-web-app
apiGroup: rbac.authorization.k8s.io
在网页访问需要加上svc
apiVersion: v1
kind: Service
metadata:
name: kubeedge-webapp
namespace: default
labels:
app: web
spec:
ports:
- nodePort: 30005
port: 80
protocol: TCP
targetPort: 80
selector:
k8s-app: kubeedge-web-app
sessionAffinity: None
type: NodePort
如果运行起来有问题,可以自己编译一下代码!
操作
-
在页面选择歌曲8,play
image.png -
app会如下log
image.png -
kubectl describe device speaker-01,此时可以看到,value 已经变成了8
image.png -
现在来看边缘的日志
注意:需要打开边缘配置里的mqtt相关的配置
这里会收到device的变更,并发布到mqtt
image.png -
此时定义相关主题就可以获取到值的变更信息,mapper的主要逻辑就是做这个事情。
先看效果
image.png
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code: " + str(rc))
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('127.0.0.1', 1883, 600) # 600为keepalive的时间间隔
client.subscribe('$hw/events/device/speaker-01/twin/update/document', qos=1)
client.loop_forever() # 保持连接