K3s의 EdgeX Foundry - 시작

This blog post is part 2 of a series of articles about how to deploy and operate EdgeX Foundry - an open source software framework for IoT Edge on K3s - a lightweight, highly available, and secured orchestrator.



본 시리즈의 첫 부분에서 우리는 실제 조작을 진행하는데 필요한 모든 선결 조건을 보았다.EdgeX Foundry tutorial by Jonas Werner을 확장하고 EdgeX Foundry 서비스를 K3s에 배포합니다.우리는 K3s가 EdgeX 마이크로 서비스를 관리하고 조율하는 좋은 경량급 해결 방안이 될 것이라고 이미 알고 있다.EdgeX Foundry의 Geneva 버전을 사용하겠습니다.
이 글의 범위는 환경 온도와 같은 센서 데이터를 사용하는 가장자리 용례를 보여 주는 것이다.그런 다음 이러한 센서 데이터는 K3s에 호스팅된 EdgeXFoundry 서비스에서 처리됩니다.이 센서 데이터는 HiveMQ이라는 클라우드 기반 MQTT 에이전트로 전송됩니다.여기서 데이터는 구름 속에서 저장하고 처리할 수 있다.이 게시물에 사용된 구성과 목록은 repository에서 확인할 수 있습니다.

설치 프로그램


그림1과 같이 끝에서 끝까지의 설정이 있습니다.

DHT-22 복분자 가죽(테두리 장치)


DHT-22 센서를 사용하여 환경 온도와 습도를 캡처합니다.센서는 SMD(표면 장착 장치)에 설치된 시험판이나 저항기가 필요하지 않습니다.DHT 센서가 Raspberry Pi의 GPIO(범용 I/O) 핀에 연결됩니다.
온도를 캡처하고 센서 데이터를 EdgeX로 전송하는 스크립트에서 다음 사항이 변경되었습니다.트리베리 Pi의 EdgeX IP, DHT sensor type, GPIOedge-device-rest 서비스의 노드 포트는 다음과 같습니다.
import sys, time, requests, json, Adafruit_DHT

edgexip = "192.168.1.179"

while True:

    # Update to match DHT sensor type and GPIO pin
    rawHum, rawTmp = Adafruit_DHT.read_retry(22, 4)

    urlTemp = 'http://%s:32536/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/temperature' % edgexip
    urlHum  = 'http://%s:32536/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/humidity' % edgexip


K3s에 EdgeX를 어떻게 배치합니까?


먼저 K3s 클러스터를 배치하고 두 개의 개별 가상 시스템에 K3s 서버와 K3s 에이전트를 배치합니다. 그림3과 같습니다.K3s의 EdgeX 서비스는 게이트웨이와 비슷할 것이다(part-1의 그림4 참조).가상 시스템의 경우 Ubuntu-20.04 운영 체제를 사용합니다.가상 머신을 생성한 후 다음 단계를 수행하여 K3s를 배치합니다.
두 가상 시스템에서 고정 IP를 구성하는 것이 좋습니다.

K3s 서버/호스트


K3s 서버를 구성하려면 다음 절차를 따르십시오.
export K3s_NODE_NAME=${HOSTNAME//_/-}
export K3s_EXTERNAL_IP=<host-ip>
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh |  sh -
생성된 노드 토큰 복사
cat /var/lib/rancher/k3s/server/node-token
K3s 서버가 시작되고 실행 중인지 확인
systemctl status k3s

K3s 에이전트


K3s 에이전트를 구성하려면 다음 절차를 따르십시오.
export K3S_TOKEN=<node-token of K3s server>
export K3s_URL=https://<ip of k3s server>:6443
export INSTALL_K3S_EXEC="--docker --token $K3S_TOKEN --server $K3S_URL"
export K3S_NODE_NAME=${HOSTNAME//_/-}
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | sh -
K3s 서버가 시작되고 실행 중인지 확인
systemctl status k3s-agent
kubectlhelm 등 cli 도구가 설치되어 있는지 확인하십시오.또한 동일한 권한에 대해 올바른 권한이 설정되어 있는지 확인하십시오.K3S의 kubeconfig 파일은 /etc/rancher/k3s/k3s.yaml에 저장됩니다.계속하기 전에 KUBECONFIG 환경 변수를 설정합니다.
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

어떻게 K3s에 EdgeX Foundry를 배치합니까?


K3s가 시작되고 실행되면 repository을 복제하여 EdgeX Foundry를 배포합니다.
git clone https://github.com/rutu-k/edgex-k3s.git
EdgeX Foundry에는 서비스를 시도하고 테스트하기 위한 docker compose 목록이 있습니다.kompose을 사용하면 docker compose 목록을 Kubernetes 목록으로 변환할 수 있습니다.
또한 Kubernetes 목록으로 변환한 후 볼륨을 사용하는 프로그램이 제대로 설정되지 않아 Kubernetes에서 작업을 할 수 없습니다.따라서 상응하는 선적 명세서를 정확하게 정정해야 한다.emptyDir개의 볼륨을 손쉽게 구성할 수 있습니다.
우선, 우리는 영사부터 시작한다.Concur는 EdgeX Foundry에서 등록 센터로 사용됩니다.
helm --kubeconfig /etc/rancher/k3s/k3s.yaml upgrade --install consul ./consul-helm
영사가 실행 중이면 대시보드 http://[K3s server ip]:[NodePort of service]에 액세스할 수 있습니다.
키 값 저장소에 접근하면 비어 있습니다.EdgeX Foundry 서비스에 적절한 구성이 필요합니다.이를 위해 키 값을 가져와 concur에 저장합니다.
강좌의 docker compose 배치를 공부할 때, 나는Consor에서Key/Value JSON 파일을 내보냈다.
consul kv import --http-addr=http://[K3s server ip]@edgex-kv.json
현재 키 값 저장소에서 설정을 볼 수 있습니다.
EdgeX Foundry 어플리케이션 서비스 배포
kubectl apply -f /k3s/.
모든 응용 프로그램 서비스가 시작되고 실행 중임을 주의하십시오.
$ kubectl get svc
NAME                                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                   AGE
kubernetes                             ClusterIP   10.43.0.1       <none>        443/TCP                                                                   4d1h
edgex-redis                            ClusterIP   10.43.56.89     <none>        6379/TCP                                                                  3d23h
edgex-core-consul                      ClusterIP   None            <none>        8500/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP   25h
consul                                 NodePort    10.43.193.246   <none>        80:32688/TCP                                                              25h
edgex-app-service-configurable-mqtt    NodePort    10.43.102.126   <none>        48101:32294/TCP                                                           4h26m
edgex-app-service-configurable-rules   NodePort    10.43.138.76    <none>        48100:30136/TCP                                                           4h26m
edgex-core-command                     NodePort    10.43.52.70     <none>        48082:32400/TCP                                                           4h26m
edgex-device-rest                      NodePort    10.43.167.127   <none>        49986:32536/TCP                                                           4h26m
edgex-core-metadata                    NodePort    10.43.132.29    <none>        48081:30220/TCP                                                           4h26m
edgex-support-notifications            NodePort    10.43.39.183    <none>        48060:32680/TCP                                                           4h26m
edgex-kuiper                           NodePort    10.43.231.24    <none>        48075:30082/TCP,20498:31868/TCP                                           4h26m
edgex-support-scheduler                NodePort    10.43.6.49      <none>        48085:31497/TCP                                                           4h26m
edgex-sys-mgmt-agent                   NodePort    10.43.250.114   <none>        48090:31736/TCP                                                           4h25m
edgex-core-data                        NodePort    10.43.251.191   <none>        5563:32220/TCP,48080:31931/TCP
$ kubectl get pods
NAME                                                    READY   STATUS    RESTARTS   AGE
edgex-redis-54fb576f64-bdv9x                            1/1     Running   1          3d12h
consul-0                                                1/1     Running   0          25h
edgex-core-metadata-5bd45879cf-h9tbs                    1/1     Running   0          4h25m
edgex-kuiper-bbc6cf47-trkdl                             1/1     Running   0          4h25m
edgex-sys-mgmt-agent-7fb78c6fc5-qmqc2                   1/1     Running   0          4h25m
edgex-support-notifications-7b45446cbc-bqhvb            1/1     Running   0          4h25m
edgex-app-service-configurable-mqtt-59b5c7b6c8-8zhfc    1/1     Running   1          4h25m
edgex-app-service-configurable-rules-58c6846d54-s29hp   1/1     Running   1          4h25m
edgex-core-command-78b5ff9864-hb6wr                     1/1     Running   0          4h25m
edgex-core-data-86f5864db6-cvbl7                        1/1     Running   0          4h25m
edgex-support-scheduler-755b5779dc-br2d8                1/1     Running   0          4h25m
edgex-device-rest-599c579bf5-zbrg8                      1/1     Running   0          4h25m

EdgeX Foundry 워크플로우


EdgeX 워크플로우는 다음과 같은 세 가지 주요 부분으로 나눌 수 있습니다.장치, 핵심 데이터 서비스 및 어플리케이션 서비스또 다른 구동 부분은 센서 데이터 분석을 통해 행동을 취할 수 있지만 본고의 범위를 넘어섰다.
  • 장치 작업 흐름: 특정 센서 장치와 설정 파일을 추가하고 적당한 장치 프로토콜을 선택하며 이벤트 대상을 만들고 핵심 데이터 서비스로 보내는 과정.EdgeX Foundry에 장치를 추가하려면 그림 3과 같이 3가지 구성이 필요합니다.
  • ValueDescriptor: 다음에 장치 서비스는 EdgeX에 장치가 전송하는 데이터 유형을 알려야 합니다.만약 당신에게 숫자 5를 준다면, 그것은 당신에게 무엇을 의미합니까?상하문과 도량 단위가 없고 아무것도 없다.예를 들어, 만약 내가 지금 5피트가 카메라의 스캐닝 깊이라고 말한다면, 너는 숫자 5가 무엇을 대표하는지 더 잘 이해할 수 있을 것이다.EdgeX에서 값 설명자는 장치로 전송되거나 장치로부터 전송된 데이터(또는 값)에 대한 컨텍스트 및 측정 단위를 제공합니다.말 그대로 값 설명자는 값의 도량 단위, 최소값, 최대값 (있는 경우), 화면에 값을 표시할 때의 표시 방식 등을 설명한다.장치에서 얻은 데이터(장치에서 얻은 데이터라고 함) 또는 장치로 구동되는 데이터(이 집합이나 장치로 전송됨)는 이 데이터와 관련된 값 설명자가 필요합니다.
  • 디바이스 구성 파일: 디바이스 구성 파일은 EdgeX 시스템의 디바이스를 설명합니다.장치 서비스에서 관리하는 모든 장치는 장치 설정 파일과 연결되며, 장치 설정 파일은 지원하는 작업에 따라 장치 유형을 정의합니다.
  • 장치 정의: 제조사, 사용할 프로토콜, 장치 프로필 등 장치 정보.
  • CoreData 서비스 워크플로우: 데이터는 Event 객체로 coreData에 제출됩니다.이벤트는 특정 시점에 장치 ID 또는 이름을 통해 장치와 연관된 장치에서 가져온 센서 읽기 집합입니다.Reading 대상 중 Event 대상은 장치 감지의 특정한 값이며, 읽기 위해 상하문을 제공하기 위해 값 설명자와 연결되어 있다.
  • 어플리케이션 서비스 워크플로우: 어플리케이션 서비스는 EdgeX Foundry에서 외부 시스템과 프로세스(패키지 분석, 엔터프라이즈 또는 prem 어플리케이션, Azure IoT, AWS IoT 또는 Google IoT Core 등 클라우드 시스템)로 데이터를 가져오는 방법입니다.응용 프로그램 서비스는 데이터를 선택한 노드에 보내기 전에 준비(변환, 풍부함, 필터 등)와 정리(포맷, 압축, 암호화 등) 데이터를 제공하는 방법을 제공한다.현재 상자를 열면 지원하는 단점은 HTTP와 MQTT 단점을 포함하지만, 장래에는 다른 제품과 사용자 정의 단점을 포함할 수 있습니다.
  • 그것의 실제 행동을 보여 주시오


    스크립트를 트리거하여 DHT 센서를 활성화하고 EdgeX Foundry로 온도 값을 보냅니다.
    $ python rpiPutTempHum.py 
    Temp: 27.7999992371C, humidity: 77.5%
    Temp: 28.2000007629C, humidity: 75.5999984741%
    Temp: 28.1000003815C, humidity: 75.5%
    Temp: 28.1000003815C, humidity: 75.4000015259%
    Temp: 28.2000007629C, humidity: 75.3000030518%
    Temp: 28.2000007629C, humidity: 75.3000030518%
    Temp: 28.2000007629C, humidity: 75.3000030518%
    
    
    센서 읽기 수가 증가함에 따라 EdgeX Foundry의 이벤트 수도 증가합니다.
    └─ $ ▶ curl http://192.168.1.179:31931/api/v1/event/count
    2043
    
    우리는 또 최신 온도치를 얻을 수 있다.
    └─ $ ▶ curl http://192.168.1.179:31931/api/v1/reading | json_pp -json_opt pretty,canonical | tail -n 10
    
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  396k    0  396k    0     0  9660k      0 --:--:-- --:--:-- --:--:-- 9660k
       {
          "created" : 1632159295863,
          "device" : "Temp_and_Humidity_sensor_cluster_01",
          "id" : "ffcf2a3b-6ecc-4476-9ab6-e17ae983886f",
          "name" : "temperature",
          "origin" : 1632159295861600937,
          "value" : "28",
          "valueType" : "Int64"
       }
    ]
    
    응용 프로그램 서비스를 보여주기 위해서, 우리는 응용 프로그램 Mqtt 서비스를 설정하여 온도 값을 Mqtt 에이전트에 보낼 것입니다.edgex-app-service-configurable-mqtt 서비스("K3s의 EdgeX Foundry"섹션의 배치 서비스를 보십시오)는 지역 사회에서 제공하는 내보내기 프로그램으로 EdgeX 센서 데이터를 Hive MQ가 위탁 관리하는 공공 MQTT 에이전트(포트 1883에 있는 http://broker.mqttdashboard.com)로 보냅니다.그리고 특정한 topic을 발표하고 구독함으로써 HiveMQ에서 제공하는 MQTT 브라우저 클라이언트 시각화 센서 데이터를 사용할 수 있다.
    테마 이름은 edgex-app-service-configurable-mqtt배치(refer here)의 환경 변수에 설정됩니다.
    - name: WRITABLE_PIPELINE_FUNCTIONS_MQTTSEND_ADDRESSABLE_TOPIC
        value: DHT-SENSOR
    
    HiveMQ MQTT browser client으로 가세요.기본 구성이 있는 Connect 을 클릭합니다.그런 다음 Add New Topic Subscription 을 클릭하고 제목 DHT-SENSOR 을 입력한 다음 Subscribe 을 클릭합니다.메시지에서 센서 데이터를 볼 수 있습니다.

    결론


    본 문서에서 다음과 같은 내용을 살펴봤습니다.
  • 은 K3s를 어떻게 배치합니까?
  • docker compose 목록을 Kubernetes 목록으로 어떻게 바꿉니까?
  • 은 어떻게 K3s에 EdgeX Foundry를 배치합니까?
  • 은 어떻게 센서 데이터를 Raspberry Pi에서 EdgeX Foundry로 전송합니까?
  • 지금까지 우리는 센서에서 수신된 데이터를 어떻게 처리하는지 이미 이해했다.우리는 또 데이터를 한층 더 분석함으로써 미리 정의된 조치를 취할 수 있다.EdgeX Foundry는 eKuiper 규칙 엔진을 결합하여 Edge 분석을 지원합니다.우리는 다음 부분에서 그것을 소개할 것이다.
    나는 네가 이 문장의 내용이 풍부하고 사람을 황홀하게 하기를 바란다.이와 같은 게시물이 더 많으면 매주 저희의 통신을 구독해 주십시오.나는 네가 이 문장에 대한 견해를 매우 듣고 싶다. 그러므로 반드시 위에서 대화를 시작해야 한다.

    참고 문헌과 진일보한 읽기

  • Value Descriptors
  • Device Profile
  • EdgeX Foundry definitions
  • K3s
  • 좋은 웹페이지 즐겨찾기