Bereitstellen einer -Beispielanwendung - Amazon EKS

Bereitstellen einer -Beispielanwendung

In diesem Thema stellen Sie eine Beispielanwendung in Ihrem Cluster bereit.

Voraussetzungen

  • Ein vorhandener Kubernetes-Cluster mit mindestens einem Knoten. Wenn Sie noch keinen Amazon-EKS-Cluster haben, können Sie einen mit einem der Erste Schritte mit Amazon EKS-Leitfäden bereitstellen. Wenn Sie eine Windows-Anwendung bereitstellen, müssen Sie Windows-Support für Ihren Cluster und mindestens einen Amazon-EC2-Windows-Knoten aktiviert haben.

  • Kubectl auf Ihrem Computer installiert. Weitere Informationen finden Sie unter Installieren oder Aktualisieren von kubectl.

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

  • Wenn Sie vorhaben, Ihre Beispiel-Workload in Fargate bereitzustellen, müssen Sie über ein vorhandenes Fargate-Profil verfügen, das denselben in diesem Tutorial erstellten Namespace enthält, nämlich eks-sample-app, es sei denn, Sie ändern den Namen. Wenn Sie einen der Erste-Schritte-Leitfäden benutzt haben, um Ihren Cluster zu erstellen, müssen Sie ein neues Profil erstellen oder den Namespace zu Ihrem vorhandenen Profil hinzufügen, da das in den Erste-Schritte-Leitfäden erstellte Profil den in diesem Tutorial verwendeten Namespace nicht angibt. Ihre VPC muss auch über mindestens ein privates Subnetz verfügen.

So stellen Sie eine Beispielanwendung bereit

Obwohl viele Variablen in den folgenden Schritten veränderbar sind, empfehlen wir, nur Variablenwerte zu ändern, wo angegeben. Sobald Sie Kubernetes-pods, Bereitstellungen und Services besser verstanden haben, können Sie mit dem Ändern anderer Werte experimentieren.

  1. Erstellen Sie einen Namespace. Ein Namespace ermöglicht es Ihnen, Ressourcen in Kubernetes zu gruppieren. Weitere Informationen finden Sie unter Namespaces in der Kubernetes-Dokumentation. Wenn Sie die Beispielanwendung für AWS Fargate bereitstellen möchten, stellen Sie sicher, dass der Wert für namespace in Ihrem AWS Fargate-Profil eks-sample-app ist.

    kubectl create namespace eks-sample-app
  2. Erstellen einer Kubernetes-Bereitstellung. Diese Beispielbereitstellung ruft ein Container-Image aus einem öffentlichen Repository ab und stellt drei Replikate (individuelle pods) davon in Ihrem Cluster bereit. Weitere Informationen finden Sie unter Bereitstellungen in der Kubernetes-Dokumentation. Sie können die Anwendung an Linux- oder Windows-Knoten bereitstellen. Wenn Sie an Fargate bereitstellen, können Sie nur eine Linux-Anwendung bereitstellen.

    1. Speichern Sie die folgenden Inhalte in einer Datei namens eks-sample-deployment.yaml. Die Container in der Beispielanwendung verwenden keinen Netzwerkspeicher, aber möglicherweise haben Sie Anwendungen, die dies benötigen. Weitere Informationen finden Sie unter Speicher.

      Linux

      Das amd64 oder arm64 values unter dem Schlüssel kubernetes.io/arch bedeutet, dass die Anwendung in einer der beiden Hardwarearchitekturen bereitgestellt werden kann (wenn Sie beide in Ihrem Cluster haben). Dies ist möglich, weil dieses Image ein Multi-Architektur-Image ist, aber das sind nicht alle. Sie können die Hardwarearchitektur bestimmen, auf der das Image unterstützt wird, indem Sie die Image-Details im Repository anzeigen, aus dem Sie es abrufen. Wenn Sie Images bereitstellen, die keinen Hardwarearchitektur-Typ unterstützen oder an die das Image nicht bereitgestellt werden soll, entfernen Sie diesen Typ aus dem Manifest. Weitere Informationen finden Sie unter Bekannte Labels, Anmerkungen und Taints in der Kubernetes-Dokumentation.

      Der Eintrag kubernetes.io/os: linux nodeSelector bedeutet, dass, wenn Sie beispielsweise Linux- und Windows-Knoten in Ihrem Cluster hätten, das Image nur auf Linux-Knoten bereitgestellt würde. Weitere Informationen finden Sie unter Bekannte Labels, Anmerkungen und Taints in der Kubernetes-Dokumentation.

      apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-linux-deployment namespace: eks-sample-app labels: app: eks-sample-linux-app spec: replicas: 3 selector: matchLabels: app: eks-sample-linux-app template: metadata: labels: app: eks-sample-linux-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 - arm64 containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.21 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent nodeSelector: kubernetes.io/os: linux
      Windows

      Der Eintrag kubernetes.io/os: windows nodeSelector bedeutet, dass, wenn Sie beispielsweise Windows- und Linux-Knoten in Ihrem Cluster hätten, das Image nur auf Windows-Knoten bereitgestellt würde. Weitere Informationen finden Sie unter Bekannte Labels, Anmerkungen und Taints in der Kubernetes-Dokumentation.

      apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-windows-deployment namespace: eks-sample-app labels: app: eks-sample-windows-app spec: replicas: 3 selector: matchLabels: app: eks-sample-windows-app template: metadata: labels: app: eks-sample-windows-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 containers: - name: windows-server-iis image: mcr.microsoft.com/windows/servercore:ltsc2019 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent command: - powershell.exe - -command - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; " nodeSelector: kubernetes.io/os: windows
    2. Wenden Sie das Bereitstellungs-Manifest auf Ihren Cluster an.

      kubectl apply -f eks-sample-deployment.yaml
  3. Erstellen Sie einen Service. Mit einem Service können Sie über eine einzige IP-Adresse oder einen einzigen Namen auf alle Replikate zugreifen. Weitere Informationen finden Sie unter Service in der Kubernetes-Dokumentation. Obwohl in der Beispielanwendung nicht implementiert, empfehlen wir Ihnen, AWS-Servicekonten für Ihre Kubernetes zu erstellen und sie AWS-IAM-Konten zuzuordnen, wenn Sie über Anwendungen verfügen, die mit anderen pods-Services interagieren müssen. Durch die Angabe von Servicekonten verfügen Ihre pods nur über die Mindestberechtigungen, die Sie für die Interaktion mit anderen Services angeben. Weitere Informationen finden Sie unter IAM-Rollen für Servicekonten.

    1. Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen eks-sample-service.yaml aus. Kubernetes weist dem Dienst eine eigene IP-Adresse zu, auf die nur innerhalb des Clusters zugegriffen werden kann. Um von außerhalb des Clusters auf den Service zuzugreifen, stellen Sie den AWS Load Balancer Controller als Load Balancer für den Anwendungs- oder den Netzwerk-Datenverkehr bereit.

      Linux
      apiVersion: v1 kind: Service metadata: name: eks-sample-linux-service namespace: eks-sample-app labels: app: eks-sample-linux-app spec: selector: app: eks-sample-linux-app ports: - protocol: TCP port: 80 targetPort: 80
      Windows
      apiVersion: v1 kind: Service metadata: name: eks-sample-windows-service namespace: eks-sample-app labels: app: eks-sample-windows-app spec: selector: app: eks-sample-windows-app ports: - protocol: TCP port: 80 targetPort: 80
    2. Wenden Sie das Service-Manifest auf Ihren Cluster an.

      kubectl apply -f eks-sample-service.yaml
  4. Zeigen Sie alle im eks-sample-app-Namespace vorhandenen Ressourcen an.

    kubectl get all -n eks-sample-app

    Die Beispielausgabe lautet wie folgt.

    Wenn Sie Windows-Ressourcen bereitgestellt haben, sind alle Instances von linux in der folgenden Ausgabe windows. Die anderen Beispielwerte können von Ihrer Ausgabe abweichen.

    NAME READY STATUS RESTARTS AGE pod/eks-sample-linux-deployment-65b7669776-m6qxz 1/1 Running 0 27m pod/eks-sample-linux-deployment-65b7669776-mmxvd 1/1 Running 0 27m pod/eks-sample-linux-deployment-65b7669776-qzn22 1/1 Running 0 27m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/eks-sample-linux-service ClusterIP 10.100.74.8 <none> 80/TCP 32m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/eks-sample-linux-deployment 3/3 3 3 27m NAME DESIRED CURRENT READY AGE replicaset.apps/eks-sample-linux-deployment-776d8f8fd8 3 3 3 27m

    In der Ausgabe sehen Sie den Service und die Bereitstellung, die in den Beispielmanifesten, die in den vorherigen Schritten bereitgestellt wurden, angegeben wurden. Sie sehen auch drei pods. Dies liegt daran, dass 3 replicas im Beispielmanifest angegeben wurden. Weitere Informationen zu pods finden Sie unter Pods in der Kubernetes-Dokumentation. Kubernetes erstellt automatisch die replicaset-Ressource, obwohl sie in den Beispielmanifesten nicht angegeben ist. Weitere Informationen zu ReplicaSets finden Sie unter ReplicaSet in 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 dazu das Horizontal Pod Autoscaler und das Vertical Pod Autoscaler.

  5. Zeigen Sie die Details des bereitgestellten Services an. Wenn Sie einen Windows-Service bereitgestellt haben, ersetzen Sie linux mit windows.

    kubectl -n eks-sample-app describe service eks-sample-linux-service

    Die Beispielausgabe lautet wie folgt.

    Wenn Sie Windows-Ressourcen bereitgestellt haben, sind alle Instances von linux in der folgenden Ausgabe windows. Die anderen Beispielwerte können von Ihrer Ausgabe abweichen.

    Name: eks-sample-linux-service Namespace: eks-sample-app Labels: app=eks-sample-linux-app Annotations: <none> Selector: app=eks-sample-linux-app Type: ClusterIP IP Families: <none> IP: 10.100.74.8 IPs: 10.100.74.8 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 192.168.24.212:80,192.168.50.185:80,192.168.63.93:80 Session Affinity: None Events: <none>

    In der vorherigen Ausgabe ist der Wert für IP: eine eindeutige IP-Adresse, die von jedem Knoten oder pod innerhalb des Clusters aus erreicht werden kann, jedoch nicht von außerhalb des Clusters. Die Werte für Endpoints sind IP-Adressen, die innerhalb Ihrer VPC den pods zugewiesen werden, die Teil des Services sind.

  6. Zeigen Sie die Details eines der in der Ausgabe aufgeführten pods an, wenn Sie in einem vorherigen Schritt den Namespace angezeigt haben. Wenn Sie eine Windows-App bereitgestellt haben, ersetzen Sie linux mit windows und 776d8f8fd8-78w66 mit dem Wert, der für einen Ihrer pods zurückgegeben wird.

    kubectl -n eks-sample-app describe pod eks-sample-linux-deployment-65b7669776-m6qxz

    Gekürzte Ausgabe

    Wenn Sie Windows-Ressourcen bereitgestellt haben, sind alle Instances von linux in der folgenden Ausgabe windows. Die anderen Beispielwerte können von Ihrer Ausgabe abweichen.

    Name: eks-sample-linux-deployment-65b7669776-m6qxz Namespace: eks-sample-app Priority: 0 Node: ip-192-168-45-132.us-west-2.compute.internal/192.168.45.132 ... IP: 192.168.63.93 IPs: IP: 192.168.63.93 Controlled By: ReplicaSet/eks-sample-linux-deployment-65b7669776 ... Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m20s default-scheduler Successfully assigned eks-sample-app/eks-sample-linux-deployment-65b7669776-m6qxz to ip-192-168-45-132.us-west-2.compute.internal ...

    In der vorherigen Ausgabe ist der Wert für IP: eine eindeutige IP-Adresse, die dem pod aus dem CIDR-Block zugewiesen wird, der dem Subnetz zugewiesen ist, in dem sich der Knoten befindet. Wenn Sie es vorziehen, pods IP-Adressen aus verschiedenen CIDR-Blöcken zuzuweisen, können Sie das Standardverhalten ändern. Weitere Informationen finden Sie unter Tutorial: Benutzerdefinierte Netzwerke. Sie können auch sehen, dass der Kubernetes-Scheduler den pod auf dem Node mit der IP-Adresse 192.168.45.132 geplant hat.

    Tipp

    Anstatt die Befehlszeile zu verwenden, können Sie viele Details zu pods, Services, Bereitstellungen und anderen Kubernetes-Ressourcen in der AWS Management Console anzeigen. Weitere Informationen finden Sie unter Anzeigen der Kubernetes-Ressourcen.

  7. Führen Sie eine Shell auf dem pod aus, die Sie im vorherigen Schritt beschrieben haben, und ersetzen Sie 65b7669776-m6qxz mit der ID eines Ihrer pods.

    Linux
    kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
    Windows
    kubectl exec -it eks-sample-windows-deployment-65b7669776-m6qxz -n eks-sample-app -- powershell.exe
  8. Zeigen Sie in der pod-Shell die Ausgabe des Webservers an, der in einem vorherigen Schritt mit Ihrer Bereitstellung installiert wurde. Sie müssen nur den Servicenamen angeben. Er wird von CoreDNS, das mit einem Amazon-EKS-Cluster bereitgestellt wird, standardmäßig als IP-Adresse des Services aufgelöst.

    Linux
    curl eks-sample-linux-service

    Die Beispielausgabe lautet wie folgt.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
    Windows
    Invoke-WebRequest -uri eks-sample-windows-service/default.html -UseBasicParsing

    Die Beispielausgabe lautet wie folgt.

    StatusCode : 200 StatusDescription : OK Content : < h t m l > < b o d y > < b r / > < b r / > < m a r q u e e > < H 1 > H e l l o E K S ! ! ! < H 1 > < m a r q u e e > < / b o d y > < h t m l >
  9. Zeigen Sie in der pod-Shell den DNS-Server für den pod an.

    Linux
    cat /etc/resolv.conf

    Die Beispielausgabe lautet wie folgt.

    nameserver 10.100.0.10 search eks-sample-app.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal options ndots:5

    In der vorherigen Ausgabe wird 10.100.0.10 automatisch als nameserver für alle pods zugewiesen, die im Cluster bereitgestellt werden.

    Windows
    Get-NetIPConfiguration

    Gekürzte Ausgabe

    InterfaceAlias : vEthernet ... IPv4Address : 192.168.63.14 ... DNSServer : 10.100.0.10

    In der vorherigen Ausgabe wird 10.100.0.10 automatisch als DNS-Server für alle pods zugewiesen, die im Cluster bereitgestellt werden.

  10. Trennen Sie die Verbindung mit dem pod, indem Sie exit eingeben.

  11. Wenn Sie die Beispielanwendung nicht mehr benötigen, können Sie den Beispiel-Namespace, den Service und die Bereitstellung mit dem folgenden Befehl entfernen.

    kubectl delete namespace eks-sample-app