Este tutorial destina-se a utilizadores e administradores do Kubernetes que tenham interesse em usar a rede de serviços Istio para implementar serviços do Kubernetes em segurança e ativar a comunicação TLS mútua (mTLS).
Istio e Cloud Service Mesh
O Istio não é um produto Google suportado. Em alternativa, recomendamos que execute o serviço de malha de nuvem gerido. Para mais informações, consulte o artigo Aprovisione o Cloud Service Mesh num cluster do GKE Autopilot.
O Cloud Service Mesh oferece as seguintes vantagens:
- Pode aprovisionar o Cloud Service Mesh gerido através da API Fleet sem ferramentas do lado do cliente, como o
istioctl. - O Cloud Service Mesh injeta automaticamente proxies sidecar em cargas de trabalho sem conceder privilégios elevados aos seus contentores.
- Pode ver painéis de controlo detalhados para a sua malha e serviços sem qualquer configuração adicional e, em seguida, usar estas métricas para configurar objetivos de nível de serviço (SLOs) e alertas para monitorizar o estado das suas aplicações.
- O plano de controlo da Cloud Service Mesh gerida é atualizado automaticamente para garantir que recebe os patches e as funcionalidades de segurança mais recentes.
- O plano de dados gerido da Cloud Service Mesh atualiza automaticamente os proxies sidecar nas suas cargas de trabalho para que não tenha de reiniciar os serviços quando estiverem disponíveis atualizações de proxy e patches de segurança.
- O Cloud Service Mesh é um produto suportado e pode ser configurado através das APIs Istio de código aberto padrão. Para mais informações, consulte as funcionalidades suportadas.
Objetivos
Este tutorial inclui os seguintes passos:
- Crie um cluster do GKE Autopilot.
- Instale o Istio através da ferramenta de linha de comandos
istioctl. - Implemente uma aplicação de exemplo para testar a autenticação TLS mútua (mTLS).
- Configure o Istio para usar a autenticação mTLS para a comunicação de serviço para serviço através de um recurso personalizado
PeerAuthentication. - Valide a autenticação mTLS através do painel de controlo do Kiali.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização prevista,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
O Cloud Shell está pré-instalado com o software necessário para este tutorial, incluindo o kubectl, a CLI gcloud e o Terraform.
Se não usar o Cloud Shell, tem de instalar a CLI gcloud.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/container.clusterAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Replace the following:
PROJECT_ID: Your project ID.USER_IDENTIFIER: The identifier for your user account. For example,myemail@example.com.ROLE: The IAM role that you grant to your user account.
Defina variáveis de ambiente:
export PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID gcloud config set compute/region us-central1Substitua
PROJECT_IDpelo seu Google Cloud ID do projeto.Clone o repositório do GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.gitAltere para o diretório de trabalho:
cd kubernetes-engine-samples/service-mesh/istio-tutorialInstale o Istio:
Para instalar a versão mais recente do Istio:
curl -L https://istio.io/downloadIstio | sh -Para instalar uma versão específica do Istio:
export ISTIO_VERSION=VERSION_NUMBER curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -Substitua VERSION_NUMBER pela versão do Istio que quer instalar. Para informações sobre os lançamentos do Istio, consulte os anúncios de lançamentos.
Adicione a ferramenta de linha de comandos
istioctlao PATH:cd istio-* export PATH=$PWD/bin:$PATHInstale o Istio no cluster:
istioctl install --set profile="default" -yEste passo pode demorar alguns minutos.
Aguarde até que os pods do Istio estejam prontos:
watch kubectl get pods -n istio-systemO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE istio-ingressgateway-5c47bff876-wjm96 1/1 Running 0 2m54s istiod-5fc7cb65cd-k8cp4 1/1 Running 0 2m57sQuando os pods do Istio estiverem
Running, regresse à linha de comandos premindoCtrl+C.Adicione uma etiqueta de espaço de nomes que instrui o Istio a ativar a injeção automática de proxies sidecar do Envoy:
kubectl label namespace default istio-injection=enabledImplemente a aplicação de exemplo:
cd .. git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git kubectl apply -f bank-of-anthos/extras/jwt/jwt-secret.yaml kubectl apply -f bank-of-anthos/kubernetes-manifests/Aguarde até que a aplicação esteja pronta:
watch kubectl get podsO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE accounts-db-0 2/2 Running 0 2m16s balancereader-5c695f78f5-x4wlz 2/2 Running 0 3m8s contacts-557fc79c5-5d7fg 2/2 Running 0 3m7s frontend-7dd589c5d7-b4cgq 2/2 Running 0 3m7s ledger-db-0 2/2 Running 0 3m6s ledgerwriter-6497f5cf9b-25c6x 2/2 Running 0 3m5s loadgenerator-57f6896fd6-lx5df 2/2 Running 0 3m5s transactionhistory-6c498965f-tl2sk 2/2 Running 0 3m4s userservice-95f44b65b-mlk2p 2/2 Running 0 3m4sQuando os auriculares estiverem
Running, regresse à linha de comandos premindoCtrl+C.Reveja o seguinte manifesto:
Este manifesto descreve os recursos Gateway e VirtualService do Istio que expõem a aplicação e usam o Istio como o controlador de entrada.
Aplique o manifesto ao cluster:
kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yamlPERMISSIVE: as cargas de trabalho aceitam tráfego mTLS e de texto simples.STRICT: as cargas de trabalho só aceitam tráfego mTLS.DISABLE: o mTLS está desativado. Use este modo se quiser usar a sua própria solução de segurança.Reveja o seguinte manifesto:
Este manifesto descreve um recurso personalizado do Istio de autenticação de pares.
Aplique o manifesto ao cluster:
kubectl apply -f peer-authentication.yamlCrie uma conta de serviço do IAM com o
roles/monitoring.viewerpara permitir que a interface de consulta aceda às métricas:gcloud iam service-accounts create monitoring \ --display-name="Service account for query interface" gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding \ monitoring@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[monitoring/default]"Crie um namespace do Kubernetes:
kubectl create namespace monitoringAnote a conta de serviço predefinida do Kubernetes no espaço de nomes para configurar a federação de identidades da carga de trabalho para o GKE:
kubectl annotate serviceaccount -n monitoring default \ iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwriteImplemente a carga de trabalho da interface de consulta:
kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yamlReveja o seguinte manifesto:
Este manifesto descreve um recurso
PodMonitoringque recolhe métricas do Istio e do Envoy Proxy.Aplique o manifesto ao cluster:
kubectl apply -f pod-monitorings.yamlObtenha um link para a aplicação de exemplo:
INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo "http://$INGRESS_HOST"Abra o link para ver a aplicação de exemplo. Inicie sessão com o nome de utilizador e a palavra-passe predefinidos para gerar tráfego entre os microsserviços.
Instale o operador Kiali:
helm repo add kiali https://kiali.org/helm-charts helm repo update helm install \ --namespace kiali-operator \ --create-namespace \ kiali-operator \ kiali/kiali-operatorReveja o seguinte manifesto:
Este manifesto descreve um recurso personalizado do operador que define o servidor Kiali.
Aplique o manifesto ao cluster:
kubectl apply -f kiali.yamlAguarde até o servidor Kiali estar pronto:
watch kubectl get pods -n istio-systemO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE istio-ingressgateway-6845466857-92zp8 1/1 Running 0 9m11s istiod-6b47d84cf-4cqlt 1/1 Running 0 12mQuando os auriculares estiverem
Running, regresse à linha de comandos premindoCtrl+C.Configure o encaminhamento de portas no serviço do servidor Kiali para aceder ao painel de controlo:
kubectl -n istio-system port-forward svc/kiali 8080:20001Abra a pré-visualização Web. No Kiali, aceda à secção Gráfico e selecione a opção Segurança no menu pendente Apresentação. Esta vista apresenta o estado de segurança de cada nó no gráfico. Os nós com um emblema mTLS ativado indicam que o mTLS está ativado para esse serviço, e os nós sem o emblema indicam que o mTLS não está ativado.
Elimine o Kiali:
kubectl -n istio-system delete kiali kiali helm uninstall --namespace kiali-operator kiali-operatorElimine os recursos de monitorização:
kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yamlElimine a aplicação de exemplo:
kubectl delete -f bank-of-anthos/extras/istio/frontend-ingress.yaml kubectl delete -f bank-of-anthos/kubernetes-manifestsDesinstale o Istio:
istioctl uninstall --purge -yElimine o cluster do GKE:
gcloud container clusters delete --location us-central1 istio-cluster --quiet- Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.
Prepare o ambiente
Para configurar o seu ambiente, siga estes passos:
Crie um cluster do GKE
Ative as capacidades do Linux que o Istio requer: NET_RAW e NET_ADMIN.
Por predefinição, o GKE Autopilot não permite NET_ADMIN, mas pode ativar NET_ADMIN através do comando --workload-policies=allow-net-admin nas versões 1.27 e posteriores do GKE:
gcloud container clusters create-auto istio-cluster \
--location="us-central1" \
--workload-policies="allow-net-admin"
Para saber mais sobre a segurança do GKE Autopilot, consulte as Configurações de segurança incorporadas.
Instale o Istio
Pode instalar o Istio num cluster do GKE através do Istioctl.
Neste tutorial, instala o Istio com o perfil de configuração predefinido recomendado para implementações de produção.
Implemente a aplicação de exemplo
Nesta secção, vai usar a aplicação de exemplo Bank of Anthos para criar uma malha de serviços com autenticação mTLS.
Configure o mTLS
A autenticação TLS mútua (mTLS) está ativada por predefinição no Istio. Isto significa que o Istio monitoriza as cargas de trabalho do servidor que foram migradas para proxies do Istio e configura automaticamente os proxies do cliente para estabelecer ligações mTLS com estas cargas de trabalho. O Istio também configura os proxies de cliente para não usarem o mTLS quando se ligam a cargas de trabalho sem proxies sidecar.
O Istio pode configurar o mTLS para funcionar em três modos:
Pode aplicar a configuração de mTLS globalmente, por espaço de nomes ou por carga de trabalho. Neste tutorial, aplica a configuração por espaço de nomes através do modo STRICT mTLS.
Para mais informações sobre o mTLS no Istio, consulte o artigo Autenticação TLS mútua.
Verifique se o mTLS está ativado
O Kiali é um painel de controlo de observabilidade baseado na Web para a malha de serviços do Istio que oferece uma vista gráfica do seu ambiente de microsserviços, o que lhe permite monitorizar e resolver problemas das suas aplicações. Pode usar o Kiali para verificar se a autenticação mTLS está ativada e a funcionar corretamente na malha de serviços do Istio. O Kiali requer o Prometheus como uma origem de dados de telemetria. Este tutorial usa o Google Cloud Managed Service for Prometheus.
Instale uma interface de consultas
Instale o Kiali
Recomendamos que instale o Kiali através do operador do Kiali.
Limpar
Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.
Elimine o projeto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Elimine os recursos individuais
Se usou um projeto existente e não o quer eliminar, elimine os recursos individuais.