Wie mache ich die Kubernetes-Services, die auf meinem Amazon EKS-Cluster laufen, verfügbar?
Ich möchte die Kubernetes-Services, die auf meinem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster laufen, verfügbar machen.
Kurzbeschreibung
Um die auf Ihrem Cluster ausgeführten Kubernetes-Dienste verfügbar zu machen, erstellen Sie zunächst eine Beispielanwendung. Wenden Sie dann die Kubernetes ServiceTypes ClusterIP, NodePort und LoadBalancer auf Ihre Beispielanwendung an.
Beachten Sie die folgenden Details:
- ClusterIP macht den Dienst auf der internen IP-Adresse eines Clusters verfügbar.
- NodePort macht den Dienst auf der IP-Adresse jedes Knotens an einem statischen Port verfügbar.
- LoadBalancer macht den Dienst extern mithilfe eines Load Balancers verfügbar.
Hinweis: Amazon EKS unterstützt den Network Load Balancer und den Classic Load Balancer für Pods, die auf Amazon Elastic Compute Cloud (Amazon EC2) Instance-Worker-Knoten laufen. Amazon EKS bietet diese Unterstützung mithilfe eines LoadBalancers an. Sie können die Lastverteilung des Netzwerkverkehrs auf einen Network Load Balancer (Instance- oder IP-Ziele) oder einen Classic Load Balancer (nur Instance-Ziel) vornehmen.
Lösung
Erstellen Sie eine Beispielanwendung
1. Definieren Sie eine Bereitstellungsdatei und wenden Sie sie an. Im folgenden Beispiel wird ein ReplicaSet erstellt, das zwei nginx-Pods aktiviert, und dann eine Datei mit dem Namen nginx-deployment.yaml erstellt.
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. Erstellen Sie die Bereitstellung:
kubectl apply -f nginx-deployment.yaml
3. Stellen Sie sicher, dass Ihre Pods laufen und ihre eigenen internen IP-Adressen haben:
kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t
Ausgabe:
NAME STATUS IP nginx-deployment-574b87c764-hcxdg Running 192.168.20.8 nginx-deployment-574b87c764-xsn9s Running 192.168.53.240
Erstellen Sie einen ClusterIP-Dienst
1. Erstellen Sie eine Datei mit dem Namen clusterip.yaml und setzen Sie dann type auf ClusterIP. Zum Beispiel:
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. Erstellen Sie das ClusterIP-Objekt in Kubernetes, indem Sie entweder einen deklarativen oder einen imperativen Befehl verwenden.
Führen Sie den folgenden deklarativen Befehl aus, um das Objekt zu erstellen und die Datei clusterip.yaml anzuwenden:
kubectl create -f clusterip.yaml
Ausgabe:
service/nginx-service-cluster-ip created
-oder-
Führen Sie den folgenden Befehl aus, um eine Bereitstellung vom Typ ClusterIP verfügbar zu machen:
kubectl expose deployment nginx-deployment --type=ClusterIP --name=nginx-service-cluster-ip
Ausgabe:
service "nginx-service-cluster-ip" exposed
Hinweis: Der expose-Befehl erstellt einen Dienst, ohne eine YAML-Datei zu erstellen. kubectl übersetzt Ihren imperativen Befehl jedoch in ein deklaratives Kubernetes-Bereitstellungsobjekt.
3. Greifen Sie auf die Anwendung zu und rufen Sie die ClusterIP-Nummer ab:
kubectl get service nginx-service-cluster-ip
Ausgabe:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service-cluster-ip ClusterIP 10.100.12.153 <none> 80/TCP 23s
4. Löschen Sie den ClusterIP-Dienst:
kubectl delete service nginx-service-cluster-ip
Ausgabe:
service "nginx-service-cluster-ip" deleted
Erstellen Sie einen NodePort-Dienst
1. Um einen NodePort-Dienst zu erstellen, erstellen Sie eine Datei mit dem Namen nodeport.yaml und setzen Sie dann type auf NodePort. Zum Beispiel:
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. Erstellen Sie das NodePort-Objekt in Kubernetes, indem Sie entweder einen deklarativen oder einen imperativen Befehl verwenden.
Führen Sie den folgenden deklarativen Befehl aus, um das Objekt zu erstellen und die Datei nodeport.yaml anzuwenden:
kubectl create -f nodeport.yaml
-oder-
Führen Sie den folgenden imperativen Befehl aus, um eine Bereitstellung vom Typ NodePort verfügbar zu machen:
kubectl expose deployment nginx-deployment --type=NodePort --name=nginx-service-nodeport
Ausgabe:
service/nginx-service-nodeport exposed
3. Informieren Sie sich über den nginx-service:
kubectl get service/nginx-service-nodeport
Ausgabe:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service-nodeport NodePort 10.100.106.151 <none> 80:30994/TCP 27s
Wichtig: Der ServiceType ist ein NodePort und eine ClusterIP, die automatisch für den Dienst erstellt werden. Die Ausgabe des vorherigen Befehls zeigt, dass der NodePort-Dienst extern auf dem Port (30994) der EC2-Instance des verfügbaren Worker-Knotens verfügbar ist. Bevor Sie von außerhalb des Clusters auf NodeIP:NodePort zugreifen, müssen Sie die Sicherheitsgruppe der Knoten so einrichten, dass eingehender Datenverkehr zugelassen wird. Sie können eingehenden Datenverkehr über den Port (30994) zulassen, der in der Ausgabe des vorherigen Befehls kubectl get service aufgeführt ist.
4. Wenn sich der Knoten in einem öffentlichen Subnetz befindet und über das Internet erreichbar ist, überprüfen Sie die öffentliche IP-Adresse des Knotens:
kubectl get nodes -o wide | awk {'print $1" " $2 " " $7'} | column -t
Ausgabe:
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
-oder-
Wenn sich der Knoten in einem privaten Subnetz befindet und nur innerhalb oder über eine VPC erreichbar ist, überprüfen Sie die private IP-Adresse des Knotens:
kubectl get nodes -o wide | awk {'print $1" " $2 " " $6'} | column -t
Ausgabe:
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. Löschen Sie den NodePort-Dienst:
kubectl delete service nginx-service-nodeport
Ausgabe:
service "nginx-service-nodeport" deleted
Erstellen Sie einen LoadBalancer-Dienst
1. Um einen LoadBalancer-Dienst zu erstellen, erstellen Sie eine Datei mit dem Namen loadbalancer.yaml und setzen Sie dann type auf LoadBalancer. Zum Beispiel:
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. Wenden Sie die Datei loadbalancer.yaml an:
kubectl create -f loadbalancer.yaml
Ausgabe:
service/nginx-service-loadbalancer created
-oder-
Machen Sie eine Bereitstellung vom Typ LoadBalancer verfügbar:
kubectl expose deployment nginx-deployment --type=LoadBalancer --name=nginx-service-loadbalancer
Ausgabe:
service "nginx-service-loadbalancer" exposed
3. Informieren Sie sich über den nginx-service:
kubectl get service/nginx-service-loadbalancer | awk {'print $1" " $2 " " $4 " " $5'} | column -t
Ausgabe:
NAME TYPE EXTERNAL-IP PORT(S) nginx-service-loadbalancer LoadBalancer *****.eu-west-1.elb.amazonaws.com 80:30039/TCP
4. Stellen Sie sicher, dass Sie extern auf den Load Balancer zugreifen können:
curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
Sie sollten die folgende Ausgabe zwischen HTML-Title-Tags erhalten: „Willkommen bei nginx!“
5. Löschen Sie den LoadBalancer-Dienst:
kubectl delete service nginx-service-loadbalancer
Ausgabe:
service "nginx-service-loadbalancer" deleted
Hinweis: Standardmäßig erstellt der vorherige LoadBalancer-Dienst einen Classic Load Balancer.
6. Um einen Network Load Balancer mit einer Ziel vom Typ Instance zu erstellen, fügen Sie dem Service-Manifest die folgende Anmerkung hinzu:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
-oder-
Um einen Network Load Balancer mit IP-Zielen zu erstellen, stellen Sie den AWS Load Balancer Controller bereit und erstellen Sie dann einen Load Balancer, der IP-Ziele verwendet.
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren