Este tópico descreve como implantar rapidamente uma aplicação em uma malha de serviços no modo Ambient Mesh.
Pré-requisitos
O código de exemplo está implantado. Para mais informações, consulte Preparações.
Baixe a ferramenta de depuração do Service Mesh (ASM), istioctl, correspondente ao seu sistema operacional e plataforma. A versão do istioctl deve ser compatível com a versão da sua instância do ASM. Para mais informações, visite o repositório do Istio no GitHub.
Ao executar as operações mencionadas neste tópico, talvez seja necessário alternar repetidamente entre contextos do Kubernetes para operar nos clusters do plano de dados e do plano de controle. Para evitar erros operacionais, verifique se o contexto atual está correto sempre que fizer essa alternância. Use kubectx para simplificar a troca de contextos. Para mais informações, consulte kubectx. Também é possível ativar o recurso de uso da API do Kubernetes dos clusters no plano de dados para acessar recursos do Istio e utilizar diretamente essa API para realizar operações nos clusters do plano de controle.
Etapa 1: Ative uma política de autorização
Após implantar uma aplicação na instância do ASM no modo Ambient Mesh, utilize políticas de autorização de camada 4 para proteger o acesso à aplicação. Por exemplo, é possível controlar o acesso com base nas identidades das cargas de trabalho cliente.
As políticas de autorização de camada 4 para instâncias do ASM V1.22 estão em fase de testes por meio de canary releases. Já as políticas de camada 4 para instâncias do ASM V1.21 e anteriores funcionam normalmente. Para utilizar políticas de autorização de camada 4 em instâncias do ASM V1.22, envie um ticket.
Políticas de autorização de camada 4
-
Crie um arquivo productpage-viewer.yaml com o seguinte conteúdo.
Esse arquivo yaml define políticas de autorização que permitem explicitamente que as contas de serviço da aplicação sleep e do gateway chamem o serviço productpage.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep - cluster.local/ns/istio-system/sa/istio-ingressgateway -
Conecte-se à instância do ASM via kubectl usando as informações do arquivo kubeconfig e execute o comando abaixo para implantar a política de autorização:
kubectl apply -f productpage-viewer.yaml -
Verifique se a política de autorização entrou em vigor.
-
Execute o seguinte comando:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"Saída esperada:
<title>Simple Bookstore App</title> -
Execute o seguinte comando:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Saída esperada:
<title>Simple Bookstore App</title> -
Execute o seguinte comando:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Saída esperada:
command terminated with exit code 56A saída anterior indica que a política de autorização está em vigor.
-
Políticas de autorização de camada 7
Para instâncias do ASM V1.21 e anteriores
Utilize a Kubernetes Gateway API para implantar um waypoint proxy para a conta de serviço bookinfo-productpage. Esse waypoint proxy será usado pelo serviço productpage. Todo o tráfego destinado ao serviço productpage passará por esse proxy de camada 7.
-
Execute o comando abaixo para implantar um waypoint proxy para a conta de serviço bookinfo-productpage:
istioctl x waypoint apply --service-account bookinfo-productpage -
Visualize o status do waypoint proxy do serviço productpage executando o seguinte comando:
kubectl get gtw bookinfo-productpage -o yaml -
Modifique a política de autorização.
-
Copie o conteúdo abaixo para o arquivo productpage-viewer.yaml. Isso permitirá explicitamente que as contas de serviço da aplicação sleep e do gateway acessem o serviço productpage por meio de requisições GET, bloqueando outras operações.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep - cluster.local/ns/istio-system/sa/istio-ingressgateway to: - operation: methods: ["GET"] -
Reimplante a política de autorização executando o comando a seguir:
kubectl apply -f productpage-viewer.yaml
-
-
Verifique se a política de autorização entrou em vigor.
-
Execute o seguinte comando:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" -X DELETESaída esperada:
RBAC: access denied -
Execute o seguinte comando:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/Saída esperada:
RBAC: access denied -
Execute o seguinte comando:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Saída esperada:
<title>Simple Bookstore App</title>A saída anterior indica que a política de autorização está em vigor.
-
Para instâncias do ASM V1.22 e posteriores
Para usar recursos de camada 7 no modo Ambient Mesh, primeiro ative um waypoint proxy para o serviço ou carga de trabalho especificado.
Como ativar um waypoint proxy para o serviço ou carga de trabalho especificado?
As instâncias do ASM V1.22 oferecem um novo método de configuração de waypoint proxies. Com ele, você ativa esses proxies de forma flexível em diferentes escopos. A configuração envolve duas partes:
-
Primeiro, crie um waypoint proxy e use rótulos para especificar o tráfego ao qual ele se aplica.
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONEO campo
gatewayClassNamedeste gateway éistio-waypoint, o que indica a criação de um waypoint proxy.Este gateway possui um rótulo especial
istio.io/waypoint-for: service, indicando que o waypoint proxy é dedicado ao tráfego do serviço. Além deservice, o campo istio.io/waypoint-for pode ser definido comoworkload(dedicado a pods) ouall(serviço e carga de trabalho).
-
Especifique qual tráfego o waypoint proxy processará. Adicione o rótulo
istio.io/use-waypointao serviço, namespace ou pod e defina seu valor como o nome do waypoint proxy desejado.apiVersion: v1 kind: Service metadata: labels: app: httpbin service: httpbin istio.io/use-waypoint: waypoint name: httpbin namespace: default spec: ports: - name: http port: 8000 protocol: TCP targetPort: 80 selector: app: httpbin type: ClusterIP
Demonstração
A seção a seguir demonstra como usar políticas de autorização de camada 7 no ambiente descrito neste tópico.
-
Conecte-se ao cluster ACK via kubectl usando as informações do arquivo kubeconfig. Em seguida, implante o seguinte conteúdo do waypoint proxy no namespace default:
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE -
Conecte-se ao cluster ACK via kubectl usando as informações do arquivo kubeconfig. Depois, execute o comando abaixo para adicionar um rótulo ao serviço productpage, garantindo que seu tráfego seja processado pelo waypoint proxy:
kubectl label service productpage istio.io/use-waypoint=waypoint -
Atualize a política de autorização com o seguinte conteúdo:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep to: - operation: methods: ["GET"]A nova política de autorização indica explicitamente que apenas requisições GET da aplicação sleep podem acessar o serviço productpage; todas as demais serão rejeitadas.
NotaSe a aplicação da política de autorização acima falhar, exclua a política original e aplique-a novamente.
-
Verifique se a política de autorização entrou em vigor.
-
Conecte-se ao cluster ACK via kubectl usando as informações do arquivo kubeconfig. Em seguida, execute o comando abaixo para acessar o serviço productpage com uma requisição GET:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Saída esperada:
<title>Simple Bookstore App</title> -
Execute o comando a seguir para acessar o serviço productpage com uma requisição DELETE:
kubectl exec deploy/sleep -- curl -XDELETE -s http://productpage:9080/Saída esperada:
RBAC: access denied -
Execute o comando abaixo para acessar o serviço productpage com uma requisição GET:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/Saída esperada:
RBAC: access denied
A saída anterior indica que a política de autorização está em vigor.
-
Etapa 2: Defina regras de roteamento de camada 7
Para instâncias do ASM V1.21 e anteriores
-
Execute o comando abaixo para implantar um waypoint proxy para o serviço reviews, de modo que todo o tráfego destinado a ele passe por esse proxy:
istioctl x waypoint apply --service-account bookinfo-reviews -
Crie um arquivo reviews.yaml com o seguinte conteúdo.
Configure uma regra de roteamento de tráfego para enviar 90% das requisições para reviews-v1 e 10% para reviews-v2.
-
Implante uma regra de destino executando o seguinte comando:
kubectl apply -f reviews.yaml -
Verifique se 10% de 100 requisições são enviadas para reviews-v2 executando o comando abaixo:
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://$GATEWAY_HOST/productpage | grep reviews-v.-; done"Saída esperada:
<u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v2-5d99885bc9-qb5cv</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u>A saída anterior indica que a regra de roteamento de camada 7 está em vigor.
Para instâncias do ASM V1.22 e posteriores
-
Execute o comando abaixo para associar o serviço reviews ao waypoint proxy, garantindo que todo o tráfego destinado a ele passe por esse proxy:
kubectl label service reviews istio.io/use-waypoint=waypoint -
Use o conteúdo a seguir para criar uma regra de roteamento de tráfego para o serviço reviews, enviando 90% das requisições para reviews-v1 e 10% para reviews-v2:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 90 - destination: host: reviews subset: v2 weight: 10 -
Verifique se 10% de 100 requisições são enviadas para reviews-v2 executando o comando abaixo:
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://$GATEWAY_HOST/productpage | grep reviews-v.-; done"Saída esperada:
<u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v2-5d99885bc9-qb5cv</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u>A saída anterior indica que a regra de roteamento de camada 7 está em vigor.
Etapa 3: Exclua recursos
Execute os comandos abaixo para excluir os recursos criados neste tópico:
istioctl x waypoint delete --service-account bookinfo-productpage
istioctl x waypoint delete --service-account bookinfo-reviews
kubectl delete authorizationpolicy productpage-viewer