Implementando Istio no EKS

bernardo

Luiz Bernardo

Posted on March 14, 2022

Implementando Istio no EKS

O post Provisionando EKS com Terraform e pré-requisito para a implementação de Istio que vou mostrar aqui, caso não tenha seguido ele ainda corre lá e depois volta pra cá

Bom, se chegou na segunda linha e por que já manja de subir um EKS, então bora implementar o Istio nele =D

Instalando o Istio

Acesse a página de lançamento do Istio para baixar o arquivo de instalação do seu sistema operacional ou baixe e extraia a versão mais recente automaticamente para Linux ou macOS com o comando:

$ curl -L https://istio.io/downloadIstio | sh -
Enter fullscreen mode Exit fullscreen mode

Agora vamos para a pasta do Istio:

$ cd ../istio-1.13.1
Enter fullscreen mode Exit fullscreen mode

Exporte o binário istioctl para sua pasta de binários caso você esteja utilizando o Linux ou macOS:

$ export PATH=$PWD/bin:$PATH
Enter fullscreen mode Exit fullscreen mode

Instale o Istio com esse comando:

$ istioctl install --set profile=demo -y
Enter fullscreen mode Exit fullscreen mode

Vamos instalar agora a aplicação httpbin:

$ kubectl apply -f samples/httpbin/httpbin.yaml
Enter fullscreen mode Exit fullscreen mode

Defina o IP e as portas de entrada do seu service mesh:

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
Enter fullscreen mode Exit fullscreen mode

Em determinados ambientes, o balanceador de carga pode ser exposto usando um nome de host, em vez de um endereço IP. Nesse caso, o EXTERNAL-IP valor do gateway de entrada não será um endereço IP, mas sim um nome de host, e o comando acima não terá definido a INGRESS_HOST variável de ambiente. Use o seguinte comando para corrigir o INGRESS_HOST:

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Enter fullscreen mode Exit fullscreen mode

Configurando o Istio

Crie um Istio Gateway:

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "httpbin.example.com"
EOF
Enter fullscreen mode Exit fullscreen mode

Configure as rotas para o tráfego que entra por Gateway:

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - "httpbin.example.com"
  gateways:
  - httpbin-gateway
  http:
  - match:
    - uri:
        prefix: /status
    - uri:
        prefix: /delay
    route:
    - destination:
        port:
          number: 8000
        host: httpbin
EOF
Enter fullscreen mode Exit fullscreen mode

Defina um gateway de entrada com uma servers:seção configurando as portas 80 e 443. Assegure-se de que esteja definido PASSTHROUGH para tls na porta 443, que instrui o gateway a passar o tráfego de entrada como está, sem encerrar o TLS.

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: proxy
spec:
  selector:
    istio: ingressgateway # use istio default ingress gateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - httpbin.org
  - port:
      number: 443
      name: tls
      protocol: TLS
    tls:
      mode: PASSTHROUGH
    hosts:
    - edition.cnn.com
EOF
Enter fullscreen mode Exit fullscreen mode

Crie entradas de serviço para httpbin.org e edition.cnn.com serviços para torná-los acessíveis a partir do gateway de entrada:

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: httpbin-ext
spec:
  hosts:
  - httpbin.org
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  location: MESH_EXTERNAL
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: cnn
spec:
  hosts:
  - edition.cnn.com
  ports:
  - number: 443
    name: tls
    protocol: TLS
  resolution: DNS
  location: MESH_EXTERNAL
EOF
Enter fullscreen mode Exit fullscreen mode

Crie uma entrada de serviço e configure uma regra de destino para o localhost service. Você precisa dessa entrada de serviço na próxima etapa como destino para o tráfego para os serviços externos de aplicativos dentro da malha para bloquear o tráfego de dentro da malha. Neste exemplo, você usa o Istio como um proxy entre aplicativos internos e serviços externos.

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: localhost
spec:
  hosts:
  - localhost.local
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  - number: 443
    name: tls
    protocol: TLS
  resolution: STATIC
  endpoints:
  - address: 127.0.0.1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: localhost
spec:
  host: localhost.local
  trafficPolicy:
    tls:
      mode: DISABLE
      sni: localhost.local
EOF
Enter fullscreen mode Exit fullscreen mode

Crie um serviço virtual para cada serviço externo para configurar o roteamento para ele. Ambos os serviços virtuais incluem o proxy gateway na gateways seção e no match seção para tráfego HTTP e HTTPS.

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin.org
  gateways:
  - proxy
  - mesh
  http:
  - match:
    - gateways:
      - proxy
      port: 80
      uri:
        prefix: /status
    route:
    - destination:
        host: httpbin.org
        port:
          number: 80
  - match:
    - gateways:
      - mesh
      port: 80
    route:
    - destination:
        host: localhost.local
        port:
          number: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: cnn
spec:
  hosts:
  - edition.cnn.com
  gateways:
  - proxy
  - mesh
  tls:
  - match:
    - gateways:
      - proxy
      port: 443
      sni_hosts:
      - edition.cnn.com
    route:
    - destination:
        host: edition.cnn.com
        port:
          number: 443
  - match:
    - gateways:
      - mesh
      port: 443
      sni_hosts:
      - edition.cnn.com
    route:
    - destination:
        host: localhost.local
        port:
          number: 443
EOF
Enter fullscreen mode Exit fullscreen mode

Testando tudo

Acesse o httbin.org service por meio de seu IP e porta de entrada que você armazenou nas variáveis ​​de ambiente $INGRESS_HOSTe de $INGRESS_PORTambiente, respectivamente, durante a etapa anterior. Acesse o /status/418caminho do httpbin.orgserviço que retorna o status HTTP 418 I'm a teapot.

$ curl $INGRESS_HOST:$INGRESS_PORT/status/418 -Hhost:httpbin.org
Enter fullscreen mode Exit fullscreen mode

Se o gateway de entrada do Istio for implantado no istio-system namespace, imprima o log do gateway com o seguinte comando:

$ kubectl logs -l istio=ingressgateway -c istio-proxy -n istio-system | grep 'httpbin.org'
Enter fullscreen mode Exit fullscreen mode

Acesse o edition.cnn.com service por meio do seu gateway de entrada:

$ curl -s --resolve edition.cnn.com:$SECURE_INGRESS_PORT:$INGRESS_HOST https://edition.cnn.com:$SECURE_INGRESS_PORT | grep -o "<title>.*</title>"
Enter fullscreen mode Exit fullscreen mode

Acesse o log do edition.cnn.com service

$ kubectl logs -l istio=ingressgateway -c istio-proxy -n istio-system | grep 'edition.cnn.com'
Enter fullscreen mode Exit fullscreen mode

Estatísticas de uso visual

Para apresentação visual do fluxo vamos instalar o Kiali, ele é um dos addons que já vem disponível no diretório samples. Para implementar execute o comando em seu terminal

$ kubectl apply -f samples/addons
Enter fullscreen mode Exit fullscreen mode

Espere que os addons sejam instalados. Para verificar se a instalação do Kiali já foi concluída execute esse comando.

$ kubectl rollout status deployment/kiali -n istio-system
Enter fullscreen mode Exit fullscreen mode

Por fim, vamos para o Dashboard Kiali com esse comando

$ istioctl dashboard Kiali
Enter fullscreen mode Exit fullscreen mode

O Kiali será aberto em seu navegador, provavelmente no endereço http://localhost:20001/

Navegue até a aba graph e haverá uma visão gráfica do fluxo que você acabou de montar.

Kiali Istio

Uma boa prática é utilizar um ferramenta para automatizar essa configuração como Ansible.

É isso.
Vlw flw.

💖 💪 🙅 🚩
bernardo
Luiz Bernardo

Posted on March 14, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Implementando Istio no EKS
aws Implementando Istio no EKS

March 14, 2022