Come faccio a esporre i servizi Kubernetes in esecuzione sul mio cluster Amazon EKS?

6 minuti di lettura
0

Desidero esporre i servizi Kubernetes in esecuzione sul mio cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrizione

Per esporre i servizi Kubernetes in esecuzione sul tuo cluster, crea innanzitutto un'applicazione di esempio. Quindi, applica ClusterIP, NodePort e LoadBalancer Kubernetes ServiceTypes alla tua applicazione di esempio.

Tieni presente i seguenti dettagli:

  • ClusterIP espone il servizio all'indirizzo IP interno di un cluster.
  • NodePort espone il servizio sull'indirizzo IP di ciascun nodo su una porta statica.
  • LoadBalancer espone il servizio esternamente utilizzando un sistema di bilanciamento del carico.

Nota: Amazon EKS supporta il Network Load Balancer e il Classic Load Balancer per i pod in esecuzione sui nodi di lavoro delle istanze Amazon Elastic Compute Cloud (Amazon EC2). Amazon EKS fornisce questo supporto utilizzando un LoadBalancer. È possibile bilanciare il traffico di rete verso un Network Load Balancer (istanza o destinazioni IP) o un Classic Load Balancer (solo destinazione dell'istanza).

Risoluzione

Crea un'applicazione di esempio

  1. Definisci e applica un file di distribuzione. L'esempio seguente crea un ReplicaSet che attiva due nginx pod e quindi crea un file chiamato 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
  1. Crea la distribuzione:
kubectl apply -f nginx-deployment.yaml
  1. Verifica che i tuoi pod siano in funzione e abbiano i propri indirizzi IP interni:
kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t

Uscita:

NAME                               STATUS   IP
nginx-deployment-574b87c764-hcxdg  Running  192.168.20.8
nginx-deployment-574b87c764-xsn9s  Running  192.168.53.240

Crea un servizio ClusterIP

  1. Crea un file chiamato clusterip.yaml, quindi imposta il tipo su ClusterIP. Ad esempio:
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
  1. Crea l'oggetto ClusterIP in Kubernetes utilizzando un comando dichiarativo o imperativo.

Per creare l'oggetto e applicare il file clusterip.yaml, esegui il seguente comando dichiarativo:

kubectl create -f clusterip.yaml

Uscita:

service/nginx-service-cluster-ip created

-oppure-

Per esporre un'implementazione di tipo ClusterIP, esegui il seguente comando imperativo:

kubectl expose deployment nginx-deployment  --type=ClusterIP  --name=nginx-service-cluster-ip

Uscita:

service "nginx-service-cluster-ip" exposed

Nota: il comando expose crea un servizio senza creare un file YAML. Tuttavia, kubectl traduce il tuo comando imperativo in un oggetto Kubernetes Deployment dichiarativo.

  1. Accedi all'applicazione e ottieni il numero ClusterIP:
kubectl get service nginx-service-cluster-ip

Uscita:

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s
  1. Elimina il servizio ClusterIP:
kubectl delete service nginx-service-cluster-ip

Uscita:

service "nginx-service-cluster-ip" deleted

Crea un servizio NodePort

  1. Per creare un servizio NodePort, crea un file chiamato nodeport.yaml, quindi imposta il tipo su NodePort. Ad esempio:
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
  1. Crea l'oggetto NodePort in Kubernetes utilizzando un comando dichiarativo o imperativo.

Per creare l'oggetto e applicare il file nodeport.yaml, esegui il seguente comando dichiarativo:

kubectl create -f nodeport.yaml

-oppure-

Per esporre una distribuzione di tipo NodePort, esegui il seguente comando imperativo:

kubectl expose deployment nginx-deployment  --type=NodePort  --name=nginx-service-nodeport

Uscita:

service/nginx-service-nodeport exposed
  1. Ottieni informazioni su nginx-service:
kubectl get service/nginx-service-nodeport

Uscita:

NAME                     TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-service-nodeport   NodePort   10.100.106.151   <none>        80:30994/TCP   27s

Importante: il ServiceType è un NodePort e un ClusterIP creati automaticamente per il servizio. L'output del comando precedente mostra che il servizio NodePort è esposto esternamente sulla porta (30994) dell'istanza EC2 del nodo worker disponibile. Prima di accedere a NodeIP:NodePort dall'esterno del cluster, devi impostare il gruppo di sicurezza dei nodi per consentire il traffico in ingresso. Puoi consentire il traffico in entrata attraverso la porta (30994) elencata nell'output del precedente comando kubectl get service.

  1. Se il nodo si trova in una sottorete pubblica ed è raggiungibile da Internet, controlla l'indirizzo IP pubblico del nodo:
kubectl get nodes -o wide |  awk {'print $1" " $2 " " $7'} | column -t

Uscita:

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

-oppure-

Se il nodo si trova in una sottorete privata ed è raggiungibile solo all'interno o tramite un VPC, controlla l'indirizzo IP privato del nodo:

kubectl get nodes -o wide |  awk {'print $1" " $2 " " $6'} | column -t

Uscita:

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
  1. Elimina il servizio **NodePort**:
    
kubectl delete service nginx-service-nodeport

Uscita:

service "nginx-service-nodeport" deleted

Crea un servizio LoadBalancer

  1. Per creare un servizio LoadBalancer, crea un file chiamato loadbalancer.yaml, quindi imposta il tipo su LoadBalancer. Ad esempio:
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
  1. Applica il file loadbalancer.yaml:
kubectl create -f loadbalancer.yaml

Uscita:

service/nginx-service-loadbalancer created

-oppure-

Esponi una distribuzione di tipo LoadBalancer:

kubectl expose deployment nginx-deployment  --type=LoadBalancer  --name=nginx-service-loadbalancer

Uscita:

service "nginx-service-loadbalancer" exposed
  1. Ottieni informazioni su nginx-service:
kubectl get service/nginx-service-loadbalancer |  awk {'print $1" " $2 " " $4 " " $5'} | column -t

Uscita:

NAME                        TYPE          EXTERNAL-IP                        PORT(S)
nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP
  1. Verifica di poter accedere al load balancer esternamente:
curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title

Dovresti ricevere il seguente risultato tra i tag dei titoli HTML: "Benvenuto su nginx!"

  1. Eliminare il servizio LoadBalancer:
kubectl delete service nginx-service-loadbalancer

Uscita:

service "nginx-service-loadbalancer" deleted

Nota: per impostazione predefinita, il servizio LoadBalancer precedente crea un Classic Load Balancer.

  1. Per creare un Network Load Balancer con un target di tipo di istanza, aggiungi la seguente annotazione al manifesto del servizio:
service.beta.kubernetes.io/aws-load-balancer-type: nlb

-oppure-

Per creare un Network Load Balancer con destinazioni IP, distribuisci AWS Load Balancer Controller, quindi crea un sistema di bilanciamento del carico che utilizzi destinazioni IP.


AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa