Akri를 사용하여 OPC UA 서버 검색
Akri는 Kubernetes 클러스터에서 다른 유형의 리프 디바이스(예: IP 카메라 및 USB 디바이스)를 리소스로 쉽게 노출할 수 있는 Kubernetes 리소스 인터페이스입니다. Akri는 이러한 디바이스에 대한 액세스 권한이 있는 노드를 지속적으로 검색하여 워크로드를 기반으로 워크로드를 예약합니다. Akri는 리프 디바이스의 동적 모양과 실종을 처리하는 에지를 위해 만들어진 CNCF 샌드박스 프로젝트입니다. 현재 OPC UA, ONVIF 및 udev 프로토콜을 지원하지만 템플릿에서 제공하는 사용자 지정 프로토콜 처리기를 구현할 수도 있습니다. Akri에 대한 자세한 내용은 여기를 참조하세요.
이 문서에서는 AKS Edge Essentials 클러스터에 Akri를 배포하여 Azure에서 샘플 OPC PLC 서버 컨테이너를 배포하고 검색하는 방법을 설명합니다. OPC UA는 산업 자동화를 위한 통신 프로토콜입니다. 보안 및 통신 프레임워크와 함께 제공되는 클라이언트/서버 기술입니다. 데모의 어느 시점에서든 OPC UA에 대해 자세히 알아보거나 용어를 명확히 하려면 온라인 OPC UA 사양을 참조하세요.
이 데모를 통해 Akri를 사용하여 OPC UA 서버를 검색하고 OPC UA 클라이언트가 포함된 브로커를 통해 사용할 수 있습니다. 특히 이 시나리오에 대해 OPC UA 모니터링 이라는 Akri 구성이 만들어졌습니다. 이 구성은 Akri를 사용하여 특정 OPC UA 변수의 변칙 값을 검색하는 방법을 보여줍니다. 이를 위해 brokers의 OPC UA 클라이언트는 해당 변수를 구독하고 gRPC를 통해 해당 값을 제공하므로 변칙 검색 웹 애플리케이션이 사용할 수 있습니다. 이 구성을 사용하여 기압계, CO 감지기 등을 모니터링할 수 있습니다. 그러나 이 예제의 경우 OPC UA 변수는 온도 조절기의 온도에 대한 PLC(프로그래밍 가능한 논리 컨트롤러) 값을 나타냅니다. 70-80도 범위를 벗어난 값은 변칙입니다. 또한 보안을 위해 인증서를 사용하려는 경우 끝에 있는 섹션으로 건너뜁니다.
필수 구성 요소
- AKS Edge Essentials 클러스터를 가동 및 실행합니다.
- Azure 구독 및 OPC PLC 서버를 배포할 리소스 그룹입니다.
- Akri는 Linux에서만 작동합니다. 이 연습에서는 Linux 노드를 사용합니다.
OPC UA 서버 만들기
이제 검색할 일부 OPC UA PLC 서버를 만듭니다. 처음부터 시작하는 대신 OPC PLC 서버 컨테이너를 배포합니다. 컨테이너 및 해당 매개 변수에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 이 데모에서는 제공된 템플릿을 사용하여 OPC PLC 서버 컨테이너 인스턴스를 Azure에 배포합니다.
Azure IoT Edge OPC PLC 샘플의 추가 정보로 이동하여 Azure에 배포를 선택합니다.
템플릿 편집을 선택하고 줄 172로 이동합니다. 전체 줄을 다음 코드로 바꿔 원하는 OPC PLC 서버를 배포하는 데 필요한 플래그를 추가합니다.
"[concat('./opcplc --pn=50000 --sph --fn=1 --fr=1 --ft=uint --ftl=65 --ftu=85 --ftr=True --aa --sph --ftl=65 --ftu=85 --ftr=True --ut', ' --ph=', variables('aciPlc'), add(copyIndex(), 1), '.', resourceGroup().location, '.azurecontainer.io')]"
추가 정보 파일에서 매개 변수에 대해 자세히 읽을 수 있습니다.
템플릿을 저장하고 프로젝트를 입력하고 세부 정보를 instance. 의 경우
Number of Simulations
두 개의 OPC PLC 서버를 실행하기 위해 를 지정2
합니다.검토 및 만들기를 선택한 다음, 만들기를 선택하여 Azure에 서버를 배포합니다.
이제 각각 하나의 빠른 PLC 노드가 있는 두 개의 OPC UA PLC 서버를 성공적으로 만들었으며, 이 서버는 하한 = 65, 상한 = 85의 속도로부호 없는 정수를 생성합니다.
Akri 실행
Azure Portal 컨테이너 인스턴스가 시작되었는지 확인하여 OPC UA 서버가 실행 중인지 확인합니다.
Akri가 서버를 제대로 검색하려면 Akri를 설치할 때 올바른 검색 URL을 지정합니다.
검색 URL은 로
opc.tcp://<FQDN>:50000/
표시됩니다. OPC PLC 서버의 FQDN을 얻으려면 Azure에서 배포로 이동하면 FQDN이 표시됩니다. FQDN을 복사하여 각 서버의 검색 URL에 붙여넣습니다.아직 추가하지 않은 경우 Akri helm 차트를 추가합니다.
helm repo add akri-helm-charts https://project-akri.github.io/akri/
이전에 Akri helm 차트를 이미 추가한 경우 최신 빌드에 대한 리포지토리를 업데이트합니다.
helm repo update
Helm을 사용하여 Akri를 설치합니다. Akri를 설치할 때 helm 값을
opcua.discovery.enabled=true
설정하여 OPC UA 검색 처리기를 배포하도록 지정합니다.이 시나리오에서는 브로커가
Identifier
모니터링할 NodeID의 및NamespaceIndex
를 지정합니다. 이 경우 의 및NamespaceIndex
2
가 있는Identifier
FastUInt1
이전에 만든 온도 변수입니다.를
opcua.configuration.discoveryDetails.discoveryUrls
이전 단계에서 얻은 URL로 바꿔야 합니다.helm install akri akri-helm-charts/akri ` --set opcua.discovery.enabled=true ` --set opcua.configuration.enabled=true ` --set opcua.configuration.name=akri-opcua-monitoring ` --set opcua.configuration.brokerPod.image.repository="ghcr.io/project-akri/akri/opcua-monitoring-broker" ` --set opcua.configuration.brokerPod.image.tag="latest-dev" ` --set opcua.configuration.brokerProperties.IDENTIFIER='FastUInt1' ` --set opcua.configuration.brokerProperties.NAMESPACE_INDEX='2' ` --set opcua.configuration.discoveryDetails.discoveryUrls[0]="opc.tcp://<FQDN of 1st container instance>:50000/" ` --set opcua.configuration.discoveryDetails.discoveryUrls[1]="opc.tcp://<FQDN of 2nd container instance>:50000/" `
참고
FastUInt1
는 OPC PLC 서버에서 제공하는 빠르게 변화하는 노드 의 식별자입니다.OPC UA 구성 설정에 대한 자세한 내용은 여기를 참조하세요.
Akri가 설치되면 Akri 에이전트는 두 서버를 검색하고 각 서버에 대한 instance 만듭니다. 각 서버에 대해 하나씩 두 개의 broker Pod가 회전하는 모습을 지켜봅니다.
kubectl get pods -o wide --watch
Akri의 모니터링 Pod가 OPC UA 서버에 성공적으로 연결되었는지 확인할 수도 있습니다.
kubectl logs <name of OPC UA monitoring pod>
Akri의 요소를 더 많이 검사하려면 다음을 수행합니다.
- 를 실행
kubectl get crd
하면 CRD가 나열됩니다. - 를 실행
kubectl get akric
하면 가 표시됩니다akri-opcua-monitoring
. - OPC PLC 서버가 검색되고 Pod가 회전하는 경우 를 실행
kubectl get akrii
하여 인스턴스를 볼 수 있으며 를 실행kubectl get akrii akri-opcua-monitoring-<ID> -o yaml
하여 추가로 검사할 수 있습니다.
- 를 실행
브로커의 최종 소비자로 변칙 검색 웹 애플리케이션 배포
이 엔드 투 엔드 데모에 대한 샘플 변칙 검색 웹 애플리케이션이 만들어졌습니다. 브로커의 gRPC 서비스를 호출하여 최신 온도 값을 가져오는 gRPC 스텁이 있습니다. 그런 다음 이 값이 로컬 이상값 요소 전략을 사용하여 데이터 세트의 이상값인지 여부를 결정합니다. 데이터 세트는 단순히 70-80 사이의 숫자가 여러 번 반복되는 CSV 파일입니다. 따라서 이 범위를 크게 벗어난 값은 이상값으로 표시됩니다. 웹 애플리케이션은 모든 온도 값과 값을 보낸 OPC UA 서버의 주소를 표시하는 로그 역할을 합니다. 변칙 값이 빨간색으로 표시됩니다. OPC UA 서버에서 함수를 설정하는 방법으로 DoSimulation
인해 변칙의 값은 항상 120입니다.
변칙 검색 앱을 배포하고 앱에 대한 Pod 스핀업을 watch.
kubectl apply -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
kubectl get pods -o wide --watch
Pod가 실행되면 노드 IP 및 앱의 서비스 포트 번호를 가져옵니다.
Get-AKSEdgeNodeAddr
kubectl get svc
http://<NODE IP>:<SERVICE PORT NUM>/
로 이동합니다. 사이트가 로드되는 데 몇 초 정도 걸립니다. 그러면 몇 초마다 업데이트되는 온도 값 로그가 표시됩니다. 값은 두 개의 서로 다른 검색 URL, 특히 두 OPC UA 서버 각각에 대한 URL에서 어떻게 제공되는지 확인합니다.
선택 사항: OPC UA 서버 및 브로커에 대한 인증서
보안을 강화하기 위해 인증서를 사용하여 Akri를 사용해 볼 수 있는 선택적 절차입니다. 다음 단계에 따라 보안을 사용하여 OPC PLC 서버를 배포하고 서버 및 브로커를 인증하는 데 사용할 수 있는 Kubernetes 비밀을 만듭니다.
보안을 사용하여 OPC UA 서버 만들기
Azure IoT Edge OPC PLC 샘플의 추가 정보로 이동하여 Azure에 배포를 선택합니다.
템플릿 편집을 선택하고 줄 172로 이동합니다. 전체 줄을 다음 코드로 바꿔 원하는 OPC PLC 서버를 배포하는 데 필요한 플래그를 추가합니다.
"[concat('./opcplc --pn=50000 --sph --fn=1 --fr=1 --ft=uint --ftl=65 --ftu=85 --ftr=True --aa --sph --ftl=65 --ftu=85 --ftr=True', ' --ph=', variables('aciPlc'), add(copyIndex(), 1), '.', resourceGroup().location, '.azurecontainer.io')]"
섹션 아래에
resources
세 번째properties
(줄 167) 섹션(, ,command
,ports
등과image
같은 수준) 내에 다음 코드를 추가합니다."volumeMounts": [ { "name": "filesharevolume", "mountPath": "/app/pki" } ],
그런 다음 두 번째 "properties"(줄 163) 섹션(과 동일한 수준
containers
) 내에 다음 코드를 추가합니다."volumes": [ { "name": "filesharevolume", "azureFile": { "shareName": "acishare", "storageAccountName": "<storageAccName>", "storageAccountKey": "<storageAccKey>" } } ]
템플릿을 저장하고 프로젝트를 입력하고 세부 정보를 instance. 의 경우
Number of Simulations
두 개의 OPC PLC 서버를 실행하기 위해 를 지정2
합니다.검토 및 만들기를 선택한 다음, 만들기를 선택하여 Azure에 서버를 배포합니다.
이제 각각 하나의 빠른 PLC 노드가 있는 두 개의 OPC UA PLC 서버를 성공적으로 만들었으며, 이 서버는 하한 = 65, 상한 = 85의 속도로부호 없는 정수를 생성합니다.
X.509 v3 인증서 만들기
인증서에 애플리케이션 URI와 같은 필요한 구성 요소가 포함되어 있는지 확인하여 OPC UA 규격 X.509v3 인증서 3개(broker 및 각 서버에 대해 하나씩)를 만듭니다.
인증서 요구 사항:
- 모두 공통 CA(인증 기관)에서 서명해야 하며 모든 인증서에 대한 서명 알고리즘은 이어야
SHA256
합니다. - 키 크기도 비트보다 크거나 같
2048
아야 합니다. - 서버 인증서 및 AkriBroker 인증서의 DNS는 생성된 INSTANCE OPC UA 서버 컨테이너의 FQDN을 포함해야 합니다(FQDN을 가져오는 방법을 알아보려면 Akri 실행의 3단계로 이동).
- OPC UA 서버 인증서의 이름을 지정
OpcPlc
해야 하고(인증서 생성 용어CN=OpcPlc
로) Akri broker 인증서의 이름을AkriBroker
지정해야 합니다(CN=AkriBroker
)(CA 이름에 대한 요구 사항은 없음).
OPC Foundation의 인증서 생성기 또는 OpenSSL과 같이 OPC UA에 대한 적절한 인증서를 생성하기 위한 많은 도구가 있습니다. OPC Foundation의 인증서 생성기는 더 편리한 옵션이 될 수 있지만 OpenSSL은 사용자 지정을 위한 더 많은 공간을 제공합니다.
OPC Foundation의 인증서 생성기를 사용하도록 선택하는 경우 다음 단계에 따라 빌드합니다.
.zip 파일을 다운로드하거나 OPC Foundation의 인증서 생성기 리포지토리 (Misc-Tools)를 복제합니다.
Visual Studio 개발자 명령 프롬프트에서 를 실행
build_certificate-generator.bat
합니다(Visual Studio 2022 권장).Visual Studio 2022에서 솔루션을 빌드
Opc.Ua.CertificateGenerator
합니다.Opc.Ua.CertificateGenerator.exe
디렉터리에 성공적으로 빌드build/Debug/Opc.Ua.CertificateGenerator
되었는지 확인합니다.다음 예제 명령을 사용하여 인증서를 만듭니다. 자세한 옵션은 Misc-Tools 를 참조하세요.
- Self-Signed CA:
.\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -sn CN=<CA name e.g. MyCA> -ca true -pw <password>
- OPC UA 서버 인증서:
.\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -an OpcPlc -ikf '.\private\MyCA [hash].pfx' -ikp <password>-dn <DNS separated by commas>
- Akri broker 인증서:
.\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -an AkriBroker -ikf '.\private\MyCA [hash].pfx' -ikp <password>-dn <DNS separated by commas>
OpenSSL을
.crl
사용하여 CA용 파일을 만듭니다(생성기에서 CA를 만든 경우에만 파일이 누락.crl
됨).
OpenSSL을 사용하도록 선택하는 경우 참조 목록은 다음과 같습니다.
opcua-broker-credentials Kubernetes 비밀 만들기
OPC UA 클라이언트 인증서는 볼륨으로 탑재된 Kubernetes 비밀로 OPC UA 모니터링 브로커에 전달됩니다.
Kubernetes 비밀을 만들고 각 인증서/crl/프라이빗 키를 예상 키 이름(client_certificate
, , client_key
ca_certificate
및 ca_crl
)으로 프로젝션합니다. 파일 경로가 이전 섹션에서 만든 자격 증명을 가리키도록 지정합니다.
kubectl create secret generic opcua-broker-credentials `
--from-file=client_certificate=/path/to/AkriBroker/own/certs/AkriBroker\ \[<hash>\].der `
--from-file=client_key=/path/to/AkriBroker/own/private/AkriBroker\ \[<hash>\].pfx `
--from-file=ca_certificate=/path/to/ca/certs/SomeCA\ \[<hash>\].der `
--from-file=ca_crl=/path/to/ca/crl/SomeCA\ \[<hash>\].crl
인증서는 OPC UA 구성 helm 템플릿에 mountPath
표시된 것처럼 /etc/opcua-certs/client-pki의 볼륨 credentials
에 탑재됩니다. 이 경로는 브로커가 인증서를 찾을 것으로 예상되는 위치입니다.
인증서 폴더를 ACI에 탑재
다음 지침에 따라 Azure 파일 공유를 만듭니다.
Azure 파일 공유 및 인증서를 만든 후 설명된 대로 CA 및 OPC UA 서버 인증서를 파일 공유에 업로드합니다.
├── own
│ ├── certs
│ │ └── OpcPlc [hash].der
│ └── private
│ └── OpcPlc [hash].pfx
└── trusted
├── certs
│ └── CA.der
└── crl
└── CA.crl
참고
템플릿에서 보안 플래그를 추가했으므로 파일 공유에서 임의의 인증서가 생성됩니다. 파일 공유에서 확인되지 않은 인증서를 삭제할 수 있습니다(폴더 경로는 이전 다이어그램과 정확히 같아야 합니다).
보안을 위해 다음 단계를 수행한 후 컨테이너 instance 다시 시작을 클릭하여 업데이트하고 탑재된 인증서로 실행합니다.
Akri 실행 및 웹앱 배포
이전 섹션에 따라 Akri를 실행하고 서버를 검색하지만 이제 명령 끝에 줄을 --set opcua.configuration.mountCertificates='true'
추가합니다. 를 Azure Portal 찾은 URL로 바꿔 opcua.configuration.discoveryDetails.discoveryUrls
야 합니다.
helm install akri akri-helm-charts/akri `
--set opcua.discovery.enabled=true `
--set opcua.configuration.enabled=true `
--set opcua.configuration.name=akri-opcua-monitoring `
--set opcua.configuration.brokerPod.image.repository="ghcr.io/project-akri/akri/opcua-monitoring-broker" `
--set opcua.configuration.brokerPod.image.tag="latest-dev" `
--set opcua.configuration.brokerProperties.IDENTIFIER='FastUInt1' `
--set opcua.configuration.brokerProperties.NAMESPACE_INDEX='2' `
--set opcua.configuration.discoveryDetails.discoveryUrls[0]="opc.tcp://<FQDN of 1st container instance>:50000/" `
--set opcua.configuration.discoveryDetails.discoveryUrls[1]="opc.tcp://<FQDN of 2nd container instance>:50000/" `
--set opcua.configuration.mountCertificates='true'
여기에서 변칙 검색 웹 애플리케이션을 브로커의 최종 소비자로 배포하는 섹션에 따라 웹 페이지에서 OPC PLC 값을 볼 수 있습니다.
정리
변칙 검색 애플리케이션을 삭제합니다.
kubectl delete -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
클러스터에서 Akri를 제거합니다.
helm delete akri
컨테이너 instance 이동하여 OPC UA 서버 배포를 삭제한 다음, Azure Portal 삭제를 선택합니다.