Direkt zum Inhalt

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

Lesedauer: 6 Minute
0

Ich möchte die Kubernetes-Services, die auf meinem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster ausgeführt werden, verfügbar machen.

Lösung

Um die auf deinem Amazon EKS-Cluster ausgeführten Kubernetes-Services verfügbar zu machen, erstelle zunächst eine Beispielanwendung. Wende dann die Kubernetes-Servicetypen ClusterIP, NodePort und LoadBalancer auf deine Beispielanwendung an. Weitere Informationen findest du unter Servicetyp auf der Kubernetes-Website.

Eine Beispielanwendung erstellen

Führe die folgenden Schritte aus:

  1. Definiere eine Bereitstellungsdatei in Kubernetes und wende sie an. Der folgende Beispielbefehl erstellt eine Datei mit dem Namen nginx-deployment.yaml und erstellt dann ein ReplicaSet, das zwei nginx-Pods hochfährt:

    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. Führe den folgenden Befehl aus, um die Bereitstellung zu erstellen:

    kubectl apply -f nginx-deployment.yaml
  3. Um zu überprüfen, ob die Pods ausgeführt werden und ihre eigenen internen IP-Adressen haben, führe den folgenden Befehl aus:

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

    Beispielausgabe:

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

Servicetyp anwenden

Entscheide, wie du die Anwendung verfügbar machen möchtest, und wende dann den entsprechenden Servicetyp an. Weitere Informationen zu den einzelnen Servicetypen findest du unter type: ClusterIP, type: NodePort und type: LoadBalancer auf der Kubernetes-Website.

ClusterIP-Servicetyp

Führe die folgenden Schritte aus:

  1. Erstelle eine Datei mit dem Namen clusterip.yaml.

  2. Stelle Typ auf ClusterIP ein, wie im folgenden Beispiel gezeigt:

    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. Verwende entweder einen deklarativen oder einen imperativen Befehl, um das ClusterIP-Objekt in Kubernetes zu erstellen.
    Führe den folgenden deklarativen Befehl aus, um das Objekt zu erstellen und die Datei clusterip.yaml zu übernehmen:

    kubectl create -f clusterip.yaml

    Beispielausgabe:

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

    -oder-

    Führe den folgenden Befehl aus, um eine Bereitstellung des Typs ClusterIP verfügbar zu machen:

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

    Hinweis: Der Befehl expose erstellt einen Dienst, aber keine YAML-Datei. kubectl übersetzt den imperativen Befehl jedoch in eine deklarative Kubernetes-Bereitstellung.
    Beispielausgabe:

    service "nginx-service-cluster-ip" exposed
  4. Führe den folgenden Befehl aus, um die CLUSTER-IP-Adresse abzurufen:

    kubectl get service nginx-service-cluster-ip

    Beispielausgabe:

    NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s
  5. Um die CLUSTER-IP-Adresse für den Zugriff auf die Anwendung zu verwenden, führe den folgenden Befehl aus:

    curl -silent 10.100.12.153:80 | grep title

    Hinweis: Um auf den Service zuzugreifen, musst du dich bei einem Worker-Knoten anmelden oder dich im Container eines Pods befinden.

  6. Führe den folgenden Befehl aus, um den ClusterIP-Dienst zu löschen:

    kubectl delete service nginx-service-cluster-ip

    Beispielausgabe:

    service "nginx-service-cluster-ip" deleted

NodePort-Servicetyp

Führe die folgenden Schritte aus:

  1. Erstelle eine Datei mit dem Namen nodeport.yaml.

  2. Stelle Typ auf NodePort ein, wie im folgenden Beispiel gezeigt:

    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. Verwende entweder einen deklarativen oder einen imperativen Befehl, um das NodePort-Objekt in Kubernetes zu erstellen.
    Führe den folgenden deklarativen Befehl aus, um das Objekt zu erstellen und die Datei nodeport.yaml zu übernehmen:

    kubectl create -f nodeport.yaml

    -oder-

    Führe den folgenden imperativen Befehl aus, um eine Bereitstellung des Typs NodePort verfügbar zu machen:

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

    Beispielausgabe:

    service/nginx-service-nodeport exposed
  4. Um Informationen über nginx-service abzurufen, führe den folgenden Befehl aus:

    kubectl get service/nginx-service-nodeport

    Beispielausgabe:

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

    Wichtig: NodePort erstellt eine Service-IP-Adresse, auf die innerhalb des Clusters zugegriffen werden kann, und verwendet den angegebenen Port, um den Service auf jedem Knoten verfügbar zu machen. Die Ausgabe des vorherigen Befehls zeigt, dass der NodePort-Servicetyp extern auf dem Port der Amazon Elastic Compute Cloud (Amazon EC2)-Instance des verfügbaren Worker-Knotens verfügbar gemacht wird. Bevor du von außerhalb des Clusters auf nodeip:nodePort zugreifst, lege die Knotensicherheitsgruppen fest, um eingehenden Datenverkehr über den in der Ausgabe aufgeführten Port zuzulassen.

  5. Wenn sich der Knoten in einem öffentlichen Subnetz befindet und über das Internet erreichbar ist, überprüfe die öffentliche IP-Adresse des Knotens:

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

    Beispielausgabe:

    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-

    Bei Knoten, die sich in einem privaten Subnetz befinden und nur über eine Virtual Private Cloud (VPC) erreichbar sind, überprüfe die private IP-Adresse des Knotens:

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

    Beispielausgabe:

    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. Um Node IP und NodePort für den Zugriff auf die Anwendung zu verwenden, führe den folgenden Befehl aus:

    curl -silent <Public/PrivateNodeIP>:30994 | grep title
  7. Führe den folgenden Befehl aus, um den NodePort-Dienst zu löschen:

    kubectl delete service nginx-service-nodeport

    Beispielausgabe:

    service "nginx-service-nodeport" deleted

LoadBalancer-Servicetyp

Führe die folgenden Schritte aus:

  1. Erstelle eine Datei mit dem Namen loadbalancer.yaml.

  2. Stelle Typ auf LoadBalancer ein, wie im folgenden Beispiel gezeigt:

    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. Führe den folgenden Befehl aus, um die Datei loadbalancer.yaml zu übernehmen:

    kubectl create -f loadbalancer.yaml

    Beispielausgabe:

    service/nginx-service-loadbalancer created

    -oder-

    Führe den folgenden Befehl aus, um eine Bereitstellung des Typs LoadBalancer verfügbar zu machen:

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

    Beispielausgabe:

    service "nginx-service-loadbalancer" exposed
  4. Um Informationen über nginx-service abzurufen, führe den folgenden Befehl aus:

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

    Beispielausgabe:

    NAME                        TYPE          EXTERNAL-IP                        PORT(S)
    nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP
  5. Führe den folgenden Befehl aus, um zu überprüfen, ob du extern auf den Load Balancer zugreifen kannst:

    curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
  6. Führe den folgenden Befehl aus, um den LoadBalancer-Service zu löschen:

    kubectl delete service nginx-service-loadbalancer

    Beispielausgabe:

    service "nginx-service-loadbalancer" deleted

Hinweis: Standardmäßig erstellt der LoadBalancer-Servicetyp einen Classic Load Balancer. Für optimale Unterstützbarkeit und langfristige Zuverlässigkeit empfiehlt es sich, den AWS Load Balancer Controller zur Bereitstellung von Network Load Balancern zu verwenden. Diese von AWS verwaltete Lösung bietet erweiterte Funktionen, eine bessere Integration mit AWS-Services und Support.

Um einen Network Load Balancer mit einem Ziel vom Typ Instance zu erstellen, füge 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, stelle den AWS Load Balancer Controller bereit und erstelle dann einen Load Balancer, der IP-Ziele verwendet.