DEV Community

Luiz Bernardo for AWS Community Builders

Posted on

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.

Top comments (0)