Entradas externas ou internas do Serviço Kubernetes do Azure (AKS) para implantação do complemento de malha do serviço Istio
Este artigo mostra como implantar entradas externas ou internas para o complemento de malha de serviço Istio para cluster do Serviço Kubernetes do Azure (AKS).
Nota
Ao realizar uma pequena atualização de revisão do complemento Istio, outra implantação para os gateways externos / internos será criada para a nova revisão do plano de controle.
Pré-requisitos
Este guia pressupõe que você seguiu a documentação para habilitar o complemento Istio em um cluster AKS, implantar um aplicativo de exemplo e definir variáveis de ambiente.
Habilitar gateway de entrada externo
Use az aks mesh enable-ingress-gateway
para habilitar uma entrada do Istio acessível externamente em seu cluster AKS:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external
Use kubectl get svc
para verificar o serviço mapeado para o gateway de entrada:
kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress
Observe a partir da saída que o endereço IP externo do serviço é acessível ao público:
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
Os aplicativos não são acessíveis de fora do cluster por padrão depois de habilitar o gateway de entrada. Para tornar um aplicativo acessível, mapeie a entrada da implantação de exemplo para o gateway de entrada do Istio usando o seguinte manifesto:
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
Nota
O seletor usado no objeto Gateway aponta para istio: aks-istio-ingressgateway-external
, que pode ser encontrado como rótulo no serviço mapeado para a entrada externa habilitada anteriormente.
Definir variáveis de ambiente para portas e host de entrada externo:
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
Recupere o endereço externo do aplicativo de exemplo:
echo "http://$GATEWAY_URL_EXTERNAL/productpage"
Navegue até a URL a partir da saída do comando anterior e confirme se a página do produto do aplicativo de exemplo é exibida. Como alternativa, você também pode usar curl
para confirmar que o aplicativo de exemplo está acessível. Por exemplo:
curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"
Confirme se a página do produto do aplicativo de exemplo está acessível. O resultado esperado é:
<title>Simple Bookstore App</title>
Habilitar gateway de entrada interno
Use az aks mesh enable-ingress-gateway
para habilitar uma entrada interna do Istio em seu cluster AKS:
az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal
Use kubectl get svc
para verificar o serviço mapeado para o gateway de entrada:
kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress
Observe a partir da saída que o endereço IP externo do serviço não é acessível publicamente e, em vez disso, é apenas acessível localmente:
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
Os aplicativos não são mapeados para o gateway de entrada do Istio depois de habilitar o gateway de entrada. Use o manifesto a seguir para mapear a entrada da implantação de exemplo para o gateway de entrada do 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
Nota
O seletor usado no objeto Gateway aponta para istio: aks-istio-ingressgateway-internal
, que pode ser encontrado como rótulo no serviço mapeado para a entrada interna habilitada anteriormente.
Defina variáveis de ambiente para portas e host de entrada interno:
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
Recupere o endereço do aplicativo de exemplo:
echo "http://$GATEWAY_URL_INTERNAL/productpage"
Navegue até a URL a partir da saída do comando anterior e confirme se a página do produto do aplicativo de exemplo NÃO é exibida. Como alternativa, você também pode usar curl
para confirmar que o aplicativo de exemplo NÃO está acessível. Por exemplo:
curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"
Use kubectl exec
para confirmar se o aplicativo está acessível de dentro da rede virtual do cluster:
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>"
Confirme se a página do produto do aplicativo de exemplo está acessível. O resultado esperado é:
<title>Simple Bookstore App</title>
Eliminar recursos
Se você quiser limpar a malha de serviço do Istio e as entradas (deixando para trás o cluster), execute o seguinte comando:
az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Se você quiser limpar todos os recursos criados a partir dos documentos de orientação de instruções do Istio, execute o seguinte comando:
az group delete --name ${RESOURCE_GROUP} --yes --no-wait