Udostępnij przez


Wdrażanie bramek wejściowych dla dodatku siatki usług Istio dla usługi Azure Kubernetes Service

W tym artykule pokazano, jak wdrożyć zewnętrzne lub wewnętrzne wejścia dla dodatku siatki usługi Istio dla klastra usługi Azure Kubernetes Service (AKS).

Uwaga

Po wykonaniu niewielkiej aktualizacji dodatku Istio zostanie utworzone kolejne wdrożenie dla bram zewnętrznych i wewnętrznych w nowej wersji płaszczyzny sterowania.

Wymagania wstępne

W tym przewodniku założono, że wykonano czynności opisane w dokumentacji , aby włączyć dodatek Istio w klastrze usługi AKS, wdrożyć przykładową aplikację i ustawić zmienne środowiskowe.

Włącz zewnętrzną bramę ruchu przychodzącego

Uwaga

Jeśli potrzebujesz bram wejściowych zorganizowanych na określonych węzłach, możesz użyć węzłów systemowych usługi AKS lub etykiety węzła azureservicemesh/istio.replica.preferred. Zasobniki mają powiązania węzłów z preferencją ważoną 100 dla węzłów systemowych usługi AKS (oznaczonych etykietą kubernetes.azure.com/mode: system) oraz z preferencją ważoną 50 dla węzłów oznaczonych etykietą azureservicemesh/istio.replica.preferred: true.

Użyj az aks mesh enable-ingress-gateway, aby włączyć zewnętrznie dostępny ingress Istio w klastrze AKS.

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

Użyj kubectl get svc polecenia , aby sprawdzić usługę zamapowana na bramę ruchu przychodzącego:

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

Zwróć uwagę na dane wyjściowe, że zewnętrzny adres IP usługi jest publicznie dostępny:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-external   LoadBalancer   10.0.10.249   <EXTERNAL_IP>   15021:30705/TCP,80:32444/TCP,443:31728/TCP   4m21s

Aplikacje nie są domyślnie dostępne spoza klastra po włączeniu bramy ruchu przychodzącego. Aby uczynić aplikację dostępną, zamapuj ruch sieciowy przykładowego wdrożenia na bramę wejściową Istio przy użyciu następującego manifestu:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway-external
spec:
  selector:
    istio: aks-istio-ingressgateway-external
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-external
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway-external
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

Uwaga

Selektor używany w obiekcie Gateway wskazuje na element istio: aks-istio-ingressgateway-external, który można znaleźć jako etykietę w usłudze powiązanej z zewnętrznym ruchem przychodzącym, który został wcześniej włączony.

Ustaw zmienne środowiskowe dla zewnętrznego hosta i portów przychodzących:

export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL

Pobierz zewnętrzny adres przykładowej aplikacji:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Przejdź do adresu URL z danych wyjściowych poprzedniego polecenia i upewnij się, że zostanie wyświetlona strona produktu przykładowej aplikacji. Alternatywnie możesz również użyć curl polecenia , aby potwierdzić, że przykładowa aplikacja jest dostępna. Na przykład:

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

Upewnij się, że strona produktu przykładowej aplikacji jest dostępna. Oczekiwane dane wyjściowe to:

<title>Simple Bookstore App</title>

Włącz wewnętrzną bramę ingresu

Użyj az aks mesh enable-ingress-gateway, aby włączyć wewnętrzny punkt wejścia Istio w klastrze AKS.

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

Użyj kubectl get svc polecenia , aby sprawdzić usługę zamapowana na bramę ruchu przychodzącego:

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

Zwróć uwagę na dane wyjściowe, że zewnętrzny adres IP usługi nie jest publicznie dostępny i jest dostępny tylko lokalnie:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-internal   LoadBalancer   10.0.182.240  <IP>      15021:30764/TCP,80:32186/TCP,443:31713/TCP   87s

Po włączeniu bramy ruchu przychodzącego aplikacje muszą być uwidocznione za pośrednictwem bramy, a reguły routingu należy odpowiednio skonfigurować. Użyj następującego manifestu, aby zmapować dostęp dla przykładowego wdrożenia na bramę wejściową Istio.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-internal-gateway
spec:
  selector:
    istio: aks-istio-ingressgateway-internal
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-internal
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-internal-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

Uwaga

Selektor używany w obiekcie Gateway wskazuje na istio: aks-istio-ingressgateway-internal, który można znaleźć jako etykietę w usłudze mapowanej na wewnętrzny ingress, który został włączony wcześniej.

Ustaw zmienne środowiskowe dla wewnętrznego hosta i portów wejściowych.

export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL

Pobierz adres przykładowej aplikacji:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

Przejdź do adresu URL w wyniku poprzedniego polecenia i upewnij się, że strona produktu przykładowej aplikacji nie jest wyświetlana. Alternatywnie możesz również użyć curl aby potwierdzić, że przykładowa aplikacja jest NIE dostępna. Na przykład:

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

Użyj kubectl exec , aby potwierdzić, że aplikacja jest dostępna wewnątrz sieci wirtualnej klastra.

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS  "http://$GATEWAY_URL_INTERNAL/productpage"  | grep -o "<title>.*</title>"

Upewnij się, że strona produktu przykładowej aplikacji jest dostępna. Oczekiwane dane wyjściowe to:

<title>Simple Bookstore App</title>

Dostosowania usługi bramy ruchu przychodzącego

Adnotacje

Następujące adnotacje można dodać do usługi Kubernetes dla zewnętrznych i wewnętrznych bram wejściowych.

  • external-dns.alpha.kubernetes.io/hostname: do określania domeny dla rekordów DNS zasobu. Aby uzyskać więcej informacji, zobacz external-dns.
  • service.beta.kubernetes.io/azure-allowed-ip-ranges: do określania listy dozwolonych zakresów adresów IP rozdzielonych przecinkami.
  • service.beta.kubernetes.io/azure-allowed-service-tags: w celu określenia, z których tagów usługowych brama ingresowa może odbierać żądania.
  • service.beta.kubernetes.io/azure-disable-load-balancer-floating-ip: ustaw na true aby wyłączyć pływający adres IP w regule równoważenia obciążenia.
  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: nazwa podsieci, z która ma być powiązana wewnętrzna brama ruchu przychodzącego. Ta podsieć musi istnieć w tej samej sieci wirtualnej co siatka.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: do konfigurowania statycznego adresu IPv4.
  • service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset: do kontrolowania, czy usługa Azure Load Balancer włącza resetowanie protokołu TCP.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: do określania grupy zasobów publicznego adresu IP w innej grupie zasobów z klastra.
  • service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout: do konfigurowania limitu czasu bezczynności protokołu TCP w minutach dla połączeń za pośrednictwem usługi Azure Load Balancer.
  • service.beta.kubernetes.io/azure-pip-ip-tags: w celu określenia listy elementów IpTag rozdzielonych przecinkami.
  • service.beta.kubernetes.io/azure-pip-name: do określania nazwy publicznego adresu IP.
  • service.beta.kubernetes.io/azure-shared-securityrule: do uwidaczniania bramy ruchu przychodzącego za pomocą rozszerzonej reguły zabezpieczeń.

Dodatek obsługuje adnotacje sondy kondycji dla portów 80 i 443. Dowiedz się więcej o użyciu portów tutaj.

Zasady ruchu zewnętrznego

Dodatek obsługuje dostosowywanie .spec.externalTrafficPolicy w usłudze Kubernetes dla bramy wejściowej. Ustawienie .spec.externalTrafficPolicy na Local zachowuje źródłowy adres IP klienta na bramie wejściowej Istio i unika drugiego przeskoku w ścieżce ruchu do zasobników bramy wejściowej zaplecza.

kubectl patch service aks-istio-ingressgateway-external -n aks-istio-ingress --type merge --patch '{"spec": {"externalTrafficPolicy": "Local"}}'

Uwaga

Modyfikowanie .spec.externalTrafficPolicy na Local wiąże się z ryzykiem potencjalnie niezrównoważonego rozprzestrzeniania się ruchu. Przed zastosowaniem tej zmiany zaleca się przeczytanie dokumentacji platformy Kubernetes w celu zrozumienia kompromisów między różnymi externalTrafficPolicy ustawieniami.

Usuwanie zasobów

Jeśli chcesz wyczyścić zewnętrzne lub wewnętrzne bramy ruchu przychodzącego Istio, ale zostawić siatkę włączoną w klastrze, uruchom następujące polecenie:

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Jeśli chcesz wyczyścić siatkę usług Istio i zasoby Ingress (pozostawiając klaster w nienaruszonym stanie), uruchom następujące polecenie:

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Jeśli chcesz wyczyścić wszystkie zasoby utworzone na podstawie dokumentów z instrukcjami istio, uruchom następujące polecenie:

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

Następne kroki

Uwaga

Jeśli występują problemy z wdrażaniem bramy ruchu przychodzącego Istio lub konfigurowaniem routingu ruchu przychodzącego, zapoznaj się z artykułem dotyczącym rozwiązywania problemów z bramami ruchu przychodzącego dodatku Istio