Come faccio a esporre i servizi Kubernetes in esecuzione sul mio cluster Amazon EKS?
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
- 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
- Crea la distribuzione:
kubectl apply -f nginx-deployment.yaml
- 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
- 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
- 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.
- 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
- Elimina il servizio ClusterIP:
kubectl delete service nginx-service-cluster-ip
Uscita:
service "nginx-service-cluster-ip" deleted
Crea un servizio NodePort
- 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
- 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
- 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.
- 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
-
Elimina il servizio **NodePort**:
kubectl delete service nginx-service-nodeport
Uscita:
service "nginx-service-nodeport" deleted
Crea un servizio LoadBalancer
- 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
- 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
- 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
- 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!"
- 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.
- 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.
Video correlati
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 3 anni fa