Como faço para expor os serviços do Kubernetes em execução no meu cluster do Amazon EKS?
Quero expor os serviços do Kubernetes em execução no meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS).
Breve descrição
Para expor os serviços do Kubernetes em execução no seu cluster, primeiro crie um aplicativo de amostra. Em seguida, aplique os ServiceTypes do Kubernetes ClusterIP, NodePort e LoadBalancer ao seu aplicativo de amostra.
Lembre-se dos seguintes detalhes:
- O ClusterIP expõe o serviço no endereço IP interno de um cluster.
- O NodePort expõe o serviço no endereço IP de cada nó em uma porta estática.
- O LoadBalancer expõe o serviço externamente usando um balanceador de carga.
Observação: o Amazon EKS é compatível com o Network Load Balancer e o Classic Load Balancer para pods executados nos nós de processamento de instância do Amazon Elastic Compute Cloud (Amazon EC2). O Amazon EKS fornece esse suporte usando um LoadBalancer. Você pode balancear a carga do tráfego de rede para um Network Load Balancer (destinos de instância ou IP) ou um Classic Load Balancer (somente destino de instância).
Resolução
Crie um aplicativo de amostra
1. Defina e aplique um arquivo de implantação. O exemplo a seguir cria um ReplicaSet que ativa dois pods nginx e, em seguida, cria um arquivo chamado nginx-deployment.yaml.
cat <<EOF > nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 EOF
2. Crie a implantação:
kubectl apply -f nginx-deployment.yaml
3. Verifique se seus pods estão em execução e têm seus próprios endereços IP internos:
kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t
Saída:
NAME STATUS IP nginx-deployment-574b87c764-hcxdg Running 192.168.20.8 nginx-deployment-574b87c764-xsn9s Running 192.168.53.240
Crie um serviço ClusterIP
1. Crie um arquivo chamado clusterip.yaml e defina o tipo como ClusterIP. Por exemplo:
cat <<EOF > clusterip.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-cluster-ip spec: type: ClusterIP selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF
2. Crie o objeto ClusterIP no Kubernetes usando um comando declarativo ou imperativo.
Para criar o objeto e aplicar o arquivo clusterip.yaml, execute o comando declarativo a seguir:
kubectl create -f clusterip.yaml
Saída:
service/nginx-service-cluster-ip created
-ou-
Para expor uma implantação do tipo ClusterIP, execute o comando imperativo a seguir:
kubectl expose deployment nginx-deployment --type=ClusterIP --name=nginx-service-cluster-ip
Saída:
service "nginx-service-cluster-ip" exposed
**Observação:**o comando expor cria um serviço sem criar um arquivo YAML. No entanto, o kubectl traduz seu comando imperativo em um objeto declarativo de implantação do Kubernetes.
3. Acesse o aplicativo e obtenha o número ClusterIP:
kubectl get service nginx-service-cluster-ip
Saída:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service-cluster-ip ClusterIP 10.100.12.153 <none> 80/TCP 23s
4. Exclua o serviço ClusterIP:
kubectl delete service nginx-service-cluster-ip
Saída:
service "nginx-service-cluster-ip" deleted
Crie um serviço NodePort
1. Para criar um serviço NodePort, crie um arquivo chamado nodeport.yaml e defina o tipo como NodePort. Por exemplo:
cat <<EOF > nodeport.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-nodeport spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF
2. Crie o objeto NodePort no Kubernetes usando um comando declarativo ou imperativo.
Para criar o objeto e aplicar o arquivo nodeport.yaml, execute o comando declarativo a seguir:
kubectl create -f nodeport.yaml
-ou-
Para expor uma implantação do tipo NodePort, execute o comando imperativo a seguir:
kubectl expose deployment nginx-deployment --type=NodePort --name=nginx-service-nodeport
Saída:
service/nginx-service-nodeport exposed
3. Obtenha informações sobre o nginx-service:
kubectl get service/nginx-service-nodeport
Saída:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service-nodeport NodePort 10.100.106.151 <none> 80:30994/TCP 27s
Importante: O ServiceType é um NodePort e um ClusterIP criados automaticamente para o serviço. A saída do comando anterior mostra que o serviço NodePort está exposto externamente na porta (30994) da instância EC2 do nó de processamento disponível. Antes de acessar NodeIP:NodePort de fora do cluster, você deve definir o grupo de segurança dos nós para permitir o tráfego de entrada. Você pode permitir o tráfego de entrada pela porta (30994) listada na saída do comando kubectl get service anterior.
4. Se o nó estiver em uma sub-rede pública e puder ser acessado pela Internet, verifique o endereço IP público do nó:
kubectl get nodes -o wide | awk {'print $1" " $2 " " $7'} | column -t
Saída:
NAME STATUS EXTERNAL-IP ip-10-0-3-226.eu-west-1.compute.internal Ready 1.1.1.1 ip-10-1-3-107.eu-west-1.compute.internal Ready 2.2.2.2
-ou-
Se o nó estiver em uma sub-rede privada e só for acessível dentro ou por meio de uma VPC, verifique o endereço IP privado do nó:
kubectl get nodes -o wide | awk {'print $1" " $2 " " $6'} | column -t
Saída:
NAME STATUS INTERNAL-IP ip-10-0-3-226.eu-west-1.compute.internal Ready 10.0.3.226 ip-10-1-3-107.eu-west-1.compute.internal Ready 10.1.3.107
5. Exclua o serviço NodePort:
kubectl delete service nginx-service-nodeport
Saída:
service "nginx-service-nodeport" deleted
Crie um serviço LoadBalancer
1. Para criar um serviço LoadBalancer, crie um arquivo chamado loadbalancer.yaml e defina o tipo como LoadBalancer. Por exemplo:
cat <<EOF > loadbalancer.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-loadbalancer spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF
2. Aplique o arquivo loadbalancer.yaml:
kubectl create -f loadbalancer.yaml
Saída:
service/nginx-service-loadbalancer created
-ou-
Exponha uma implantação do tipo LoadBalancer:
kubectl expose deployment nginx-deployment --type=LoadBalancer --name=nginx-service-loadbalancer
Saída:
service "nginx-service-loadbalancer" exposed
3. Obtenha informações sobre o nginx-service:
kubectl get service/nginx-service-loadbalancer | awk {'print $1" " $2 " " $4 " " $5'} | column -t
Saída:
NAME TYPE EXTERNAL-IP PORT(S) nginx-service-loadbalancer LoadBalancer *****.eu-west-1.elb.amazonaws.com 80:30039/TCP
4. Verifique se você pode acessar o balanceador de carga externamente:
curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
Você deve receber a seguinte saída entre as tags de título HTML: “Bem-vindo ao nginx!”
5. Exclua o serviço LoadBalancer:
kubectl delete service nginx-service-loadbalancer
Saída:
service "nginx-service-loadbalancer" deleted
Observação: por padrão, o serviço ** LoadBalancer** anterior cria um Classic Load Balancer.
6. Para criar um Network Load Balancer com um destino do tipo instância, adicione a anotação a seguir ao manifesto de serviço:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
-ou-
Para criar um Network Load Balancer com destinos IP, implante o AWS Load Balancer Controller e, em seguida, crie um balanceador de carga que usa destinos IP.
Vídeos relacionados
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 3 anos
- AWS OFICIALAtualizada há um ano