Componente aggiuntivo Instradamento dell’applicazione HTTP per il servizio Azure Kubernetes (ritirato)

Attenzione

Il componente aggiuntivo Instradamento dell’applicazione HTTP (anteprima) per il servizio Azure Kubernetes verrà ritirato il 3 marzo 2025. È consigliabile eseguire la migrazione al componente aggiuntivo Instradamento dell'applicazione entro tale data.

La soluzione Instradamento dell’applicazione HTTP semplifica l'accesso alle applicazioni distribuite nel cluster del servizio Azure Kubernetes nei seguenti modi:

  • Configurando un controller in ingresso nel cluster del servizio Azure Kubernetes
  • Creando nomi DNS accessibili pubblicamente per gli endpoint applicazione
  • Creando una zona DNS nella sottoscrizione Per altre informazioni sul costo del DNS, vedere la pagina relativa ai prezzi del DNS.

Operazioni preliminari

  • Il componente aggiuntivo Instradamento dell’applicazione HTTP non funziona con le versioni del servizio Azure Kubernetes successive alla 1.22.6.
  • Se si eseguono comandi in locale, installare kubectl usando il comando az aks install-cli.

Panoramica del componente aggiuntivo Instradamento dell’applicazione HTTP

Il componente aggiuntivo distribuisce due componenti: un controller in ingresso Kubernetes e un controllerExternal-DNS.

  • Controller in ingresso: il controller in ingresso è esposto a Internet mediante un servizio LoadBalancer Kubernetes. Controlla e implementa le risorse in ingresso Kubernetes, creando route agli endpoint applicazione.
  • Controller External-DNS: questo controller controlla le risorse in ingresso Kubernetes e crea record A DNS nella zona DNS specifica del cluster.

Abilitare Instradamento dell’applicazione HTTP

  1. Creare un nuovo cluster del servizio Azure Kubernetes e abilitare il componente aggiuntivo Instradamento dell’applicazione HTTP usando il comando az aks create con il parametro --enable-addons.

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --enable-addons http_application_routing \
        --generate-ssh-keys
    

    È anche possibile abilitare l’instradamento HTTP in un cluster del servizio Azure Kubernetes esistente usando il comando az aks enable-addons con il parametro --addons.

    az aks enable-addons --resource-group myResourceGroup --name myAKSCluster --addons http_application_routing
    
  2. Ottenere il nome della zona DNS usando il comando az aks show. Il nome della zona DNS è necessario per distribuire le applicazioni nel cluster.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName -o table
    

    L'output deve essere simile a quello riportato nell'esempio seguente:

    9f9c1fe7-21a1-416d-99cd-3543bb92e4c3.eastus.aksapp.io
    

Connettersi al cluster del servizio Azure Kubernetes

  • Configurare kubectl per connettersi al cluster Kubernetes usando il comando az aks get-credentials. L'esempio seguente ottiene le credenziali per il cluster AKS denominato myAKSCluster in myResourceGroup:

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Usare il routing di applicazioni HTTP

Importante

Il componente aggiuntivo Instradamento dell'applicazione HTTP può essere attivato solo per le risorse in ingresso con l'annotazione seguente:

annotations:
 kubernetes.io/ingress.class: addon-http-application-routing
  1. Creare un file denominato samples-http-application-routing.yaml e copiarlo nel codice YAML seguente. Alla riga 43 aggiornare <CLUSTER_SPECIFIC_DNS_ZONE> con il nome della zona DNS ottenuto nel passaggio precedente.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld
      template:
        metadata:
          labels:
            app: aks-helloworld
        spec:
          containers:
          - name: aks-helloworld
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld
    spec:
      type: ClusterIP
      ports:
     - port: 80
      selector:
        app: aks-helloworld
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      annotations:
        kubernetes.io/ingress.class: addon-http-application-routing
    spec:
      rules:
     - host: aks-helloworld.<CLUSTER_SPECIFIC_DNS_ZONE>
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
    
  2. Creare le risorse usando il comando kubectl apply.

    kubectl apply -f samples-http-application-routing.yaml
    

    L'output di esempio seguente mostra le risorse create:

    deployment.apps/aks-helloworld created
    service/aks-helloworld created
    ingress.networking.k8s.io/aks-helloworld created
    
  3. Aprire aks-helloworld.<CLUSTER_SPECIFIC_DNS_ZONE> in un Web browser, ad esempio aks-helloworld.9f9c1fe7-21a1-416d-99cd-3543bb92e4c3.eastus.aksapp.io e verificare che venga visualizzata l’applicazione demo. La visualizzazione dell'applicazione potrebbe richiedere alcuni minuti.

Usare Instradamento dell’applicazione HTTP

  1. Rimuovere il componente aggiuntivo Instradamento dell'applicazione HTTP usando il parametro [az aks disable-addons][az-aks-disable-addons] command with the addons'.

    az aks disable-addons --addons http_application_routing --name myAKSCluster --resource-group myResourceGroup --no-wait
    
  2. Quando il componente aggiuntivo di routing dell'applicazione HTTP è disabilitato, alcune risorse Kubernetes possono rimanere nel cluster. Queste risorse includono configmaps e secrets e vengono create nello spazio dei nomi kube-system. Per mantenere un cluster pulito, è possibile rimuovere queste risorse. Cercare le risorse addon-http-application-routing con i comandi kubectl get seguenti:

    kubectl get deployments --namespace kube-system
    kubectl get services --namespace kube-system
    kubectl get configmaps --namespace kube-system
    kubectl get secrets --namespace kube-system
    

    L'output di esempio seguente mostra le risorse configmaps che devono essere eliminate:

    NAMESPACE     NAME                                                       DATA   AGE
    kube-system   addon-http-application-routing-nginx-configuration         0      9m7s
    kube-system   addon-http-application-routing-tcp-services                0      9m7s
    kube-system   addon-http-application-routing-udp-services                0      9m7s
    
  3. Eliminare le risorse rimanenti usando il comando kubectl delete. Assicurarsi di specificare il tipo di risorsa, il nome della risorsa e lo spazio dei nomi. Nell'esempio seguente viene eliminata una delle risorse configmaps precedente:

    kubectl delete configmaps addon-http-application-routing-nginx-configuration --namespace kube-system
    
  4. Ripetere il passaggio kubectl delete precedente per tutte le risorse addon-http-application-routing rimanenti nel cluster.

Risoluzione dei problemi

  1. Visualizzare i registri applicazioni per l'applicazione External-DNS usando il comando kubectl logs.

    kubectl logs -f deploy/addon-http-application-routing-external-dns -n kube-system
    

    I registri devono confermare che sono stati creati correttamente un record DNS A e TXT, come illustrato nell'output di esempio seguente:

    time="2018-04-26T20:36:19Z" level=info msg="Updating A record named 'aks-helloworld' to '52.242.28.189' for Azure DNS zone '471756a6-e744-4aa0-aa01-89c4d162a7a7.canadaeast.aksapp.io'."
    time="2018-04-26T20:36:21Z" level=info msg="Updating TXT record named 'aks-helloworld' to '"heritage=external-dns,external-dns/owner=default"' for Azure DNS zone '471756a6-e744-4aa0-aa01-89c4d162a7a7.canadaeast.aksapp.io'."
    
  2. Visualizzare i registri applicazioni per il controller in ingresso NGINX usando il comando kubectl logs.

    kubectl logs -f deploy/addon-http-application-routing-nginx-ingress-controller -n kube-system
    

    I registri devono confermare l'operazione CREATE per una risorsa in ingresso e il ricaricamento del controller, come illustrato nell'output di esempio seguente:

    -------------------------------------------------------------------------------
    NGINX Ingress controller
      Release:    0.13.0
      Build:      git-4bc943a
      Repository: https://github.com/kubernetes/ingress-nginx
    -------------------------------------------------------------------------------
    
    I0426 20:30:12.212936       9 flags.go:162] Watching for ingress class: addon-http-application-routing
    W0426 20:30:12.213041       9 flags.go:165] only Ingress with class "addon-http-application-routing" will be processed by this ingress controller
    W0426 20:30:12.213505       9 client_config.go:533] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
    I0426 20:30:12.213752       9 main.go:181] Creating API client for https://10.0.0.1:443
    I0426 20:30:12.287928       9 main.go:225] Running in Kubernetes Cluster version v1.8 (v1.8.11) - git (clean) commit 1df6a8381669a6c753f79cb31ca2e3d57ee7c8a3 - platform linux/amd64
    I0426 20:30:12.290988       9 main.go:84] validated kube-system/addon-http-application-routing-default-http-backend as the default backend
    I0426 20:30:12.294314       9 main.go:105] service kube-system/addon-http-application-routing-nginx-ingress validated as source of Ingress status
    I0426 20:30:12.426443       9 stat_collector.go:77] starting new nginx stats collector for Ingress controller running in namespace  (class addon-http-application-routing)
    I0426 20:30:12.426509       9 stat_collector.go:78] collector extracting information from port 18080
    I0426 20:30:12.448779       9 nginx.go:281] starting Ingress controller
    I0426 20:30:12.463585       9 event.go:218] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"kube-system", Name:"addon-http-application-routing-nginx-configuration", UID:"2588536c-4990-11e8-a5e1-0a58ac1f0ef2", APIVersion:"v1", ResourceVersion:"559", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap kube-system/addon-http-application-routing-nginx-configuration
    I0426 20:30:12.466945       9 event.go:218] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"kube-system", Name:"addon-http-application-routing-tcp-services", UID:"258ca065-4990-11e8-a5e1-0a58ac1f0ef2", APIVersion:"v1", ResourceVersion:"561", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap kube-system/addon-http-application-routing-tcp-services
    I0426 20:30:12.467053       9 event.go:218] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"kube-system", Name:"addon-http-application-routing-udp-services", UID:"259023bc-4990-11e8-a5e1-0a58ac1f0ef2", APIVersion:"v1", ResourceVersion:"562", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap kube-system/addon-http-application-routing-udp-services
    I0426 20:30:13.649195       9 nginx.go:302] starting NGINX process...
    I0426 20:30:13.649347       9 leaderelection.go:175] attempting to acquire leader lease  kube-system/ingress-controller-leader-addon-http-application-routing...
    I0426 20:30:13.649776       9 controller.go:170] backend reload required
    I0426 20:30:13.649800       9 stat_collector.go:34] changing prometheus collector from  to default
    I0426 20:30:13.662191       9 leaderelection.go:184] successfully acquired lease kube-system/ingress-controller-leader-addon-http-application-routing
    I0426 20:30:13.662292       9 status.go:196] new leader elected: addon-http-application-routing-nginx-ingress-controller-5cxntd6
    I0426 20:30:13.763362       9 controller.go:179] ingress backend successfully reloaded...
    I0426 21:51:55.249327       9 event.go:218] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"aks-helloworld", UID:"092c9599-499c-11e8-a5e1-0a58ac1f0ef2", APIVersion:"extensions", ResourceVersion:"7346", FieldPath:""}): type: 'Normal' reason: 'CREATE' Ingress default/aks-helloworld
    W0426 21:51:57.908771       9 controller.go:775] service default/aks-helloworld does not have any active endpoints
    I0426 21:51:57.908951       9 controller.go:170] backend reload required
    I0426 21:51:58.042932       9 controller.go:179] ingress backend successfully reloaded...
    167.220.24.46 - [167.220.24.46] - - [26/Apr/2018:21:53:20 +0000] "GET / HTTP/1.1" 200 234 "" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" 197 0.001 [default-aks-helloworld-80] 10.244.0.13:8080 234 0.004 200
    

Pulire le risorse

  • Rimuovere gli oggetti Kubernetes associati, creati in questo articolo usando il comando kubectl delete.

    kubectl delete -f samples-http-application-routing.yaml
    

    L'output di esempio seguente mostra che gli oggetti Kubernetes sono stati rimossi:

    deployment "aks-helloworld" deleted
    service "aks-helloworld" deleted
    ingress "aks-helloworld" deleted
    

Passaggi successivi

Per informazioni su come installare un controller in ingresso protetto con HTTPS nel servizio Azure Kubernetes, vedere Ingresso HTTPS nel servizio Azure Kubernetes.