Guia de início rápido: configurar o cluster
Importante
Azure IoT Operations Preview – habilitado pelo Azure Arc está atualmente em visualização. Não deve utilizar este software de pré-visualização em ambientes de produção.
Você precisará implantar uma nova instalação do Azure IoT Operations quando uma versão disponível ao público for disponibilizada. Você não poderá atualizar uma instalação de visualização.
Veja Termos de Utilização Complementares da Pré-visualizações do Microsoft Azure para obter os termos legais que se aplicam às funcionalidades do Azure que estão na versão beta, na pré-visualização ou que ainda não foram lançadas para disponibilidade geral.
Neste início rápido, você configura os seguintes recursos em seu cluster do Azure IoT Operations Preview:
- Um ponto de extremidade de ativo que define uma conexão com um servidor PLC OPC simulado que simula um forno em uma padaria.
- Um ativo que representa o forno e define os pontos de dados que o forno expõe.
- Um fluxo de dados que manipula as mensagens do forno simulado.
Um ativo é um dispositivo físico ou entidade lógica que representa um dispositivo, uma máquina, um sistema ou um processo. Por exemplo, um ativo físico pode ser uma bomba, um motor, um tanque ou uma linha de produção. Um ativo lógico que você define pode ter propriedades, transmitir telemetria ou gerar eventos.
Os servidores OPC UA são aplicações de software que comunicam com ativos. As tags OPC UA são pontos de dados que os servidores OPC UA expõem. As tags OPC UA podem fornecer dados históricos ou em tempo real sobre o status, desempenho, qualidade ou condição dos ativos.
Neste início rápido, você usa um arquivo Bicep para configurar sua instância de Operações IoT do Azure.
Pré-requisitos
Tenha uma instância do Azure IoT Operations Preview implantada em um cluster Kubernetes. O Guia de início rápido: executar o Azure IoT Operations Preview no GitHub Codespaces com K3s fornece instruções simples para implantar uma instância de Operações IoT do Azure que você pode usar para os inícios rápidos.
Salvo indicação em contrário, você pode executar os comandos do console neste início rápido em um ambiente Bash ou PowerShell.
Que problema vamos resolver?
Os dados que os servidores OPC UA expõem podem ter uma estrutura complexa e podem ser difíceis de entender. O Azure IoT Operations fornece uma maneira de modelar ativos OPC UA como tags, eventos e propriedades. Essa modelagem torna mais fácil entender os dados e usá-los em processos downstream, como o broker MQTT e fluxos de dados. Os fluxos de dados permitem manipular e encaminhar dados para serviços de nuvem, como Hubs de Eventos do Azure. Neste início rápido, o fluxo de dados altera os nomes de alguns campos na carga útil e adiciona um ID de ativo às mensagens.
Implante o simulador de PLC OPC
Este guia de início rápido usa o simulador de PLC OPC para gerar dados de amostra. Para implantar o simulador de PLC OPC, execute o seguinte comando:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml
O trecho a seguir mostra o arquivo YAML que você aplicou:
apiVersion: apps/v1
kind: Deployment
metadata:
name: opc-plc-000000
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: opcplc-000000
template:
metadata:
labels:
app.kubernetes.io/component: opcplc-000000
spec:
containers:
- name: opc-plc
image: mcr.microsoft.com/iotedge/opc-plc:latest
args:
- "--ph=opcplc-000000"
- "--cdn=opcplc-000000"
- "--ut"
- "--sn=25"
- "--sr=10"
- "--fn=2000"
- "--veryfastrate=1000"
- "--gn=5"
- "--pn=50000"
- "--maxsessioncount=100"
- "--maxsubscriptioncount=100"
- "--maxqueuedrequestcount=2000"
- "--ses"
- "--alm"
- "--at=FlatDirectory"
- "--drurs"
- "--ll-debug"
- "--nodesfile"
- "/app/config/nodesfile.json"
ports:
- containerPort: 50000
volumeMounts:
- name: opc-plc-default-application-cert
mountPath: /app/pki/own
- name: opc-plc-trust-list
mountPath: /app/pki/trusted
- name: config-volume
mountPath: /app/config
volumes:
- name: opc-plc-default-application-cert
secret:
secretName: opc-plc-default-application-cert
- name: opc-plc-trust-list
secret:
secretName: opc-plc-trust-list
- name: config-volume
configMap:
name: opc-plc-config
serviceAccountName: opcplc-000000-service-account
---
apiVersion: v1
kind: ConfigMap
metadata:
name: opc-plc-config
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
data:
nodesfile.json: |
{
"Folder": "MyTelemetry",
"NodeList": [
{
"NodeId": "ns=3;s=FastUInt100",
"Name": "Fryer Temperature",
"DataType": "Double",
"ValueRank": -1,
"AccessLevel": "CurrentReadOrWrite",
"Description": "Fryer Temperature with spikes",
"Anomaly": "Spike",
"MinValue": 150.0,
"MaxValue": 200.0
}
]
}
---
apiVersion: v1
kind: Service
metadata:
name: opcplc-000000
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
spec:
type: ClusterIP
selector:
app.kubernetes.io/component: opcplc-000000
ports:
- port: 50000
protocol: TCP
targetPort: 50000
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: opc-plc-self-signed-issuer
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: opc-plc-default-application-cert
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
spec:
secretName: opc-plc-default-application-cert
duration: 2160h # 90d
renewBefore: 360h # 15d
issuerRef:
name: opc-plc-self-signed-issuer
kind: Issuer
commonName: OpcPlc
dnsNames:
- opcplc-000000
- opcplc-000000.azure-iot-operations.svc.cluster.local
- opcplc-000000.azure-iot-operations
uris:
- urn:OpcPlc:opcplc-000000
usages:
- digital signature
- key encipherment
- data encipherment
- server auth
- client auth
privateKey:
algorithm: RSA
size: 2048
encodeUsagesInRequest: true
isCA: false
---
apiVersion: v1
kind: Secret
metadata:
name: opc-plc-trust-list
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
data: {}
---
apiVersion: batch/v1
kind: Job
metadata:
name: opcplc-000000-execute-mutual-trust
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
spec:
backoffLimit: 1
template:
spec:
containers:
- name: kubectl
image: mcr.microsoft.com/oss/kubernetes/kubectl:v1.27.1
imagePullPolicy: Always
command: ["/bin/sh"]
args: ["/scripts/execute-commands.sh"]
volumeMounts:
- name: scripts
mountPath: /scripts
readOnly: true
restartPolicy: Never
serviceAccountName: opcplc-000000-service-account
volumes:
- name: scripts
configMap:
name: opcplc-000000-execute-commands-script
---
apiVersion: v1
kind: ConfigMap
metadata:
name: opcplc-000000-execute-commands-script
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
data:
execute-commands.sh: |
#!/bin/sh
# wait 20 seconds for the resources to be created
sleep 20
# Extract the OPC UA connector application instance certificate and add it to the OPC PLC trust list
cert=$(kubectl -n azure-iot-operations get secret aio-opc-opcuabroker-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
data=$(kubectl create secret generic temp --from-literal=opcuabroker.crt="$cert" --dry-run=client -o jsonpath='{.data}')
kubectl patch secret opc-plc-trust-list -n azure-iot-operations -p "{\"data\": $data}"
# Extract the OPC PLC application instance certificate and add it to the OPC UA connector trust list
cert=$(kubectl -n azure-iot-operations get secret opc-plc-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
data=$(kubectl create secret generic temp --from-literal=opcplc-000000.crt="$cert" --dry-run=client -o jsonpath='{.data}')
kubectl patch secret aio-opc-ua-broker-trust-list -n azure-iot-operations -p "{\"data\": $data}"
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: opcplc-000000-service-account
namespace: azure-iot-operations
labels:
app.kubernetes.io/component: opcplc-000000
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: opc-plc-000000-secret-access-role
namespace: azure-iot-operations
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: opc-plc-000000-secret-access-rolebinding
namespace: azure-iot-operations
subjects:
- kind: ServiceAccount
name: opcplc-000000-service-account
namespace: azure-iot-operations
roleRef:
kind: Role
name: opc-plc-000000-secret-access-role
apiGroup: rbac.authorization.k8s.io
Atenção
Essa configuração usa um certificado de instância de aplicativo autoassinado. Não use essa configuração em um ambiente de produção. Para saber mais, consulte Configurar a infraestrutura de certificados OPC UA para o conector para OPC UA.
Definir as variáveis de ambiente
Se você estiver usando o ambiente Codespaces, as variáveis de ambiente necessárias já estão definidas e você pode ignorar esta etapa. Caso contrário, defina as seguintes variáveis de ambiente em seu shell:
# Your subscription ID
SUBSCRIPTION_ID=<subscription-id>
# The name of the resource group where your Kubernetes cluster is deployed
RESOURCE_GROUP=<resource-group-name>
# The name of your Kubernetes cluster
CLUSTER_NAME=<kubernetes-cluster-name>
Configurar o seu cluster
Execute os comandos a seguir para baixar e executar o arquivo Bicep que configura sua instância de Operações IoT do Azure. O arquivo Bicep:
- Adiciona um ponto de extremidade de ativo que se conecta ao simulador de PLC OPC.
- Adiciona um ativo que representa o forno e define os pontos de dados que o forno expõe.
- Adiciona um fluxo de dados que manipula as mensagens do forno simulado.
- Cria uma instância dos Hubs de Eventos do Azure para receber os dados.
wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/quickstart.bicep -O quickstart.bicep
AIO_EXTENSION_NAME=$(az k8s-extension list -g $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --cluster-type connectedClusters --query "[?extensionType == 'microsoft.iotoperations'].id" -o tsv | awk -F'/' '{print $NF}')
AIO_INSTANCE_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].name" -o tsv)
CUSTOM_LOCATION_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].extendedLocation.name" -o tsv | awk -F'/' '{print $NF}')
az deployment group create --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --template-file quickstart.bicep --parameters clusterName=$CLUSTER_NAME customLocationName=$CUSTOM_LOCATION_NAME aioExtensionName=$AIO_EXTENSION_NAME aioInstanceName=$AIO_INSTANCE_NAME
Rever a configuração
O arquivo Bicep configurou os seguintes recursos:
- Um ponto de extremidade de ativo que se conecta ao simulador de PLC OPC.
- Um ativo que representa o forno e define os pontos de dados que o forno expõe.
- Dois fluxos de dados que processam as mensagens do forno simulado.
- Um namespace de Hubs de Eventos do Azure que contém um hub de destino para os fluxos de dados.
Para exibir o ponto de extremidade do ativo, o ativo e os fluxos de dados, navegue até a interface do usuário da experiência de operações em seu navegador e entre com suas credenciais de ID do Microsoft Entra. Como você está trabalhando com uma nova implantação, ainda não há sites. Você pode encontrar o cluster criado no início rápido anterior selecionando Instâncias não atribuídas. Na experiência de operações, uma instância representa um cluster no qual você implantou as Operações do Azure IoT.
O ponto de extremidade do ativo define a conexão com o simulador de PLC OPC:
O ativo forno define os pontos de dados que o forno expõe:
Os fluxos de dados definem como as mensagens do forno simulado são processadas e roteadas para Hubs de Eventos na nuvem:
A captura de tela a seguir mostra como o fluxo de dados de conversão de temperatura é configurado:
Verifique se os dados estão fluindo para o broker MQTT
Verifique se os dados estão fluindo para o broker MQTT usando a ferramenta mosquitto_sub . Neste exemplo, você executa a ferramenta mosquitto_sub dentro do cluster do Kubernetes:
Execute o seguinte comando para implantar um pod que inclua as ferramentas mosquitto_pub e mosquitto_sub que são úteis para interagir com o broker MQTT no cluster:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
O trecho a seguir mostra o arquivo YAML que você aplicou:
# Important: do not use in production environments # Creates a pod with mosquitto-clients and mqttui utilities in your cluster apiVersion: v1 kind: Pod metadata: name: mqtt-client # The namespace must match the IoT MQ BrokerListener's namespace # Otherwise use the long hostname: aio-broker.azure-iot-operations.svc.cluster.local namespace: azure-iot-operations spec: # Use the "mqtt-client" service account which comes with default deployment # Otherwise create it with `kubectl create serviceaccount mqtt-client -n azure-iot-operations` serviceAccountName: mqtt-client containers: # Install mosquitto and mqttui utilities on Alpine linux - image: alpine name: mqtt-client command: ["sh", "-c"] args: ["apk add mosquitto-clients mqttui && sleep infinity"] resources: limits: cpu: 500m memory: 200Mi requests: cpu: 100m memory: 100Mi volumeMounts: - name: broker-sat mountPath: /var/run/secrets/tokens - name: trust-bundle mountPath: /var/run/certs volumes: - name: broker-sat projected: sources: - serviceAccountToken: path: broker-sat audience: aio-internal # Must match audience in BrokerAuthentication expirationSeconds: 86400 - name: trust-bundle configMap: name: azure-iot-operations-aio-ca-trust-bundle # Default root CA cert
Atenção
Esta configuração não é segura. Não use essa configuração em um ambiente de produção.
Quando o pod mqtt-client estiver em execução, execute o seguinte comando para criar um ambiente de shell no pod que você criou:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
No shell Bash no pod mqtt-client , execute o seguinte comando para se conectar ao broker MQTT usando a ferramenta mosquitto_sub inscrita no
data/thermostat
tópico:mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/#" -v --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
Este comando continua a ser executado e exibe as mensagens à medida que chegam ao
data/thermostat
tópico até que você pressione Ctrl+C para pará-lo.
Para verificar se o ativo de forno adicionado está publicando dados, exiba a telemetria azure-iot-operations/data
no tópico:
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:17.1858435Z","Value":4558},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:17.1858869Z","Value":4558}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:18.1838125Z","Value":4559},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:18.1838523Z","Value":4559}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:19.1834363Z","Value":4560},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:19.1834879Z","Value":4560}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:20.1861251Z","Value":4561},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:20.1861709Z","Value":4561}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:21.1856798Z","Value":4562},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:21.1857211Z","Value":4562}}
Se não houver fluxo de dados, reinicie o aio-opc-opc.tcp-1
pod:
Encontre o nome do seu
aio-opc-opc.tcp-1
pod usando o seguinte comando:kubectl get pods -n azure-iot-operations
O nome do seu pod é parecido com
aio-opc-opc.tcp-1-849dd78866-vhmz6
.Reinicie o
aio-opc-opc.tcp-1
pod usando um comando semelhante ao exemplo a seguir. Use o nome doaio-opc-opc.tcp-1
pod da etapa anterior:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
As tags de exemplo adicionadas no início rápido anterior geram mensagens do seu ativo que se parecem com o exemplo a seguir:
{
"temperature": {
"SourceTimestamp": "2024-08-02T13:52:15.1969959Z",
"Value": 2696
},
"Tag 10": {
"SourceTimestamp": "2024-08-02T13:52:15.1970198Z",
"Value": 2696
}
}
Verificar se os dados estão fluindo para Hubs de Eventos
Para verificar se os dados estão fluindo para a nuvem, você pode exibir sua instância de Hubs de Eventos no portal do Azure. Talvez seja necessário aguardar alguns minutos para que o fluxo de dados seja iniciado e para que as mensagens fluam para o hub de eventos.
A configuração do Bíceps aplicada anteriormente criou um namespace e um hub de Hubs de Eventos que são usados como destino pelo fluxo de dados. Para exibir o namespace e o hub, navegue até o grupo de recursos no portal do Azure que contém sua instância de Operações IoT e selecione o namespace Hubs de Eventos.
Se as mensagens estiverem fluindo para a instância, você poderá ver a contagem de mensagens recebidas na página Visão geral da instância:
Se as mensagens estiverem fluindo, você poderá usar o Data Explorer para exibir as mensagens:
Gorjeta
Talvez seja necessário atribuir a si mesmo a função Recetor de Dados dos Hubs de Eventos do Azure para o namespace Hubs de Eventos para exibir as mensagens.
Como resolvemos o problema?
Neste início rápido, você usou um arquivo bicep para configurar sua instância de Operações do Azure IoT com um ponto de extremidade de ativo, ativo e fluxo de dados. A configuração processa e encaminha dados de um forno simulado. O fluxo de dados na configuração roteia as mensagens para uma instância dos Hubs de Eventos do Azure.
Clean up resources (Limpar recursos)
Se continuar para o próximo início rápido, mantenha todos os seus recursos.
Se você quiser remover a implantação do Azure IoT Operations mas manter seu cluster, use o comando az iot ops delete :
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Se você quiser excluir todos os recursos criados para este início rápido, exclua o cluster do Kubernetes onde você implantou as Operações do Azure IoT e, em seguida, remova o grupo de recursos do Azure que continha o cluster.
Se você usou Codespaces para esses inícios rápidos, exclua seu Codespace do GitHub.
Próximo passo
Se você quiser aprender como criar um painel do Microsoft Fabric para obter informações dos dados do forno, consulte Tutorial: Obter informações dos dados processados.