Come posso 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).
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:
-
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
-
Per creare la distribuzione, esegui questo comando:
kubectl apply -f nginx-deployment.yaml
-
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:
-
Crea un file denominato clusterip.yaml.
-
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
-
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
-
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
-
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.
-
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:
-
Crea un file denominato nodeport.yaml.
-
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
-
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
-
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.
-
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
-
Per utilizzare NodeIP e NodePort per accedere all'applicazione, esegui questo comando:
curl -silent <Public/PrivateNodeIP>:30994 | grep title
-
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:
-
Crea un file denominato loadbalancer.yaml.
-
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
-
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
-
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
-
Per verificare di poter accedere esternamente al bilanciatore del carico, esegui questo comando:
curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
-
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.
Video correlati
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 6 mesi fa
- AWS UFFICIALEAggiornata 2 anni fa