Sdílet prostřednictvím


Pokročilé konfigurace kontroleru příchozího přenosu dat NGINX a příchozího přenosu dat pomocí doplňku směrování aplikací pro službu Azure Kubernetes Service (AKS)

Tento článek vás provede dvěma způsoby konfigurace kontrolerů příchozího přenosu dat a objektů příchozího přenosu dat pomocí doplňku směrování aplikací pro službu Azure Kubernetes Service (AKS):

Požadavky

Připojení ke clusteru AKS

Pokud se chcete připojit ke clusteru Kubernetes z místního počítače, použijte kubectlklienta příkazového řádku Kubernetes. Můžete jej lokálně nainstalovat pomocí příkazu az aks install-cli. Pokud používáte Azure Cloud Shell, kubectl je už nainstalovaný.

  • Nakonfigurujte kubectl pro připojení ke clusteru Kubernetes pomocí příkazu az aks get-credentials.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

Vlastnosti konfigurace pro kontrolery příchozího přenosu dat NGINX

Doplněk směrování aplikace je používán pro konfiguraci ingresních kontrolerů NGINX prostřednictvím definice vlastního prostředku Kubernetes (CRD).NginxIngressController Můžete vytvořit další kontrolery příchozího přenosu dat nebo upravit existující konfigurace.

Následující tabulka uvádí vlastnosti, které můžete nastavit pro konfiguraci NginxIngressController:

Pole Typ Popis Povinné Výchozí
controllerNamePrefix řetězec Název spravovaných prostředků NGINX Ingress Controlleru. Ano nginx
customHTTPErrors pole Pole kódů chyb, které se mají odeslat do výchozího back-endu, pokud dojde k chybě. Ne
defaultBackendService objekt Služba pro směrování nesrovnaného provozu HTTP Obsahuje vnořené vlastnosti: Ne
name řetězec Název služby. Ano
namespace řetězec Prostor názvů služby Ano
defaultSSLCertificate objekt Obsahuje výchozí certifikát pro přístup k výchozí back-endové službě. Obsahuje vnořené vlastnosti: Ne
forceSSLRedirect Boolean Vynutí přesměrování HTTPS, pokud je nastaven certifikát. Ne false
keyVaultURI řetězec Identifikátor URI tajného klíče služby Key Vault, který certifikát ukládá. Ne
secret objekt Obsahuje tajné informace pro výchozí certifikát SSL. Obsahuje vnořené vlastnosti: Ne
  name řetězec Název tajného kódu. Ano
  namespace řetězec Tajný jmenný prostor. Ano
httpDisabled Boolean Příznak pro zakázání HTTP provozu ke kontroleru. Ne
ingressClassName řetězec IngressClass název používaný kontrolerem. Ano nginx.approuting.kubernetes.azure.com
loadBalancerAnnotations objekt Mapa anotací pro řízení chování služby NGINX ingress controlleru nastavením anotací vyrovnávače zatížení Ne
scaling objekt Konfigurace pro škálování kontroleru Obsahuje vnořené vlastnosti: Ne
maxReplicas integer Horní limit pro repliky. Ne 100
minReplicas integer Nižší limit pro repliky. Ne 2
threshold řetězec Prahová hodnota škálování definující, jak agresivně se má škálovat. rapid se rychle škáluje pro náhlé špičky, steady upřednostňuje nákladovou efektivitu a balanced je kombinací. Ne balanced

Řízení výchozí konfigurace kontroleru příchozího přenosu dat NGINX

Když povolíte doplněk směrování aplikace pomocí NGINX, vytvoří ingresní kontroler nazvaný default v app-routing-namespace, který je nakonfigurován s veřejně přístupným vyrovnávačem zatížení Azure. Tento ingress kontroler používá název ingress třídy webapprouting.kubernetes.azure.com.

Můžete také určit, jestli výchozí hodnota získá veřejnou nebo interní IP adresu nebo jestli se vůbec vytvoří při povolování doplňku.

Mezi možné možnosti konfigurace patří:

  • None: Výchozí kontroler příchozího přenosu dat NGINX se nevytvořil a pokud už existuje, neodstraní se. Pokud chcete, můžete ručně odstranit výchozí upravený zdroj NginxIngressController.
  • Internal: Výchozí NGINX ingressový kontroler je vytvořen s interním vyrovnávačem zatížení. Všechny změny anotací ve NginxIngressController vlastním prostředku při změně na externí se přepíšou.
  • External: Výchozí kontroler příchozího přenosu dat NGINX vytvořený s externím nástrojem pro vyrovnávání zatížení. Veškeré změny v poznámkách u NginxIngressController vlastního prostředku, které jej činí interním, se přepíšou.
  • AnnotationControlled (výchozí): Výchozí ingresní kontroler NGINX je vytvořen s externím vyrovnávačem zatížení. Můžete upravit výchozí NginxIngressController vlastní prostředek a nakonfigurovat poznámky k vyrovnávání zatížení.

Řízení výchozí konfigurace kontroleru příchozího přenosu dat v novém clusteru

  • Povolte směrování aplikací v novém clusteru pomocí příkazu az aks create s příznaky --enable-app-routing a --app-routing-default-nginx-controller. Musíte nastavit <DefaultIngressControllerType> na jednu z možností konfigurace popsaných v Řízení výchozí konfigurace NGINX ingress kontroleru.

    az aks create \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --location $LOCATION \
      --enable-app-routing \
      --app-routing-default-nginx-controller <DefaultIngressControllerType>
    

Aktualizace výchozí konfigurace kontroleru příchozího přenosu dat v existujícím clusteru

  • Pomocí příkazu az aks approuting update s příznakem --nginx aktualizujte výchozí konfiguraci kontroleru příchozího provozu aplikace v existujícím clusteru. Musíte nastavit <DefaultIngressControllerType> na jednu z možností konfigurace popsaných v Řízení výchozí konfigurace NGINX ingress kontroleru.

    az aks approuting update \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --nginx <DefaultIngressControllerType>
    

Vytvoření dalšího veřejně přístupného kontroleru příchozího přenosu dat NGINX

  1. Zkopírujte následující manifest YAML do nového souboru s názvem nginx-public-controller.yaml a uložte ho do místního počítače.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-public
    spec:
      ingressClassName: nginx-public
      controllerNamePrefix: nginx-public
    
  2. Pomocí příkazu vytvořte prostředky kontroleru příchozího přenosu dat kubectl apply NGINX.

    kubectl apply -f nginx-public-controller.yaml
    

    Následující příklad výstupu ukazuje vytvořený prostředek:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-public created
    

Vytvoření interního kontroleru příchozího přenosu dat NGINX s privátní IP adresou

  1. Zkopírujte následující manifest YAML do nového souboru s názvem nginx-internal-controller.yaml a uložte ho do místního počítače.

    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. Pomocí příkazu vytvořte prostředky kontroleru příchozího přenosu dat kubectl apply NGINX.

    kubectl apply -f nginx-internal-controller.yaml
    

    Následující příklad výstupu ukazuje vytvořený prostředek:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    

Vytvoření kontroleru příchozího přenosu dat NGINX se statickou IP adresou

  1. Pomocí příkazu vytvořte skupinu az group create prostředků Azure.

    az group create --name $NETWORK_RESOURCE_GROUP --location $LOCATION
    
  2. Pomocí příkazu vytvořte statickou veřejnou IP adresu az network public ip create .

    az network public-ip create \
      --resource-group $NETWORK_RESOURCE_GROUP \
      --name $PUBLIC_IP_NAME \
      --sku Standard \
      --allocation-method static
    

    Poznámka:

    Pokud v clusteru AKS používáte nástroj pro vyrovnávání zatížení skladové položky Basic , použijte Basic pro tento --sku parametr při definování veřejné IP adresy. Jen Basic IP adresy SKU fungují s nástrojem pro vyrovnávání zatížení Basic a pouze Standard IP adresy SKU fungují s nástrojem pro vyrovnávání zatížení Standard.

  3. Pomocí příkazu az role assignment create zajistěte, že identita používaná clusterem AKS má delegovaná oprávnění ke skupině prostředků veřejné IP adresy.

    CLIENT_ID=$(az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query identity.principalId -o tsv)
    RG_SCOPE=$(az group show --name $NETWORK_RESOURCE_GROUP --query id -o tsv)
    az role assignment create \
      --assignee ${CLIENT_ID} \
      --role "Network Contributor" \
      --scope ${RG_SCOPE}
    
  4. Zkopírujte následující manifest YAML do nového souboru s názvem nginx-staticip-controller.yaml a uložte ho do místního počítače.

    Poznámka:

    Můžete použít service.beta.kubernetes.io/azure-pip-name název veřejné IP adresy nebo použít service.beta.kubernetes.io/azure-load-balancer-ipv4 pro IPv4 adresu a service.beta.kubernetes.io/azure-load-balancer-ipv6 adresu IPv6, jak je znázorněno v příkladu YAML. Přidáním poznámky service.beta.kubernetes.io/azure-pip-name zajistíte nejúčinnější vytvoření load balanceru a důrazně se doporučuje, aby se předešlo potenciálnímu omezení.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-static
    spec:
      ingressClassName: nginx-static
      controllerNamePrefix: nginx-static
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-pip-name: "$PUBLIC_IP_NAME"
        service.beta.kubernetes.io/azure-load-balancer-resource-group: "$NETWORK_RESOURCE_GROUP"
    
  5. Pomocí příkazu vytvořte prostředky kontroleru příchozího přenosu dat kubectl apply NGINX.

    kubectl apply -f nginx-staticip-controller.yaml
    

    Následující příklad výstupu ukazuje vytvořený prostředek:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-static created
    

Ověření vytvoření kontroleru příchozího přenosu dat

  • Pomocí příkazu ověřte stav kontroleru kubectl get nginxingresscontroller příchozího přenosu dat NGINX.

    kubectl get nginxingresscontroller --name $INGRESS_CONTROLLER_NAME
    

    Následující příklad výstupu ukazuje vytvořený prostředek. Dostupnost kontroleru může trvat několik minut:

    NAME           INGRESSCLASS   CONTROLLERNAMEPREFIX   AVAILABLE
    nginx-public   nginx-public   nginx                  True
    

Zobrazení podmínek kontroleru příchozího přenosu dat

  • Zobrazte podmínky kontroleru ingress pro diagnostiku jakýchkoli problémů pomocí příkazu kubectl get nginxingresscontroller.

    kubectl get nginxingresscontroller --name $INGRESS_CONTROLLER_NAME -o jsonpath='{range .items[*].status.conditions[*]}{.lastTransitionTime}{"\t"}{.status}{"\t"}{.type}{"\t"}{.message}{"\n"}{end}'
    

    Následující příklad výstupu ukazuje podmínky ingressového kontroleru ve zdravém stavu:

    2023-11-29T19:59:24Z    True    IngressClassReady       Ingress Class is up-to-date
    2023-11-29T19:59:50Z    True    Available               Controller Deployment has minimum availability and IngressClass is up-to-date
    2023-11-29T19:59:50Z    True    ControllerAvailable     Controller Deployment is available
    2023-11-29T19:59:25Z    True    Progressing             Controller Deployment has successfully progressed
    

Použijte kontroler ingressu v ingressu

  1. Zkopírujte následující manifest YAML do nového souboru s názvem ingress.yaml a uložte ho do místního počítače.

    Poznámka:

    Aktualizujte <HostName> s názvem vašeho hostitele DNS. Jedná se o <IngressClassName>, který jste definovali při vytváření NginxIngressController.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: <IngressClassName>
      rules:
      - host: <HostName>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. Vytvořte prostředky clusteru pomocí příkazu kubectl apply.

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

    Následující příklad výstupu ukazuje vytvořený prostředek:

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

Ověřte, že byl vytvořen spravovaný vstup

  • Ověřte, že byl vytvořen spravovaný vstup pomocí příkazu kubectl get ingress.

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

    Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:

    NAME             CLASS                                HOSTS               ADDRESS       PORTS     AGE
    aks-helloworld   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m
    

Odebrání kontrolerů příchozího přenosu dat

Konfigurace pro prostředek příchozího přenosu dat prostřednictvím poznámek

Kontroler příchozího přenosu dat NGINX podporuje přidávání poznámek ke konkrétním objektům příchozího přenosu dat pro přizpůsobení jejich chování.

Objekt příchozího přenosu dat můžete označit přidáním příslušné poznámky do metadata.annotations pole.

Poznámka:

Klíče a hodnoty poznámek můžou být pouze řetězce. Jiné typy, například logické nebo číselné hodnoty, musí být uvedeny v uvozovkách. Například: "true", "false", "100".

Následující části obsahují příklady běžných konfigurací. Úplný seznam najdete v dokumentaci k anotacím vstupního bodu NGINX.

Vlastní maximální velikost těla

V případě serveru NGINX se klientovi vrátí chyba 413, když velikost požadavku překročí maximální povolenou velikost textu požadavku klienta. Pokud chcete přepsat výchozí hodnotu, použijte poznámku:

nginx.ingress.kubernetes.io/proxy-body-size: 4m

Tady je příklad konfigurace vstupu pomocí této anotace:

Poznámka:

Aktualizujte <HostName> s názvem vašeho hostitele DNS. Jedná se o <IngressClassName>, který jste definovali při vytváření NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 4m
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <HostName>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Časový limit vlastního připojení

Můžete změnit časový limit, který NGINX Ingress Controller čeká na ukončení připojení k vaší úloze. Hodnoty všech časových limitů jsou bez jednotek a uváděny v sekundách. Pokud chcete výchozí časový limit přepsat, nastavte platný časový limit 120sekundového čtení proxy serveru pomocí následující poznámky:

nginx.ingress.kubernetes.io/proxy-read-timeout: "120"

Zkontrolujte vlastní časové limity pro další možnosti konfigurace.

Tady je příklad konfigurace vstupu pomocí této anotace:

Poznámka:

Aktualizujte <HostName> s názvem vašeho hostitele DNS. Jedná se o <IngressClassName>, který jste definovali při vytváření NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <HostName>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Protokol zázemí

NGINX ingress controller ve výchozím nastavení používá HTTP pro přístup ke službám. Pokud chcete nakonfigurovat alternativní back-endové protokoly, například HTTPS nebo GRPC, použijte jednu z následujících poznámek:

# HTTPS annotation
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

# GRPC annotation
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"

Zkontrolujte back-endové protokoly a vyhledejte další možnosti konfigurace.

Tady je příklad konfigurace vstupu pomocí této anotace:

Poznámka:

Aktualizujte <HostName> s názvem vašeho hostitele DNS. Jedná se o <IngressClassName>, který jste definovali při vytváření NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <HostName>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Sdílení prostředků mezi různými zdroji (CORS - Cross-Origin Resource Sharing)

Pokud chcete povolit sdílení prostředků mezi zdroji (CORS) v pravidle Ingress, použijte následující anotaci:

nginx.ingress.kubernetes.io/enable-cors: "true"

Zkontrolujte povolení CORS pro další možnosti konfigurace.

Tady je příklad konfigurace vstupu pomocí této anotace:

Poznámka:

Aktualizujte <HostName> s názvem vašeho hostitele DNS. Jedná se o <IngressClassName>, který jste definovali při vytváření NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <HostName>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Zakázání přesměrování SSL

Kontroler přesměruje (308) na HTTPS, pokud je ve výchozím nastavení povolený protokol TLS pro příchozí přenos dat. Pokud chcete tuto funkci zakázat pro konkrétní prostředky příchozího přenosu dat, použijte následující poznámku:

nginx.ingress.kubernetes.io/ssl-redirect: "false"

Zkontrolujte vynucení HTTPS na straně serveru prostřednictvím přesměrování a zkontrolujte další možnosti konfigurace.

Tady je příklad konfigurace vstupu pomocí této anotace:

Poznámka:

Aktualizujte <HostName> s názvem vašeho hostitele DNS. Jedná se o <IngressClassName>, který jste definovali při vytváření NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <HostName>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Přepisování adres URL

V některých scénářích se vystavená adresa URL v back-endové službě liší od zadané cesty v pravidle příchozího přenosu dat. Bez přepsání jakéhokoli požadavku vrátí hodnotu 404. Tato konfigurace je užitečná se směrováním na základě cesty , kde můžete obsluhovat dvě různé webové aplikace ve stejné doméně. Cestu očekávanou službou můžete nastavit pomocí následující poznámky:

nginx.ingress.kubernetes.io/rewrite-target: /$2

Tady je příklad konfigurace vstupu pomocí této anotace:

Poznámka:

Aktualizujte <HostName> s názvem vašeho hostitele DNS. Jedná se o <IngressClassName>, který jste definovali při vytváření NginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <HostName>
    http:
      paths:
      - path: /app-one(/|$)(.*)
        pathType: Prefix 
        backend:
          service:
            name: app-one
            port:
              number: 80
      - path: /app-two(/|$)(.*)
        pathType: Prefix 
        backend:
          service:
            name: app-two
            port:
              number: 80

Aktualizace cesty kontroly stavu NGINX

Výchozí cesta sondy stavu pro Azure Load Balancer přidružený k kontroleru příchozího přenosu dat NGINX musí být nastavená na "/healthz". Chcete-li zajistit správné kontroly stavu, ověřte, že služba kontroleru příchozího přenosu dat má následující poznámku:

metadata:
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path: "/healthz"

Pokud ke správě kontroleru příchozího přenosu dat NGINX používáte Helm, můžete definovat poznámku sondy stavu Azure Load Balanceru v souboru hodnot a použít ji během upgradu:

controller:
  service:
    annotations:
      service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path: "/healthz"

Tato konfigurace pomáhá udržovat dostupnost služeb a vyhnout se neočekávaným přerušení provozu během upgradů.

Další kroky

Přečtěte si o monitorování metrik kontroleru ingress-nginx, které jsou součástí doplňku směrování aplikací pomocí nástroje Prometheus v Grafana jako součást analýzy výkonu a využití vaší aplikace.