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 malha de serviços na nuvem gerido é 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.
Prepare o ambiente
Para configurar o seu ambiente, siga estes passos:
Defina variáveis de ambiente:
export PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID gcloud config set compute/region us-central1
Substitua
PROJECT_ID
pelo seu Google Cloud ID do projeto.Clone o repositório do GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
Mude para o diretório de trabalho:
cd kubernetes-engine-samples/service-mesh/istio-tutorial
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.
Instale 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
istioctl
ao PATH:cd istio-* export PATH=$PWD/bin:$PATH
Instale o Istio no cluster:
istioctl install --set profile="default" -y
Este passo pode demorar alguns minutos.
Aguarde até que os pods do Istio estejam prontos:
watch kubectl get pods -n istio-system
O 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 2m57s
Quando os pods do Istio estiverem
Running
, regresse à linha de comandos premindoCtrl+C
.
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.
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=enabled
Implemente 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 pods
O 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 3m4s
Quando 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.yaml
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:
PERMISSIVE
: 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.
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.
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.yaml
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 serviço gerido da Google Cloud para o Prometheus.
Instale uma interface de consultas
Crie uma conta de serviço do IAM com o
roles/monitoring.viewer
para 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 monitoring
Anote 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 --overwrite
Implemente 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.yaml
Reveja o seguinte manifesto:
Este manifesto descreve um recurso
PodMonitoring
que recolhe métricas do Istio e do Envoy Proxy.Aplique o manifesto ao cluster:
kubectl apply -f pod-monitorings.yaml
Obtenha 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 Kiali
Recomendamos que instale o Kiali através do operador do Kiali.
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-operator
Reveja 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.yaml
Aguarde até o servidor Kiali estar pronto:
watch kubectl get pods -n istio-system
O 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 12m
Quando 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:20001
Abra 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.