Zewnętrzne lub wewnętrzne wejścia usługi Azure Kubernetes Service (AKS) dla wdrożenia usługi Istio Service Mesh
W tym artykule przedstawiono sposób wdrażania zewnętrznych lub wewnętrznych dodatków siatki usługi Istio dla klastra usługi Azure Kubernetes Service (AKS).
Uwaga
Podczas wykonywania drobnego uaktualnienia poprawki dodatku Istio zostanie utworzone kolejne wdrożenie dla bram zewnętrznych/wewnętrznych dla nowej poprawki 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łączanie zewnętrznej bramy ruchu przychodzącego
Użyj az aks mesh enable-ingress-gateway
polecenia , aby włączyć zewnętrznie dostępny ruch przychodzący Istio w klastrze usługi 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 udostępnić aplikację, zamapuj ruch przychodzący przykładowego wdrożenia na bramę ruchu przychodzącego Istio przy użyciu następującego manifestu:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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 bramy wskazuje element istio: aks-istio-ingressgateway-external
, który można znaleźć jako etykietę w usłudze zamapowanej na zewnętrzny ruch przychodzący, który został włączony wcześniej.
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łączanie wewnętrznej bramy ruchu przychodzącego
Użyj az aks mesh enable-ingress-gateway
polecenia , aby włączyć wewnętrzny ruch przychodzący istio w klastrze usługi 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
Aplikacje nie są mapowane na bramę ruchu przychodzącego Istio po włączeniu bramy ruchu przychodzącego. Użyj następującego manifestu, aby zamapować ruch przychodzący przykładowego wdrożenia na bramę ruchu przychodzącego Istio:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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 bramy wskazuje istio: aks-istio-ingressgateway-internal
element , który można znaleźć jako etykietę w usłudze zamapowanej na wewnętrzny ruch przychodzący, który został włączony wcześniej.
Ustaw zmienne środowiskowe dla wewnętrznego hosta i portów ruchu przychodzącego:
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 z danych wyjściowych poprzedniego polecenia i upewnij się, że strona produktu przykładowej aplikacji nie jest wyświetlana. Alternatywnie możesz również użyć curl
polecenia , aby potwierdzić, że przykładowa aplikacja nie jest dostępna. Na przykład:
curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"
Użyj kubectl exec
polecenia , aby potwierdzić, że aplikacja jest dostępna z poziomu 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>
Usuwanie zasobów
Jeśli chcesz wyczyścić siatkę usługi Istio i ruch przychodzący (pozostawiając za klastrem), 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