Come posso 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).

Risoluzione

Per esporre i servizi Kubernetes in esecuzione su un cluster, crea innanzitutto un'applicazione di esempio. Quindi applica il tipo di servizio Kubernetes ClusterIP, NodePort o LoadBalancer all'applicazione di esempio. Per ulteriori informazioni, consulta Service type sul sito web di Kubernetes.

Crea un'applicazione di esempio

Completa i passaggi seguenti:

  1. Definisci e applica un file di distribuzione in Kubernetes. L'esempio seguente crea prima un file denominato nginx-deployment.yaml, poi un ReplicaSet che crea due pod nginx:

    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. Per creare la distribuzione, esegui questo comando:

    kubectl apply -f nginx-deployment.yaml
  3. Per verificare che i pod siano in esecuzione e abbiano indirizzi IP interni, esegui questo comando:

    kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t

    Output di esempio:

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

Applica il tipo di servizio

Decidi come esporre l'applicazione, quindi applica il tipo di servizio appropriato. Per informazioni su ciascun tipo di servizio, consulta type: ClusterIP, type: NodePort e type: LoadBalancer sul sito web di Kubernetes.

Tipo di servizio ClusterIP

Completa i passaggi seguenti:

  1. Crea un file denominato clusterip.yaml.

  2. Imposta type su ClusterIP, come mostrato nell'esempio seguente:

    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
  3. Usa un comando dichiarativo o imperativo per creare l'oggetto ClusterIP in Kubernetes.
    Per creare l'oggetto e applicare il file clusterip.yaml, esegui questo comando dichiarativo:

    kubectl create -f clusterip.yaml

    Output di esempio:

    service/nginx-service-cluster-ip created>/code>

    -oppure-

    Per esporre una distribuzione di tipo ClusterIP, esegui questo comando imperativo:

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

    Nota: il comando expose crea un servizio ma non crea un file YAML. Tuttavia, kubectl traduce il comando imperativo in un oggetto di distribuzione Kubernetes dichiarativo.
    Output di esempio:

    service "nginx-service-cluster-ip" exposed
  4. Per ottenere l'indirizzo CLUSTER-IP, esegui questo comando:

    kubectl get service nginx-service-cluster-ip

    Output di esempio:

    NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s
  5. Per utilizzare l'indirizzo CLUSTER-IP per accedere all'applicazione, esegui questo comando:

    curl -silent 10.100.12.153:80 | grep title

    Nota: per accedere al servizio, devi avere effettuato l'accesso a un nodo di lavoro o trovarti all'interno del contenitore di un pod.

  6. Per eliminare il servizio ClusterIP, esegui questo comando:

    kubectl delete service nginx-service-cluster-ip

    Output di esempio:

    service "nginx-service-cluster-ip" deleted

Tipo di servizio NodePort

Completa i passaggi seguenti:

  1. Crea un file denominato nodeport.yaml.

  2. Imposta type su NodePort, come mostrato nell'esempio seguente:

    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
  3. Usa un comando dichiarativo o imperativo per creare l'oggetto NodePort in Kubernetes.
    Per creare l'oggetto e applicare il file nodeport.yaml, esegui questo comando dichiarativo:

    kubectl create -f nodeport.yaml

    -oppure-

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

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

    Output di esempio:

    service/nginx-service-nodeport exposed
  4. Per ottenere informazioni su nginx-service, esegui questo comando:

    kubectl get service/nginx-service-nodeport

    Output di esempio:

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

    Importante: NodePort crea un indirizzo IP del servizio accessibile all'interno del cluster e utilizza la porta specificata per esporre il servizio su ogni nodo. L'output del comando precedente mostra che il tipo di servizio NodePort è esposto esternamente sulla porta dell'istanza Amazon Elastic Compute Cloud (Amazon EC2) del nodo worker disponibile. Prima di accedere a NodeIP:NodePort dall'esterno del cluster, imposta i gruppi di sicurezza dei nodi in modo da consentire il traffico in entrata attraverso la porta indicata nell'output.

  5. Per i nodi che si trovano in una sottorete pubblica e sono raggiungibili da internet, controlla l'indirizzo IP pubblico del nodo:

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

    Output di esempio:

    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-

    Per i nodi che si trovano in una sottorete privata e sono raggiungibili solo tramite un cloud privato virtuale (VPC), controlla l'indirizzo IP privato del nodo:

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

    Output di esempio:

    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
  6. Per utilizzare NodeIP e NodePort per accedere all'applicazione, esegui questo comando:

    curl -silent <Public/PrivateNodeIP>:30994 | grep title
  7. Per eliminare il servizio NodePort, esegui questo comando:

    kubectl delete service nginx-service-nodeport

    Output di esempio:

    service "nginx-service-nodeport" deleted

Tipo di servizio LoadBalancer

Completa i passaggi seguenti:

  1. Crea un file denominato loadbalancer.yaml.

  2. Imposta type su LoadBalancer, come mostrato nell'esempio seguente:

    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
  3. Per applicare il file loadbalancer.yaml, esegui questo comando:

    kubectl create -f loadbalancer.yaml

    Output di esempio:

    service/nginx-service-loadbalancer created

    -oppure-

    Per esporre una distribuzione di tipo LoadBalancer, esegui questo comando:

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

    Output di esempio:

    service "nginx-service-loadbalancer" exposed
  4. Per ottenere informazioni su nginx-service, esegui questo comando:

    kubectl get service/nginx-service-loadbalancer |  awk {'print $1" " $2 " " $4 " " $5'} | column -t

    Output di esempio:

    NAME                        TYPE          EXTERNAL-IP                        PORT(S)
    nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP
  5. Per verificare di poter accedere esternamente al bilanciatore del carico, esegui questo comando:

    curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
  6. Per eliminare il servizio LoadBalancer, esegui questo comando:

    kubectl delete service nginx-service-loadbalancer

    Output di esempio:

    service "nginx-service-loadbalancer" deleted

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

Per creare un Network Load Balancer con una destinazione di tipo istanza, aggiungi l'annotazione seguente 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 bilanciatore del carico che utilizza destinazioni IP.

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 mesi fa