Como o Amazon EKS e o APISIX Ingress Controller trabalham juntos para gerenciar tráfego complexo
API7.ai
February 7, 2021
Contexto
Como gerente de tráfego, às vezes, mesmo quando você está preparado para o inesperado, é difícil evitar o inesperado. Construir um gateway de API de quatro vias é crucial! Veja como Amazon EKS + Ingress APISIX! pode ajudar com isso hoje.
Introdução
Kubernetes é um sistema de código aberto para automatizar a implantação, dimensionamento e gerenciamento de aplicações em contêineres. O Amazon Elastic Kubernetes Service (Amazon EKS) como um serviço gerenciado de Kubernetes permite que você execute cargas do Kubernetes facilmente na Amazon Cloud Technologies sem a necessidade de instalação e manutenção do plano de controle ou dos nós.
O Apache APISIX é um gateway de API dinâmico, em tempo real e de alto desempenho. Ele fornece recursos avançados de gerenciamento de tráfego, como balanceamento de carga, upstream dinâmico, implantação em escala cinza, segmentação de tráfego, autenticação e observabilidade. Você pode usar o Apache APISIX para lidar com o tráfego norte-sul entre clientes tradicionais e servidores, bem como o tráfego leste-oeste entre serviços.
O Ingress APISIX pode ser usado como o controlador de entrada para o Kubernetes, trazendo os melhores recursos do Apache APISIX para o Kubernetes. Isso pode ser impulsionado por componentes de controlador bem projetados para ajudá-lo a atender às necessidades complexas de gerenciamento de tráfego.
Como configurar e executar o Ingress APISIX no Amazon Elastic Kubernetes Service
Requisitos Prévios
Antes de começar, configure um cluster Amazon EKS disponível na Amazon CloudTech.
Você deve ter a ferramenta kubectl
no seu ambiente e definir o contexto para o seu próprio cluster Amazon EKS executando o seguinte comando:
aws eks update-kubeconfig --name --region
Assim que o cluster Kubernetes estiver pronto, crie um namespace chamado ingress-apisix
, onde todos os recursos que serão usados serão criados.
kubectl create namespace ingress-apisix
Usaremos o Helm para implantar todos os componentes do Ingress APISIX (Apache APISIX e apisix-ingress-controller), então siga o guia de instalação para instalar o Helm. O chart do Helm para o Apache APISIX e o apisix-ingress-controller está localizado em apache/apisix-helm-chart e apache/apisix-ingress-controller. Clone esses repositórios para obter os charts correspondentes.
Instalando o Apache APISIX
O Apache APISIX atua como um plano de proxy para o apisix-ingress-controller e deve ser implantado antecipadamente.
cd /path/to/apisix-helm-chart
helm repo add bitnami https://charts.bitnami.com/bitnami
helm dependency update . /chart/apisix
helm install apisix . /chart/apisix \
--set gateway.type=LoadBalancer \
--set allow.ipList="{0.0.0.0/0}" \
--namespace ingress-apisix
kubectl get service --namespace ingress-apisix
O comando acima criará dois recursos de serviço Kubernetes: apisix-gateway
, que lida com o tráfego real, e apisix-admin
, que atua como o plano de controle e lida com todas as alterações de configuração. Aqui, criamos o apisix-gateway
como um serviço do tipo LoadBalancer, que pode ser exposto à Internet com a ajuda do Amazon Network Load Balancer. Podemos encontrar o nome do host do balanceador de carga com o seguinte comando:
kubectl get service apisix-gateway \
--namespace ingress-apisix \
-o jsonpath='{.status.loadBalancer.ingress[].hostname}'
Observe também: o campo allow.ipList
deve ser ajustado para os intervalos CIDR do EKS no seu próprio cluster Amazon EKS, para que o apisix-ingress-controller possa ser autorizado pelo Apache APISIX (para enviar recursos).
Consulte value.yaml para mais informações sobre todos os itens de configuração, caso haja outros requisitos.
Instalando o apisix-ingress-controller
Após implantar o Apache APISIX com sucesso, é hora de instalar o componente Controller.
cd /path/to/apisix-ingress-controller
# instala recursos básicos, como ServiceAccount.
helm install ingress-apisix-base -n ingress-apisix . /charts/base
# instala o apisix-ingress-controller
helm install ingress-apisix . /charts/ingress-apisix \
--set ingressController.image.tag=dev \
--set ingressController.config.apisix.baseURL=http://apisix-admin:9180/apisix/admin \
--set ingressController.config.apisix.adminKey={YOUR ADMIN KEY} \
--namespace ingress-apisix
O chart ingress-apisix-base
instalará algumas dependências básicas para o apisix-ingress-controller, como ServiceAccount e seus CRDs dedicados.
O chart ingress-apisix
nos guiará na instalação do próprio Controller. Podemos alterar a tag da imagem para a versão desejada e ajustar o valor de ingressController.config.apisix.adminKey
no comando acima. Essas configurações podem ser ajustadas de acordo com cenários reais (e certifique-se de que a chave Admin usada aqui seja a mesma usada na implantação do Apache APISIX). Se você tiver outros requisitos, consulte value.yaml
para saber mais sobre todos os itens de configuração.
Em seguida, tente abrir o console do Amazon EKS, selecione seu cluster e clique na aba Workloads. Você verá que todos os Pods, etcd e apisix-ingress-controller para o Apache APISIX estão prontos.
Iniciando os testes
Neste ponto, implantamos todos os componentes do Ingress APISIX, então certifique-se de verificar se tudo está funcionando corretamente. Em seguida, implantaremos um serviço httpbin e pediremos ao Apache APISIX para rotear todas as solicitações para o host "local.httpbin.org" para este serviço.
Para isso, primeiro precisamos criar a carga de trabalho httpbin e expô-la.
kubectl run httpbin --image kennethreitz/httpbin --port 80
kubectl expose pod httpbin --port 80
Para que o Apache APISIX roteie as solicitações corretamente, precisamos criar um recurso ApisixRoute para impulsionar o processo.
# ar-httpbin.yaml
apiVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
name: httpserver-route
spec:
rules:
- host: local.httpbin.org
http:
paths:
- backend:
serviceName: httpbin
servicePort: 80
path: /*
O recurso ApisixRoute acima permitirá que o Apache APISIX roteie solicitações com o cabeçalho de host "local.httpbin.org" para o backend httpbin (que acabamos de criar).
Em seguida, aplique essa configuração, mas observe que o serviço e o recurso ApisixRoute devem estar no mesmo namespace, e o apisix-ingress-controller não pode cruzar namespaces.
kubectl apply -f ar-httpbin.yaml
Teste os resultados com uma simples chamada curl
de qualquer lugar que possa alcançar o serviço Apache APISIX.
$ curl http://{apisix-gateway-ip}:{apisix-gateway-port}/headers -s -H 'Host: local.httpbin.org'
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=1-5ffc3273-2928e0844e19c9810d1bbd8a"
}
}
Se o tipo de serviço for ClusterIP, você precisará fazer login em um Pod no cluster Amazon EKS e usar o ClusterIP ou o FQDN do serviço para acessar o Apache APISIX. Se já estiver exposto (NodePort ou LoadBalancer), você pode acessar diretamente o endpoint externo alcançável.
Nota: Este artigo foi reproduzido do site público do WeChat da AWS.