Como faço para expor os serviços do Kubernetes em execução no meu cluster do Amazon EKS?

6 minuto de leitura
0

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.


AWS OFICIAL
AWS OFICIALAtualizada há 2 anos