Condividi tramite


Avvio rapido: Distribuire un Host contenitore Linux di Azure per un cluster del servizio Azure Kubernetes tramite un modello di ARM

Introduzione all'host contenitore Linux di Azure usando un modello di Azure Resource Manager (ARM) per distribuire un cluster Host contenitore Linux di Azure. Dopo aver installato i prerequisiti, si creerà una coppia di chiavi SSH, si esaminerà il modello, si distribuirà il modello e lo si convalida e quindi si distribuirà un'applicazione.

Un modello di Azure Resource Manager è un file JSON (JavaScript Object Notation) che definisce l'infrastruttura e la configurazione del progetto. Il modello utilizza la sintassi dichiarativa. Si descrive la distribuzione prevista senza scrivere la sequenza di comandi di programmazione necessari per creare la distribuzione.

Prerequisiti

  • Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

  • Usare l'ambiente Bash in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido in Azure Cloud Shell - Bash.

  • Se si preferisce eseguire i comandi di riferimento dell'interfaccia della riga di comando in locale, installare l'interfaccia della riga di comando di Azure. Per l'esecuzione in Windows o macOS, è consigliabile eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker. Per altre informazioni, vedere Come eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker.

  • Se il kubectl non è già installato, installarlo tramite l'interfaccia della riga di comando di Azure usando az aks install-cli o seguire le istruzioni upstream.

  • Per creare un cluster del servizio Azure Kubernetes usando un modello di Resource Manager, è necessario fornire una chiave pubblica SSH. Se è necessaria questa risorsa, vedere la sezione successiva. In caso contrario, andare alla sezione Esaminare il modello.

  • L'identità usata per creare il cluster ha le autorizzazioni minime adeguate. Per altre informazioni sull'accesso e l'identità per il servizio Azure Kubernetes, vedere Opzioni di accesso e identità per il servizio Azure Kubernetes.

  • Per distribuire un file Bicep o un modello di ARM, è necessario l'accesso in scrittura alle risorse distribuite e l'accesso per tutte le operazioni sul tipo di risorsa Microsoft.Resources/deployments. Ad esempio, per distribuire una macchina virtuale, sono necessarie le autorizzazioni Microsoft.Compute/virtualMachines/write e Microsoft.Resources/deployments/*. Per un elenco dei ruoli e delle autorizzazioni, vedere Ruoli predefiniti di Azure.

Creare una coppia di chiavi SSH

Per accedere ai nodi del servizio Azure Kubernetes, connettersi usando una coppia di chiavi SSH (pubblica e privata), generata usando il comando ssh-keygen. Per impostazione predefinita, questi file vengono creati nella directory ~/.ssh. L'esecuzione del comando ssh-keygen sovrascrive qualsiasi coppia di chiavi SSH con lo stesso nome già esistente nella posizione specificata.

  1. Passare a https://shell.azure.com per aprire Cloud Shell nel browser.

  2. Eseguire il comando ssh-keygen. L'esempio seguente crea una coppia di chiavi SSH usando la crittografia RSA e una lunghezza in bit pari a 4096:

    ssh-keygen -t rsa -b 4096
    

Per altre informazioni su come creare le chiavi SSH, vedere Creare e gestire chiavi SSH per l'autenticazione in una macchina virtuale Linux in Azure.

Rivedere il modello

La distribuzione seguente usa un modello di ARM da modelli di avvio rapido di Azure.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.1",
  "parameters": {
    "clusterName": {
      "type": "string",
      "defaultValue": "azurelinuxakscluster",
      "metadata": {
        "description": "The name of the Managed Cluster resource."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location of the Managed Cluster resource."
      }
    },
    "dnsPrefix": {
      "type": "string",
      "metadata": {
        "description": "Optional DNS prefix to use with hosted Kubernetes API server FQDN."
      }
    },
    "osDiskSizeGB": {
      "type": "int",
      "defaultValue": 0,
      "minValue": 0,
      "maxValue": 1023,
      "metadata": {
        "description": "Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 will apply the default disk size for that agentVMSize."
      }
    },
    "agentCount": {
      "type": "int",
      "defaultValue": 3,
      "minValue": 1,
      "maxValue": 50,
      "metadata": {
        "description": "The number of nodes for the cluster."
      }
    },
    "agentVMSize": {
      "type": "string",
      "defaultValue": "Standard_DS2_v2",
      "metadata": {
        "description": "The size of the Virtual Machine."
      }
    },
    "linuxAdminUsername": {
      "type": "string",
      "metadata": {
        "description": "User name for the Linux Virtual Machines."
      }
    },
    "sshRSAPublicKey": {
      "type": "string",
      "metadata": {
        "description": "Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example 'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm'"
      }
    },
    "osType": {
      "type": "string",
      "defaultValue": "Linux",
      "allowedValues": [
        "Linux"
      ],
      "metadata": {
        "description": "The type of operating system."
      }
    },
    "osSKU": {
      "type": "string",
      "defaultValue": "AzureLinux",
      "allowedValues": [
        "AzureLinux",
        "Ubuntu"
      ],
      "metadata": {
        "description": "The Linux SKU to use."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.ContainerService/managedClusters",
      "apiVersion": "2021-03-01",
      "name": "[parameters('clusterName')]",
      "location": "[parameters('location')]",
      "properties": {
        "dnsPrefix": "[parameters('dnsPrefix')]",
        "agentPoolProfiles": [
          {
            "name": "agentpool",
            "mode": "System",
            "osDiskSizeGB": "[parameters('osDiskSizeGB')]",
            "count": "[parameters('agentCount')]",
            "vmSize": "[parameters('agentVMSize')]",
            "osType": "[parameters('osType')]",
            "osSKU": "[parameters('osSKU')]",
            "storageProfile": "ManagedDisks"
          }
        ],
        "linuxProfile": {
          "adminUsername": "[parameters('linuxAdminUsername')]",
          "ssh": {
            "publicKeys": [
              {
                "keyData": "[parameters('sshRSAPublicKey')]"
              }
            ]
          }
        }
      },
      "identity": {
          "type": "SystemAssigned"
      }
    }
  ],
  "outputs": {
    "controlPlaneFQDN": {
      "type": "string",
      "value": "[reference(parameters('clusterName')).fqdn]"
    }
  }
}

Per aggiungere Azure Linux a un modello di ARM esistente, è necessario aggiungere "osSKU": "AzureLinux" e "mode": "System" a agentPoolProfiles e impostare l'apiVersion su 2021-03-01 o versione successiva ("apiVersion": "2021-03-01").

Distribuire il modello

  1. Selezionare il pulsante seguente per accedere ad Azure e aprire un modello.

    Pulsante per distribuire il modello di Resource Manager in Azure.

  2. Selezionare o immettere i valori seguenti.

    Per questo modello di avvio rapido, lasciare i valori predefiniti per Dimensioni disco sistema operativo, Numero di agenti, Dimensioni macchina virtuale agente, Tipo di sistema operativo e Versione di Kubernetes. Specificare i valori personalizzati per i parametri del modello seguenti:

    • Sottoscrizione: selezionare una sottoscrizione di Azure.
    • Gruppo di risorse: selezionare Crea nuovo. Specificare un nome univoco per il gruppo di risorse, ad esempio testAzureLinuxResourceGroup quindi scegliere OK.
    • Località: selezionare una località, ad esempio Stati Uniti orientali.
    • Nome cluster: immettere un nome univoco per il cluster del servizio Azure Kubernetes, ad esempio testAzureLinuxCluster.
    • Prefisso DNS: inserire un prefisso DNS univoco per il cluster, ad esempio myAzureLinuxCluster.
    • Nome utente amministratore Linux: immettere un nome utente per connettersi tramite SSH, ad esempio azureuser.
    • Chiave pubblica SSH RSA: copiare e incollare la parte pubblica della coppia di chiavi SSH (per impostazione predefinita, il contenuto di ~/.ssh/id_rsa.pub).

    Screenshot del modello di Resource Manager per creare un cluster del Servizio Azure Kubernetes nel portale.

  3. Selezionare Rivedi e crea.

La creazione del cluster Host contenitore Linux di Azure richiede alcuni minuti. Attendere il completamento della distribuzione del cluster prima di procedere al passaggio successivo.

Convalidare la distribuzione

Stabilire la connessione al cluster

Per gestire un cluster Kubernetes, usare il client da riga di comando kubernetes kubectl.

  1. Eseguire l'installazione kubectl in locale usando il comando az aks install-cli:

    az aks install-cli
    
  2. Configurare kubectl per connettersi al cluster Kubernetes usando il comando az aks get-credentials. Questo comando scarica le credenziali e configura l'interfaccia della riga di comando di Kubernetes per usarli.

    az aks get-credentials --resource-group testAzureLinuxResourceGroup --name testAzureLinuxCluster
    
  3. Verificare la connessione al cluster usando il comando kubectl get. Questo comando restituisce un elenco dei nodi del cluster.

    kubectl get nodes
    

    L'esempio di output seguente mostra i tre nodi creati nei passaggi precedenti. Assicurarsi che lo stato del nodo sia Pronto:

    NAME                       STATUS   ROLES   AGE     VERSION
    aks-agentpool-41324942-0   Ready    agent   6m44s   v1.12.6
    aks-agentpool-41324942-1   Ready    agent   6m46s   v1.12.6
    aks-agentpool-41324942-2   Ready    agent   6m45s   v1.12.6
    

Distribuire l'applicazione

Un file manifesto Kubernetes definisce lo stato desiderato di un cluster, ad esempio le immagini del contenitore da eseguire.

In questo avvio rapido: si usa un manifesto per creare tutti gli oggetti necessari per eseguire l'applicazione Azure Vote. Questo manifesto include due distribuzioni Kubernetes:

  • Applicazioni Python di Azure Vote di esempio.
  • Istanza di Redis.

Vengono creati anche due servizi Kubernetes:

  • Servizio interno per l'istanza di Redis.
  • Un servizio esterno per accedere all'applicazione Azure Vote da Internet.
  1. Creare un file denominato azure-vote.yaml.

    • Se si usa Azure Cloud Shell, questo file può essere creato usando code, vi o nano come se si usasse un sistema virtuale o fisico
  2. Copiare al suo interno la definizione YAML seguente:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: azure-vote-back
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: azure-vote-back
      template:
        metadata:
          labels:
            app: azure-vote-back
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: azure-vote-back
            image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
            env:
            - name: ALLOW_EMPTY_PASSWORD
              value: "yes"
            resources:
              requests:
                cpu: 100m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            ports:
            - containerPort: 6379
              name: redis
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: azure-vote-back
    spec:
      ports:
      - port: 6379
      selector:
        app: azure-vote-back
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: azure-vote-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: azure-vote-front
      template:
        metadata:
          labels:
            app: azure-vote-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: azure-vote-front
            image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
            resources:
              requests:
                cpu: 100m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            ports:
            - containerPort: 80
            env:
            - name: REDIS
              value: "azure-vote-back"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: azure-vote-front
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-vote-front
    

    Per un dettaglio dei file manifesto YAML, vedere Distribuzioni e manifesti YAML.

  3. Distribuire l'applicazione usando il comando kubectl apply e specificare il nome del manifesto YAML:

    kubectl apply -f azure-vote.yaml
    

    L'esempio seguente è simile all'output che mostra distribuzioni e servizi creati correttamente:

    deployment "azure-vote-back" created
    service "azure-vote-back" created
    deployment "azure-vote-front" created
    service "azure-vote-front" created
    

Testare l'applicazione

Quando l'applicazione viene eseguita, un servizio Kubernetes espone il front-end dell'applicazione a Internet. Questo processo può richiedere alcuni minuti.

Monitorare lo stato usando il comando kubectl get service con l'argomento --watch.

kubectl get service azure-vote-front --watch

L'output EXTERNAL-IP per il servizio azure-vote-front verrà visualizzato inizialmente come in sospeso.

NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
azure-vote-front   LoadBalancer   10.0.37.27   <pending>     80:30572/TCP   6s

Quando l'indirizzo EXTERNAL-IP passa da in sospeso a un effettivo indirizzo IP pubblico, usare CTRL-C per arrestare il processo di controllo kubectl. L'output di esempio seguente mostra un indirizzo IP pubblico valido assegnato al servizio:

azure-vote-front   LoadBalancer   10.0.37.27   52.179.23.131   80:30572/TCP   2m

Per visualizzare l'app Azure Vote in azione, aprire un browser Web all'indirizzo IP esterno del servizio.

Screenshot del passaggio all'applicazione Azure Vote di esempio.

Eliminare il cluster

Se non si intende continuare con le esercitazioni seguenti, per evitare addebiti di Azure per pulire le risorse non necessarie. Usare il comando az group delete per rimuovere il gruppo di risorse e tutte le risorse correlate.

az group delete --name testAzureLinuxCluster --yes --no-wait

Passaggi successivi

In questo avvio rapido è stato distribuito un cluster Host contenitore Linux di Azure. Per altre informazioni sull'Host contenitore Linux di Azure ed eseguire un esempio completo di distribuzione e gestione del cluster, continuare con l'esercitazione sull'host contenitore Linux di Azure.