Guida introduttiva: Distribuire un cluster del servizio Azure Kubernetes con il portale di Azure

Il servizio Azure Kubernetes è un servizio Kubernetes gestito che permette di distribuire e gestire rapidamente i cluster. Questa guida introduttiva spiega come:

  • Distribuisci un cluster del servizio Azure Kubernetes con il portale di Azure.
  • Eseguire un'applicazione multi-contenitore di esempio con un gruppo di microservizi e front-end Web simulando uno scenario di vendita al dettaglio.

Nota

Per iniziare ad effettuare un veloce provisioning di un cluster del servizio Azure Kubernetes, questo articolo include i passaggi per la distribuzione di un cluster con impostazioni predefinite a solo scopo di valutazione. Prima di distribuire un cluster pronto per la produzione, è consigliabile acquisire familiarità con l'architettura di riferimento iniziale per valutare se è in linea con i requisiti aziendali.

Operazioni preliminari

Questa guida introduttiva presuppone una comprensione di base dei concetti relativi a Kubernetes. Per altre informazioni, vedere Concetti di base relativi a Kubernetes per il servizio Azure Kubernetes.

Nota

Il pool di nodi Linux di Azure è ora generalmente disponibile. Per informazioni sui vantaggi e sui passaggi di distribuzione, vedere Introduzione all'host contenitore Linux di Azure per il servizio Azure Kubernetes.

Creare un cluster del servizio Azure Kubernetes

  1. Accedere al portale di Azure.

  2. Nella home page del portale di Azure selezionare Crea una risorsa.

  3. Nella sezione Categorie selezionare Contenitori>servizio Azure Kubernetes.

  4. Nella scheda Informazioni di base configurare le opzioni seguenti:

    • In Dettagli progetto:
      • Selezionare una sottoscrizione di Azure.
      • Creare un Gruppo di risorse di Azure, ad esempio myResourceGroup. Sebbene sia possibile selezionare un gruppo di risorse esistente, a scopo di test o valutazione, è consigliabile creare un gruppo di risorse per ospitare temporaneamente queste risorse ed evitare di influire sui carichi di lavoro di produzione o sviluppo.
    • In dettagli cluster:
      • Impostare la configurazione del set di impostazioni del cluster su sviluppo/test. Per altre informazioni sulle configurazioni predefinite, vedere Set di impostazioni di configurazione del cluster nel portale di Azure.

        Nota

        È possibile modificare la configurazione predefinita durante la creazione del cluster selezionando Confronta set di impostazioni e scegliendo un'opzione diversa. Screenshot delle opzioni predefinite Crea cluster del servizio Azure Kubernetes - Portale.

      • Immettere un nome cluster Kubernetes, ad esempio myAKSCluster.

      • Selezionare un'area per il cluster del servizio Azure Kubernetes.

      • Impostare l'impostazione zone di disponibilità su Nessuna.

      • Impostare il piano tariffario del servizio Azure Kubernetes su Gratuito.

      • Lasciare selezionato il valore predefinito per la versione di Kubernetes.

      • Lasciare l'impostazione Aggiornamento automatico impostato sul valore consigliato, Abilitato con patch.

      • Lasciare l'impostazione autenticazione e autorizzazione impostata su account locali con il controllo degli accessi in base al ruolo di Kubernetes.

        Screenshot che mostra come configurare un cluster del servizio Azure Kubernetes in portale di Azure.

  5. Selezionare Avanti. Nella scheda pool di nodi aggiungere un nuovo pool di nodi:

    • Selezionare Aggiungi pool di nodi.

    • Immettere un nome pool di nodi, ad esempio nplinux.

    • Per Modalità, selezionare Utente.

    • Per SKU del sistema operativo, selezionare Ubuntu Linux.

    • Impostare l'impostazione zone di disponibilità su Nessuna.

    • Lasciare deselezionata la casella di controllo Abilita istanze spot di Azure.

    • Per Dimensioni nodo, selezionare Scegliere una dimensione. Nella pagina Selezionare una dimensione macchina virtuale, selezionare D2s_v3 e quindi scegliere il pulsante Seleziona.

    • Lasciare l'impostazione del metodo Scale impostata su Scalabilità automatica.

    • Lasciare i campi Numero minimo di nodi e Numero massimo di nodi impostati sulle impostazioni predefinite.

      Screenshot che mostra come creare un pool di nodi che esegue Ubuntu Linux.

  6. Lasciare tutte le impostazioni nelle altre schede impostate sulle impostazioni predefinite, ad eccezione delle impostazioni nella scheda Monitoraggio . Per impostazione predefinita, Monitoraggio di Azure include informazioni dettagliate sui contenitori, il servizio gestito di Monitoraggio di Azure per Prometheus e Grafana gestito di Azure. È possibile risparmiare sui costi disabilitandoli.

  7. Selezionare Rivedi e crea per eseguire la convalida nella configurazione del cluster. Al termine della convalida, selezionare Crea per creare il cluster del servizio Azure Kubernetes.

Per creare il cluster del servizio Azure Kubernetes sono necessari alcuni minuti. Al termine della distribuzione, passare alla risorsa in uno dei due modi seguenti:

  • Selezionare Vai alla risorsa
  • Passare al gruppo di risorse del cluster del servizio Azure Kubernetes e selezionare la risorsa del servizio Azure Kubernetes. In questo esempio, si cerca myResourceGroup e si seleziona la risorsa myAKSCluster.

Stabilire la connessione al cluster

Per gestire un cluster Kubernetes, usare il client da riga di comando kubernetes kubectl. kubectl è già installato se si usa Azure Cloud Shell. Se non si ha familiarità con Cloud Shell, vedere Panoramica di Azure Cloud Shell.

Se si usa Cloud Shell, aprirlo con il pulsante >_ nella parte superiore del portale di Azure. Se si usa PowerShell in locale, connettersi ad Azure tramite il comando Connect-AzAccount. Se si usa l'interfaccia della riga di comando di Azure in locale, connettersi ad Azure tramite il comando az login.

  1. 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 myResourceGroup --name myAKSCluster
    
  2. Verificare la connessione al cluster usando kubectl get per restituire un elenco dei nodi del cluster.

    kubectl get nodes
    

    L'esempio di output seguente mostra il nodo singolo creato nei passaggi precedenti. Assicurarsi che lo stato del nodo sia Pronto.

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-31718369-0   Ready    agent   6m44s   v1.15.10
    

Distribuire l'applicazione

Per distribuire l'applicazione, usare un file manifesto per creare tutti gli oggetti necessari per eseguire l'applicazione di Archiviazione del servizio Azure Kubernetes. Un file manifesto Kubernetes definisce lo stato desiderato di un cluster, ad esempio le immagini del contenitore da eseguire. Il manifesto include le distribuzioni e i servizi Kubernetes seguenti:

Screenshot dell'architettura di esempio di Azure Store.

  • Front-store: applicazione Web per i clienti per visualizzare i prodotti ed effettuare ordini.
  • Servizio prodotto: mostra le informazioni sul prodotto.
  • Servizio ordini: effettua ordini.
  • Rabbit MQ: coda di messaggi per una coda di ordini.

Nota

Non è consigliabile eseguire contenitori con stato, ad esempio Rabbit MQ, senza l'archiviazione persistente per la produzione. Questi vengono usati qui per semplicità, ma è consigliabile usare servizi gestiti, ad esempio Azure CosmosDB o il bus di servizio di Azure.

  1. In Cloud Shell aprire un editor e creare un file denominato aks-store-quickstart.yaml.

  2. Incollare il manifesto seguente nell'editor:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env:
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    Per una suddivisione dei file manifesto YAML, vedere Distribuzioni e manifesti YAML.

    Se si crea e si salva il file YAML in locale, è possibile caricare il file manifesto nella directory predefinita in CloudShell selezionando il pulsante Carica/Scarica file e selezionando il file dal file system locale.

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

    kubectl apply -f aks-store-quickstart.yaml
    

    L'output di esempio seguente mostra le distribuzioni e i servizi:

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-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.

  1. Controllare lo stato dei pod distribuiti usando il comando kubectl get pods. Fare in modo che tutti i pod siano Running prima di procedere.

    kubectl get pods
    
  2. Verificare la presenza di un indirizzo IP pubblico per l'applicazione front-store. Monitorare lo stato usando il comando kubectl get service con l'argomento --watch.

    kubectl get service store-front --watch
    

    L'output EXTERNAL-IP per il servizio store-front inizialmente viene visualizzato come in sospeso:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    

    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:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  3. Aprire un Web browser all'indirizzo IP esterno del servizio per visualizzare l'app di Azure Store in azione.

    Screenshot dell'applicazione di esempio dello Store del servizio Azure Kubernetes.

Eliminare il cluster

Se non si prevede di eseguire l'esercitazione servizio Azure Kubernetes, pulire le risorse non necessarie per evitare addebiti di Azure.

  1. Nel portale di Azure passare al gruppo di risorse del cluster del servizio Azure Kubernetes.

  2. Selezionare Elimina gruppo di risorse.

  3. Immettere il nome del gruppo di risorse da eliminare e quindi selezionare Elimina>Elimina.

    Nota

    Il cluster del servizio Azure Kubernetes è stato creato con un'identità gestita assegnata dal sistema. Questa identità viene gestita dalla piattaforma e non richiede la rimozione.

Passaggi successivi

In questo avvio rapido è stato distribuito un cluster Kubernetes ed è stata quindi distribuita una semplice applicazione multi-contenitore. Questa applicazione di esempio è solo a scopo dimostrativo e non rappresenta tutte le procedure consigliate per le applicazioni Kubernetes. Per indicazioni sulla creazione di soluzioni complete con il servizio Azure Kubernetes per la produzione, vedere Linee guida per la soluzione del servizio Azure Kubernetes.

Per altre informazioni sul servizio Azure Kubernetes e l'analisi del codice completo per un esempio di distribuzione, passare all'esercitazione sul cluster Kubernetes.