Unterstützung für die Verbesserung dieser Seite beitragen
Um zu diesem Benutzerhandbuch beizutragen, klicken Sie auf den Link Diese Seite auf GitHub bearbeiten, der sich im rechten Bereich jeder Seite befindet.
Eine Beispielanwendung in Linux bereitstellen
In diesem Thema stellen Sie eine Beispielanwendung auf Ihrem Cluster in Linux-Knoten bereit.
Voraussetzungen
-
Ein vorhandener Kubernetes-Cluster mit mindestens einem Knoten. Wenn Sie noch keinen vorhandenen Amazon-EKS-Cluster haben, können Sie einen mit einem der Anleitungen in Erste Schritte mit Amazon EKS bereitstellen.
-
Kubectlauf Ihrem Computer installiert. Weitere Informationen finden Sie unter kubectl und eksctl einrichten. -
Kubectlfür die Kommunikation mit Ihrem Cluster konfiguriert. Weitere Informationen finden Sie unter kubectl mit einem EKS-Cluster durch Erstellen einer kubeconfig-Datei verbinden. -
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 Cluster mit einer der Anleitungen in Erste Schritte mit Amazon EKS erstellt haben, müssen Sie ein neues Profil erstellen oder den Namespace zu Ihrem vorhandenen. Profil hinzufügen. Das in den Anleitungen für den Einstieg erstellte Profil gibt den in diesem Tutorial verwendeten Namespace nicht an. Ihre VPC muss auch über mindestens ein privates Subnetz verfügen.
Obwohl viele Variablen in den folgenden Schritten veränderbar sind, empfehlen wir, Variablenwerte nur zu ändern, wo angegeben. Sobald Sie Kubernetes-Pods, Bereitstellungen und Services besser verstanden haben, können Sie mit dem Ändern anderer Werte experimentieren.
Namespaces erstellen
Ein Namespace ermöglicht es Ihnen, Ressourcen in Kubernetes zu gruppieren. Weitere Informationen finden Sie unter Namespacesnamespace in Ihrer Definition, welche Pods beim Start AWS Fargate verwenden, eks-sample-app ist.
kubectl create namespace eks-sample-app
Erstellen Sie eine Kubernetes-Bereitstellung.
Erstellen Sie eine Kubernetes-Bereitstellung. Diese Beispiel-Bereitstellung 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
-
Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen
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 Verwendung von Anwendungsdatenspeichern für Ihren Cluster.-
Das
amd64oderarm64valuesunter dem Schlüsselkubernetes.io/archbedeutet, 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 Hardware-Architektur bestimmen, auf der das Image unterstützt wird, indem Sie die Image-Detailsim Repository anzeigen, aus dem Sie es abrufen. Wenn Sie Images bereitstellen, die keinen Hardware-Architektur-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: linuxnodeSelectorbedeutet, dass, wenn Sie beispielsweise Windows- und Linux-Knoten in Ihrem Cluster hätten, das Image nur auf Linux-Knoten bereitgestellt würde. Weitere Informationen finden Sie unter Bekannte Labels, Anmerkungen und Taintsin 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.23 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent nodeSelector: kubernetes.io/os: linux
-
-
Wenden Sie das Bereitstellungs-Manifest auf Ihren Cluster an.
kubectl apply -f eks-sample-deployment.yaml
Erstellen eines Services
Mit einem Service können Sie über eine einzige IP-Adresse oder einen einzigen Namen auf alle Replikate zugreifen. Weitere Informationen dazu finden Sie unter Service
-
Speichern Sie die folgenden Inhalte in einer Datei namens
eks-sample-service.yaml. Kubernetes weist dem Service 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 bereit, um den Anwendungs- oder Netzwerk-Datenverkehr an den Service auszugleichen.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 -
Wenden Sie das Service-Manifest auf Ihren Cluster an.
kubectl apply -f eks-sample-service.yaml
Erstellte Ressourcen überprüfen
-
Zeigen Sie alle im
eks-sample-app-Namespace vorhandenen Ressourcen an.kubectl get all -n eks-sample-appEine Beispielausgabe sieht wie folgt aus.
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 27mIn der Ausgabe sehen Sie den Service und die Bereitstellung, die in den Beispielmanifesten, der vorherigen Schritte, angegeben wurden. Sie sehen auch drei Pods. Dies liegt daran, dass
3replicasim Beispielmanifest angegeben wurden. Weitere Informationen zu Pods finden Sie unter Podsin der Kubernetes-Dokumentation. Kubernetes erstellt automatisch die replicaset-Ressource, obwohl sie nicht in den Beispiel-Manifesten angegeben ist. Weitere Informationen zuReplicaSetsfinden Sie unter ReplicaSetin 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 die Optionen Pod-Bereitstellungen mit horizontalem Pod-Autoscaler skalieren und Pod-Ressourcen mit vertikalem Pod-Autoscaler anpassen.
-
Zeigen Sie die Details des bereitgestellten Services an.
kubectl -n eks-sample-app describe service eks-sample-linux-serviceEine Beispielausgabe sieht wie folgt aus.
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ürEndpointssind IP-Adressen, die innerhalb Ihrer VPC den Pods zugewiesen werden, die Teil des Services sind. -
Zeigen Sie die Details eines der in der Ausgabe aufgeführten Pods an, wenn Sie in einem vorherigen Schritt den Namespace angezeigt haben. Ersetzen Sie
776d8f8fd8-78w66durch den für einen Ihrer Pods zurückgegebenen Wert.kubectl -n eks-sample-app describe pod eks-sample-linux-deployment-65b7669776-m6qxzGekürzte Beispielausgabe
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, 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 Bereitstellung von Pods in alternativen Subnetzen mit benutzerdefiniertem Netzwerk. Sie können auch sehen, dass der Kubernetes-Scheduler den Pod inNodemit der IP-Adresse192.168.45.132geplant hat.Tipp
Anstatt die Befehlszeile zu verwenden, können Sie viele Details zu Pods, Services, Bereitstellungen und anderen Kubernetes-Ressourcen in der AWS-Managementkonsole anzeigen. Weitere Informationen finden Sie unter Kubernetes-Ressourcen in AWS-Managementkonsole anzeigen.
Shell in einem Pod ausführen
-
Führen Sie eine Shell auf dem Pod aus, die Sie im vorherigen Schritt beschrieben haben, und ersetzen Sie
65b7669776-m6qxzmit der ID eines Ihrer Pods.kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash -
Zeigen Sie in der Pod-Shell die Ausgabe des Web-Servers 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 in die IP-Adresse des Services aufgelöst.
curl eks-sample-linux-serviceEine Beispielausgabe sieht wie folgt aus.
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...] -
Zeigen Sie in der Pod-Shell den DNS-Server für den Pod an.
cat /etc/resolv.confEine Beispielausgabe sieht wie folgt aus.
nameserver 10.100.0.10 search eks-sample-app.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal options ndots:5In der vorherigen Ausgabe wird
10.100.0.10automatisch alsnameserverfür alle Pods zugewiesen, die im Cluster bereitgestellt werden. -
Trennen Sie die Verbindung mit dem Pod, indem Sie
exiteingeben. -
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
Nächste Schritte
Nachdem Sie die Beispielanwendung bereitgestellt haben, können Sie einige der folgenden Übungen ausprobieren: