Stellen Sie eine Linux-Beispielarbeitslast bereit - Amazon EKS

Stellen Sie eine Linux-Beispielarbeitslast bereit

In diesem Thema erstellen Sie ein Kubernetes-Manifest und stellen es auf Ihrem Cluster bereit.

Prerequisites

  • Für die Bereitstellung einer Beispielanwendung benötigen Sie einen vorhandenen Kubernetes-Cluster. Wenn Sie keinen Amazon EKS-Cluster haben, können Sie einen mithilfe der Anleitung Erste Schritte mit Amazon EKS bereitstellen.

  • kubectl ist auf Ihrem Computer installiert. Weitere Informationen finden Sie unter Installieren von kubectl.

  • kubectlFür die Kommunikation mit Ihrem Cluster konfiguriert sein. Weitere Informationen finden Sie unter Erstellen Sie ein kubeconfig für Amazon EKS.

So stellen Sie eine Beispielanwendung bereit

  1. Erstellen Sie einen Kubernetes-Namespace für den Controller.

    kubectl create namespace <my-namespace>
  2. Erstellen Sie einen Kubernetes-Service und eine entsprechende Bereitstellung.

    1. Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen sample-service.yaml auf Ihrem Computer. Bei Bereitstellen fürAWS-FargateStellen Sie sicher, dass der Wert fürnamespaceentspricht dem Namespace, den Sie in IhremAWS-Fargate-Profilaus. Diese Beispielbereitstellung ruft ein Container-Image aus einem öffentlichen Repository ab und stellt drei Replikate davon in Ihrem Cluster bereit. Anschließend erstellt es einen Kubernetes-Dienst mit einer eigenen IP-Adresse, auf die nur innerhalb des Clusters zugegriffen werden kann. Um von außerhalb des Clusters auf den Dienst zuzugreifen, stellen Sie eineBei Network Load BalanceroderALB Ingress Controlleraus.

      Das Bild ist ein Multi-Architektur-Image. Wenn Ihr Cluster sowohl x86- als auch Arm-Knoten enthält, kann der Pod für beide Hardwarearchitekturen geplant werden. Kubernetes stellt das entsprechende Hardware-Image basierend auf dem Hardware-Typ des Knotens bereit, auf dem er den Pod plant. Wenn Sie möchten, dass die Bereitstellung nur auf Knoten mit einer bestimmten Hardwarearchitektur ausgeführt wird, entfernen Sie entwederamd64oderarm64aus dem folgenden Beispiel. Wenn Ihr Cluster nur eine Hardwarearchitektur enthält, sollten Sie dies auch tun.

      apiVersion: v1 kind: Service metadata: name: my-service namespace: my-namespace labels: app: my-app spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment namespace: my-namespace labels: app: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 - arm64 containers: - name: nginx image: public.ecr.aws/z9d2n7e1/nginx:1.19.5 ports: - containerPort: 80

      Um mehr über Kubernetes zu erfahren-Servicesund-Bereitstellungenfinden Sie in der Dokumentation zu Kubernetes. Die Container im Beispielmanifest verwenden keinen Netzwerkspeicher, können aber möglicherweise in der Lage sein. Weitere Informationen finden Sie unter Storage. Obwohl in diesem Beispiel nicht implementiert, empfiehlt es sich, Kubernetes-Dienstkonten für Ihre Pods zu erstellen und diese mitAWSIAM-Konten Wenn Sie Dienstkonten angeben, können Sie Ihre Pods über die Mindestberechtigungen verfügen, die sie für die Interaktion mit anderen Diensten benötigen. Weitere Informationen finden Sie unter IAM-Rollen für Servicekonten

    2. Stellen Sie die Anwendung bereit.

      kubectl apply -f <sample-service.yaml>
  3. Zeigen Sie alle Ressourcen im my-namespace-Namespace an.

    kubectl get all -n my-namespace

    Die Ausgabe sieht wie folgt aus:

    NAME READY STATUS RESTARTS AGE pod/my-deployment-776d8f8fd8-78w66 1/1 Running 0 27m pod/my-deployment-776d8f8fd8-dkjfr 1/1 Running 0 27m pod/my-deployment-776d8f8fd8-wmqj6 1/1 Running 0 27m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-service ClusterIP 10.100.190.12 <none> 80/TCP 32m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-deployment 3/3 3 3 27m NAME DESIRED CURRENT READY AGE replicaset.apps/my-deployment-776d8f8fd8 3 3 3 27m

    In der Ausgabe sehen Sie den Dienst und die Bereitstellung, die im Beispielmanifest angegeben sind, das im vorherigen Schritt bereitgestellt wurde. Sie sehen auch drei Hülsen. Dies liegt daran, dass Sie3fürreplicasim Beispielmanifest. Weitere Informationen finden Sie unter DNS für Services and Pods in der Kubernetes-Dokumentation. Kubernetes erstellt automatisch diereplicaset-Ressource, obwohl sie nicht im Beispielmanifest angegeben ist. Weitere Informationen zu ReplicaSets finden Sie unterReplicaSetIn der Kubernetes-Dokumentation.

    Anmerkung

    Kubernetes behält die Anzahl der Replikate bei, die im Manifest angegeben sind. Wenn es sich um eine Produktionsbereitstellung handelt und Sie möchten, dass Kubernetes die Anzahl der Replikate horizontal skaliert oder die Rechenressourcen für die Pods vertikal skaliert, verwenden Sie dieHorizontal Pod Autoscalerund dieVertical Pod Autoscaleraus.

  4. Zeigen Sie die Details des bereitgestellten Dienstes an.

    kubectl -n <my-namespace> describe service <my-service>

    Im Folgenden finden Sie die gekürzte Ausgabe:

    Name: my-service Namespace: my-namespace Labels: app=my-app Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"my-app"},"name":"my-service","namespace":"my-namespace"}... Selector: app=my-app Type: ClusterIP IP: 10.100.190.12 Port: <unset> 80/TCP TargetPort: 80/TCP ...

    In der Ausgabe wird der Wert fürIP:ist eine eindeutige IP-Adresse, die von jedem Pod innerhalb des Clusters aus erreicht werden kann.

  5. Zeigen Sie die Details zu einem der bereitgestellten Pods an.

    kubectl -n <my-namespace> describe pod <my-deployment-776d8f8fd8-78w66>

    Im Folgenden finden Sie die gekürzte Ausgabe:

    Name: my-deployment-776d8f8fd8-78w66 Namespace: my-namespace Priority: 0 Node: ip-192-168-9-36.us-west-2.compute.internal/192.168.9.36 ... IP: 192.168.16.57 IPs: IP: 192.168.16.57 Controlled By: ReplicaSet/my-deployment-776d8f8fd8 ... Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m20s default-scheduler Successfully assigned my-namespace/my-deployment-776d8f8fd8-78w66 to ip-192-168-9-36.us-west-2.compute.internal ...

    In der Ausgabe wird der Wert fürIP:ist eine eindeutige IP, die dem Pod standardmäßig vom CIDR-Block zugewiesen wird. Dieser CIDR-Block wird dem Subnetz zugewiesen, in dem sich der Knoten befindet. Wenn Sie es vorziehen, dass Pods IP-Adressen aus verschiedenen CIDR-Blöcken zugewiesen werden, können Sie das Standardverhalten ändern. Weitere Informationen finden Sie unter Benutzerdefinierte CNI-Netzwerke. Sie können auch sehen, dass der Kubernetes-Scheduler den Pod auf dem Knoten mit der IP-Adresse geplant hat192.168.9.36aus.

  6. Führen Sie eine Shell auf einem der Pods aus, indem <value> Sie den folgenden Wert durch einen Wert ersetzen, der für einen Ihrer Pods in Schritt 3 zurückgegeben wird.

    kubectl exec -it <my-deployment-776d8f8fd8-78w66> -n <my-namespace> -- /bin/bash
  7. Zeigen Sie die DNS-Resolver-Konfigurationsdatei an.

    cat /etc/resolv.conf

    Die Ausgabe sieht wie folgt aus:

    nameserver 10.100.0.10 search my-namespace.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal options ndots:5

    In der vorherigen Ausgabe wird der Wert fürnameserverist der Nameserver des Clusters und wird automatisch als Nameserver für jeden Pod zugewiesen, der im Cluster bereitgestellt wird.

  8. Trennen Sie die Verbindung mit dem Pod, indem Sieexitaus.

  9. Entfernen Sie den Beispieldienst, die Bereitstellung, Pods und den Namespace.

    kubectl delete namespace <my-namespace>