Dela via


Konfigurera NGINX-ingresskontrollant för att stödja privat DNS-zon i Azure med tillägg för programroutning

Den här artikeln visar hur du konfigurerar en NGINX-ingresskontrollant så att den fungerar med en intern Azure-lastbalanserare och konfigurerar en privat Azure DNS-zon för att aktivera DNS-matchning för de privata slutpunkterna för att lösa specifika domäner.

Innan du börjar

Ansluta till ditt AKS-kluster

Om du vill ansluta till Kubernetes-klustret från den lokala datorn använder kubectldu kubernetes-kommandoradsklienten. Du kan installera den lokalt med kommandot az aks install-cli . Om du använder Azure Cloud Shell är kubectl redan installerat.

I följande exempel konfigureras anslutning till klustret med namnet myAKSCluster i myResourceGroup med hjälp av az aks get-credentials kommandot .

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

Skapa ett virtuellt nätverk

Om du vill publicera en privat DNS-zon till ditt virtuella nätverk måste du ange en lista över virtuella nätverk som kan matcha poster i zonen. Dessa kallas virtuella nätverkslänkar.

I följande exempel skapas ett virtuellt nätverk med namnet myAzureVNet i resursgruppen myResourceGroup och ett undernät med namnet mySubnet som ska skapas i det virtuella nätverket med ett specifikt adressprefix.

az network vnet create \
  --name myAzureVNet \
  --resource-group myResourceGroup \
  --location eastus \
  --address-prefix 10.2.0.0/16 \
  --subnet-name mysubnet \
  --subnet-prefixes 10.2.0.0/24

Skapa en privat DNS-zon i Azure

Kommentar

Du kan konfigurera tillägget för programroutning för att automatiskt skapa poster i en eller flera globala Och privata DNS-zoner i Azure för värdar som definierats för inkommande resurser. Alla globala Azure DNS-zoner och alla privata Azure DNS-zoner måste finnas i samma resursgrupp.

Du skapar en DNS-zon med kommandot az network private-dns zone create och anger namnet på zonen och resursgruppen som du vill skapa den i. I följande exempel skapas en DNS-zon med namnet private.contoso.com i resursgruppen myResourceGroup .

az network private-dns zone create --resource-group myResourceGoup --name private.contoso.com

Du skapar en virtuell nätverkslänk till DNS-zonen som skapades tidigare med kommandot az network private-dns link vnet create . I följande exempel skapas en länk med namnet myDNSLink till zonen private.contoso.com för det virtuella nätverket myAzureVNet. Inkludera parametern --registration-enabled för att ange att länken inte är registreringsaktiverad.

az network private-dns link vnet create --resource-group myResourceGroup \
  --name myDNSLink \
  --zone-name private.contoso.com \
  --virtual-network myAzureVNet \
  --registration-enabled false

Funktionen för automatisk registrering i den privata zonen Azure DNS hanterar DNS-poster för virtuella datorer som distribueras i ett virtuellt nätverk. När du länkar ett virtuellt nätverk med en privat DNS-zon med den här inställningen aktiverad skapas en DNS-post för varje virtuell Azure-dator för aks-noden som distribueras i det virtuella nätverket.

Koppla en privat DNS-zon i Azure till tillägget för programroutning

Kommentar

Kommandot az aks approuting zone add använder behörigheterna för användaren som kör kommandot för att skapa rolltilldelningen i Azure DNS-zonen . Rollen Privat DNS-zondeltagare är en inbyggd roll för att hantera privata DNS-resurser och tilldelas tilläggets hanterade identitet. Mer information om AKS-hanterade identiteter finns i Sammanfattning av hanterade identiteter.

  1. Hämta resurs-ID:t för DNS-zonen med kommandot az network dns zone show och ange utdata till en variabel med namnet ZONEID. I följande exempel frågar zonen private.contoso.com i resursgruppen myResourceGroup.

    ZONEID=$(az network private-dns zone show --resource-group myResourceGroup --name private.contoso.com --query "id" --output tsv)
    
  2. Uppdatera tillägget för att aktivera integrering med Azure DNS med hjälp av az aks approuting zone kommandot . Du kan skicka en kommaavgränsad lista över RESURS-ID:t för DNS-zonen. I följande exempel uppdateras AKS-klustret myAKSCluster i resursgruppen myResourceGroup.

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${ZONEID} --attach-zones
    

Skapa en NGINX-ingresskontrollant med en privat IP-adress och en intern lastbalanserare

Tillägget för programroutning använder en anpassad Kubernetes-resursdefinition (CRD) som anropas NginxIngressController för att konfigurera NGINX-ingresskontrollanter. Du kan skapa fler ingresskontrollanter eller ändra en befintlig konfiguration.

NginxIngressController CRD har ett loadBalancerAnnotations fält som styr beteendet för NGINX-ingresskontrollantens tjänst genom att ange anteckningar för lastbalanserare.

Utför följande steg för att skapa en NGINX-ingresskontrollant med en intern Azure Load Balancer med en privat IP-adress.

  1. Kopiera följande YAML-manifest till en ny fil med namnet nginx-internal-controller.yaml och spara filen på den lokala datorn.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. Skapa NGINX-ingresskontrollantresurserna kubectl apply med kommandot .

    kubectl apply -f nginx-internal-controller.yaml
    

    Följande exempelutdata visar den skapade resursen:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. Kontrollera att ingresskontrollanten har skapats

    Du kan kontrollera statusen för NGINX-ingresskontrollanten kubectl get nginxingresscontroller med hjälp av kommandot .

    kubectl get nginxingresscontroller
    

    Följande exempelutdata visar den skapade resursen. Det kan ta några minuter innan kontrollanten är tillgänglig:

    NAME             INGRESSCLASS                         CONTROLLERNAMEPREFIX   AVAILABLE
    default          webapprouting.kubernetes.azure.com   nginx                  True
    nginx-internal   nginx-internal                       nginx-internal         True
    

Distribuera ett program

Tillägget för programroutning använder anteckningar på Kubernetes-ingressobjekt för att skapa lämpliga resurser.

  1. Skapa ett programnamnområde med namnet hello-web-app-routing för att köra exempelpoddar med kommandot kubectl create namespace .

    kubectl create namespace hello-web-app-routing
    
  2. Skapa distributionen genom att kopiera följande YAML-manifest till en ny fil med namnet deployment.yaml och spara filen på den lokala datorn.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld  
      namespace: hello-web-app-routing
    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)"
    
  3. Skapa tjänsten genom att kopiera följande YAML-manifest till en ny fil med namnet service.yaml och spara filen på den lokala datorn.

    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld
    
  4. Skapa klusterresurserna kubectl apply med kommandot .

    kubectl apply -f deployment.yaml -n hello-web-app-routing
    

    Följande exempelutdata visar den skapade resursen:

    deployment.apps/aks-helloworld created created
    
    kubectl apply -f service.yaml -n hello-web-app-routing
    

    Följande exempelutdata visar den skapade resursen:

    service/aks-helloworld created created
    

Skapa den ingressresurs som använder ett värdnamn i den privata DNS-zonen i Azure och en privat IP-adress

  1. Kopiera följande YAML-manifest till en ny fil med namnet ingress.yaml och spara filen på den lokala datorn.

    Uppdatera <Hostname> med namnet på dns-värden, till exempel helloworld.private.contoso.com. Kontrollera att nginx-internal du anger för ingressClassName.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: nginx-internal
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. Skapa klusterresurserna kubectl apply med kommandot .

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    Följande exempelutdata visar den skapade resursen:

    ingress.networking.k8s.io/aks-helloworld created
    

Kontrollera att den hanterade ingressen har skapats

Du kan kontrollera att den hanterade ingressen har skapats med hjälp av kubectl get ingress kommandot .

kubectl get ingress -n hello-web-app-routing

Följande exempelutdata visar den skapade hanterade ingressen:

NAME             CLASS            HOSTS                            ADDRESS      PORTS   AGE
aks-helloworld   nginx-internal   helloworld.private.contoso.com   10.224.0.7   80      98s

Kontrollera att den privata DNS-zonen i Azure har uppdaterats

Om några minuter kör du kommandot az network private-dns record-set a list för att visa A-posterna för din privata DNS-zon i Azure. Ange namnet på resursgruppen och namnet på DNS-zonen. I det här exemplet är resursgruppen myResourceGroup och DNS-zonen private.contoso.com.

az network private-dns record-set a list --resource-group myResourceGroup --zone-name private.contoso.com

Följande exempelutdata visar den skapade posten:

[
  {
    "aRecords": [
      {
        "ipv4Address": "10.224.0.7"
      }
    ],
    "etag": "188f0ce5-90e3-49e6-a479-9e4053f21965",
    "fqdn": "helloworld.private.contoso.com.",
    "id": "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/foo/providers/Microsoft.Network/privateDnsZones/private.contoso.com/A/helloworld",
    "isAutoRegistered": false,
    "name": "helloworld",
    "resourceGroup": "foo",
    "ttl": 300,
    "type": "Microsoft.Network/privateDnsZones/A"
  }
]

Nästa steg

Annan konfigurationsinformation som rör SSL-kryptering med annan avancerad NGINX-ingresskontrollant och ingressresurskonfiguration finns i KONFIGURATION av DNS- och SSL-konfiguration och tilläggskonfiguration för programroutning.