Wie mache ich die Kubernetes-Services, die auf meinem Amazon EKS-Cluster laufen, verfügbar?

Lesedauer: 6 Minute
0

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.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren