Erste Schritte mit AWS Batch auf privaten Amazon-EKS-Clustern - AWS Batch

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erste Schritte mit AWS Batch auf privaten Amazon-EKS-Clustern

AWS Batch ist ein verwalteter Service, der Batch-Workloads in Ihren Amazon Elastic Kubernetes Service (Amazon EKS)-Clustern orchestriert. Dazu gehören Warteschlangen, Abhängigkeitsnachverfolgung, verwaltete Auftragswiederholungen und -prioritäten, Pod-Verwaltung und Knotenskalierung. Diese Funktion verbindet Ihren vorhandenen privaten Amazon-EKS-Cluster mit AWS Batch , um Ihre Aufträge in großem Umfang auszuführen. Sie können eksctl (eine Befehlszeilenschnittstelle für Amazon EKS), die - AWS Konsole oder die verwenden, AWS Command Line Interface um einen privaten Amazon-EKS-Cluster mit allen anderen erforderlichen Ressourcen zu erstellen. Unterstützung für private Amazon-EKS-Cluster auf AWS Batch ist allgemein in kommerziellen verfügbar AWS-Regionen , in denen AWS Batch verfügbar ist.

Nur private Amazon-EKS-Cluster haben keinen eingehenden/ausgehenden Internetzugang und verfügen nur über private Subnetze. Amazon-VPC-Endpunkte werden verwendet, um privaten Zugriff auf andere AWS -Services zu ermöglichen. eksctl unterstützt das Erstellen vollständig privater Cluster mit einer bereits vorhandenen Amazon VPC und Subnetzen. erstellt eksctl auch Amazon-VPC-Endpunkte in der bereitgestellten Amazon VPC und ändert Routing-Tabellen für die bereitgestellten Subnetze.

Jedem Subnetz sollte eine explizite Routing-Tabelle zugeordnet sein, da die Haupt-Routing-Tabelle eksctl nicht ändert. Ihr Cluster muss Images aus einer Container-Registry abrufen, die sich in Ihrer Amazon VPC befindet. Außerdem können Sie eine Amazon Elastic Container Registry in Ihrer Amazon VPC erstellen und Container-Images dorthin kopieren, damit Ihre Knoten daraus abrufen können. Weitere Informationen finden Sie unter Kopieren eines Container-Images aus einem Repository in ein anderes Repository. Informationen zu den ersten Schritten mit privaten Amazon-ECR-Repositorys finden Sie unter Private Amazon-ECR-Repositorys.

Sie können optional eine Pull-Through-Cache-Regel mit Amazon ECR erstellen. Sobald eine Pull-Through-Cache-Regel für eine externe öffentliche Registrierung erstellt wurde, können Sie ein Image aus dieser externen öffentlichen Registrierung mit Ihrem privaten Amazon-ECR-Registrierungs-Uriform-Ressourcenidetifier (URI) abrufen. Dann erstellt Amazon ECR ein Repository und speichert das Image im Cache. Wenn ein zwischengespeichertes Image mit dem URI der privaten Registrierung von Amazon ECR abgerufen wird, überprüft Amazon ECR die Remote-Registrierung, um festzustellen, ob eine neue Version des Images vorhanden ist, und aktualisiert Ihre private Registrierung bis zu einmal alle 24 Stunden.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, müssen Sie die folgenden Tools und Ressourcen installieren und konfigurieren, die Sie zum Erstellen und Verwalten von AWS Batch und Amazon-EKS-Ressourcen benötigen. Sie müssen auch alle erforderlichen Ressourcen erstellen, einschließlich VPC, Subnetze, Routing-Tabellen, VPC-Endpunkte und Amazon-EKS-Cluster. Sie müssen die verwenden AWS CLI.

  • AWS CLI – Ein Befehlszeilen-Tool für die Arbeit mit - AWS Services, einschließlich Amazon EKS. Dieses Handbuch erfordert, dass Sie Version 2.8.6 oder höher oder 1.26.0 oder höher verwenden. Weitere Informationen finden Sie unter Installieren, Aktualisieren und Deinstallieren der AWS CLI im AWS Command Line Interface -Benutzerhandbuch.

    Nach der Installation der empfehlen wir AWS CLI Ihnen, sie zu konfigurieren. Weitere Informationen finden Sie unter Schnellkonfiguration mit aws configure im AWS Command Line Interface -Benutzerhandbuch.

  • kubectl – Ein Befehlszeilen-Tool für die Arbeit mit Kubernetes Clustern. Dieses Handbuch erfordert, dass Sie Version 1.23 oder höher verwenden. Weitere Informationen finden Sie unter Installieren oder Aktualisieren von kubectl im Amazon-EKS-Benutzerhandbuch.

  • eksctl – Ein Befehlszeilen-Tool für die Arbeit mit Amazon-EKS-Clustern, das viele einzelne Aufgaben automatisiert. Dieses Handbuch erfordert, dass Sie Version 0.115.0 oder höher verwenden. Weitere Informationen finden Sie unter Installieren oder Aktualisieren von eksctl im Amazon-EKS-Benutzerhandbuch.

  • Erforderliche AWS Identity and Access Management (IAM)-Berechtigungen – Der von Ihnen verwendete IAM-Sicherheitsprinzipal muss über Berechtigungen zum Arbeiten mit Amazon-EKS-IAM-Rollen und serviceverknüpften Rollen AWS CloudFormation sowie einer VPC und zugehörigen Ressourcen verfügen. Weitere Informationen finden Sie unter Aktionen, Ressourcen und Bedingungsschlüssel für Amazon Elastic Kubernetes Service und Verwenden von serviceverknüpften Rollen im IAM-Benutzerhandbuch. Sie müssen alle Schritte in diesem Handbuch als derselbe Benutzer ausführen.

  • Erstellen eines Amazon-EKS-Clusters – Weitere Informationen finden Sie unter Erste Schritte mit Amazon EKS – eksctl im Amazon-EKS-Benutzerhandbuch.

    Anmerkung

    AWS Batch bietet keine Orchestrierung für verwaltete Knoten für CoreDNS oder andere Bereitstellungs-Pods. Wenn Sie CoreDNS benötigen, finden Sie weitere Informationen unter Hinzufügen des CoreDNS-Amazon-EKS-Add-ons im Amazon-EKS-Benutzerhandbuch. Oder verwenden Sie , eksctl create cluster create um den Cluster zu erstellen, er enthält standardmäßig CoreDNS.

  • Berechtigungen – Benutzer, die den CreateComputeEnvironment -API-Vorgang aufrufen, um eine Datenverarbeitungsumgebung zu erstellen, die Amazon-EKS-Ressourcen verwendet, benötigen Berechtigungen für den eks:DescribeCluster-API-Vorgang. Die Verwendung der AWS Management Console zum Erstellen einer Rechenressource mit Amazon-EKS-Ressourcen erfordert Berechtigungen für eks:DescribeCluster und eks:ListClusters.

  • Erstellen Sie mithilfe der eksctl Beispielkonfigurationsdatei einen privaten EKS-Cluster in der Region us-east-1.

    kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 availabilityZones: - us-east-1a - us-east-1b - us-east-1d managedNodeGroups: privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false

    Erstellen Sie Ihre -Ressourcen mit dem -Befehl: eksctl create cluster -f clusterConfig.yaml

  • Batchverwaltete Knoten müssen in Subnetzen bereitgestellt werden, die über die von Ihnen benötigten VPC-Schnittstellenendpunkte verfügen. Weitere Informationen finden Sie unter Anforderungen an private Cluster.

Schritt 1: Vorbereiten Ihres EKS-Clusters für AWS Batch

Alle Schritte sind erforderlich.

  1. Erstellen eines dedizierten Namespace für AWS Batch Aufträge

    Verwenden Sie kubectl, um einen neuen Namespace zu erstellen.

    $ namespace=my-aws-batch-namespace $ cat - <<EOF | kubectl create -f - { "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "${namespace}", "labels": { "name": "${namespace}" } } } EOF

    Ausgabe:

    namespace/my-aws-batch-namespace created
  2. Aktivieren des Zugriffs über die rollenbasierte Zugriffskontrolle (RBAC)

    Verwenden Sie kubectl, um eine Kubernetes Rolle für den Cluster zu erstellen, damit Knoten und Pods AWS Batch überwachen und die Rolle binden kann. Sie müssen dies einmal für jeden Amazon-EKS-Cluster tun.

    Anmerkung

    Weitere Informationen zur Verwendung der RBAC-Autorisierung finden Sie unter Verwenden der RBAC-Autorisierung in der Kubernetes -Dokumentation.

    $ cat - <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: aws-batch-cluster-role rules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["daemonsets", "deployments", "statefulsets", "replicasets"] verbs: ["get", "list", "watch"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles", "clusterrolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: aws-batch-cluster-role-binding subjects: - kind: User name: aws-batch apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: aws-batch-cluster-role apiGroup: rbac.authorization.k8s.io EOF

    Ausgabe:

    clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created

    Erstellen Sie eine Rolle im Namespace-Bereich Kubernetes für , AWS Batch um Pods zu verwalten und zu Lebenszyklus-Pods zu binden. Sie müssen dies einmal für jeden eindeutigen Namespace tun.

    $ namespace=my-aws-batch-namespace $ cat - <<EOF | kubectl apply -f - --namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: aws-batch-compute-environment-role namespace: ${namespace} rules: - apiGroups: [""] resources: ["pods"] verbs: ["create", "get", "list", "watch", "delete", "patch"] - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get", "list"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: aws-batch-compute-environment-role-binding namespace: ${namespace} subjects: - kind: User name: aws-batch apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: aws-batch-compute-environment-role apiGroup: rbac.authorization.k8s.io EOF

    Ausgabe:

    role.rbac.authorization.k8s.io/aws-batch-compute-environment-role created rolebinding.rbac.authorization.k8s.io/aws-batch-compute-environment-role-binding created

    Aktualisieren Sie die Kubernetes aws-auth Konfigurationszuordnung, um die vorherigen RBAC-Berechtigungen der AWS Batch serviceverknüpften Rolle zuzuordnen.

    $ eksctl create iamidentitymapping \ --cluster my-cluster-name \ --arn "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" \ --username aws-batch

    Ausgabe:

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" to auth ConfigMap
    Anmerkung

    Der Pfad aws-service-role/batch.amazonaws.com/ wurde aus dem ARN der serviceverknüpften Rolle entfernt. Dies liegt an einem Problem mit der aws-auth Konfigurationszuordnung. Weitere Informationen finden Sie unter Rollen mit Pfaden funktionieren nicht, wenn der Pfad in ihrem ARN enthalten ist im aws-authconfigmap.

Schritt 2: Erstellen einer Amazon-EKS-Rechenumgebung

AWS Batch -Rechenumgebungen definieren Datenverarbeitungsressourcenparameter, um Ihre Batch-Workload-Anforderungen zu erfüllen. In einer verwalteten Datenverarbeitungsumgebung AWS Batch unterstützt Sie bei der Verwaltung der Kapazität und Instance-Typen der Datenverarbeitungsressourcen (Kubernetes-Knoten) in Ihrem Amazon-EKS-Cluster. Dies basiert auf der Spezifikation der Rechenressourcen, die Sie beim Erstellen der Rechenumgebung definieren. Sie können EC2-On-Demand-Instances oder EC2-Spot-Instances verwenden.

Nachdem die AWSServiceRoleForBatch serviceverknüpfte Rolle Zugriff auf Ihren Amazon-EKS-Cluster hat, können Sie - AWS Batch Ressourcen erstellen. Erstellen Sie zunächst eine Datenverarbeitungsumgebung, die auf Ihren Amazon-EKS-Cluster verweist.

$ cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:<region>:123456789012:cluster/<cluster-name>", "kubernetesNamespace": "my-aws-batch-namespace" }, "computeResources": { "type": "EC2", "allocationStrategy": "BEST_FIT_PROGRESSIVE", "minvCpus": 0, "maxvCpus": 128, "instanceTypes": [ "m5" ], "subnets": [ "<eks-cluster-subnets-with-access-to-the-image-for-image-pull>" ], "securityGroupIds": [ "<eks-cluster-sg>" ], "instanceRole": "<eks-instance-profile>" } } EOF $ aws batch create-compute-environment --cli-input-json file://./batch-eks-compute-environment.json
Hinweise
  • Der serviceRole Parameter sollte nicht angegeben werden, dann wird die AWS Batch serviceverknüpfte Rolle verwendet. AWS Batch auf Amazon EKS unterstützt nur die AWS Batch serviceverknüpfte Rolle.

  • Für Amazon-EKS-Rechenumgebungen werden nur BEST_FIT_PROGRESSIVE-SPOT_CAPACITY_OPTIMIZED, - und -SPOT_PRICE_CAPACITY_OPTIMIZEDZuweisungsstrategien unterstützt.

    Anmerkung

    Wir empfehlen, in den meisten SPOT_PRICE_CAPACITY_OPTIMIZED Instances anstelle von SPOT_CAPACITY_OPTIMIZEDn zu verwenden.

  • Informationen zur instanceRolefinden Sie unter Erstellen der IAM-Rolle des Amazon-EKS-Knotens und Aktivieren des IAM-Prinzipalzugriffs auf Ihren Cluster im Amazon-EKS-Benutzerhandbuch. Wenn Sie Pod-Netzwerke verwenden, finden Sie weitere Informationen unter Konfigurieren des Amazon-VPC-CNI-Plugins für Kubernetes zur Verwendung von IAM-Rollen für Servicekonten im Amazon-EKS-Benutzerhandbuch.

  • Eine Möglichkeit, funktionierende Subnetze für den -subnetsParameter zu erhalten, besteht darin, die von erstellten öffentlichen Subnetze der von Amazon EKS verwalteten Knotengruppen zu verwenden, eksctl wenn ein Amazon-EKS-Cluster erstellt wurde. Verwenden Sie andernfalls Subnetze mit einem Netzwerkpfad, der das Abrufen von Images unterstützt.

  • Der securityGroupIds Parameter kann dieselbe Sicherheitsgruppe wie der Amazon-EKS-Cluster verwenden. Dieser Befehl ruft die Sicherheitsgruppen-ID für den Cluster ab.

    $ eks describe-cluster \ --name <cluster-name> \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • Die Wartung einer Amazon-EKS-Rechenumgebung ist eine übergreifende Verantwortlichkeit. Weitere Informationen finden Sie unter Sicherheit in Amazon EKS.

Wichtig

Es ist wichtig zu bestätigen, dass die Datenverarbeitungsumgebung fehlerfrei ist, bevor Sie fortfahren. Dazu kann der DescribeComputeEnvironments API-Vorgang verwendet werden.

$ aws batch describe-compute-environments --compute-environments My-Eks-CE1

Vergewissern Sie sich, dass der status Parameter nicht istINVALID. Wenn dies der Fall ist, sehen Sie sich den statusReason Parameter für die Ursache an. Weitere Informationen finden Sie unter Problembehebung AWS Batch.

Schritt 3: Erstellen einer Auftragswarteschlange und Anfügen der Datenverarbeitungsumgebung

$ aws batch describe-compute-environments --compute-environments My-Eks-CE1

Aufträge, die an diese neue Auftragswarteschlange gesendet werden, werden als Pods auf AWS Batch verwalteten Knoten ausgeführt, die dem Amazon-EKS-Cluster beigetreten sind, der Ihrer Datenverarbeitungsumgebung zugeordnet ist.

$ cat <<EOF > ./batch-eks-job-queue.json { "jobQueueName": "My-Eks-JQ1", "priority": 10, "computeEnvironmentOrder": [ { "order": 1, "computeEnvironment": "My-Eks-CE1" } ] } EOF $ aws batch create-job-queue --cli-input-json file://./batch-eks-job-queue.json

Schritt 4: Erstellen einer Auftragsdefinition

Anstatt einen Link zum Image in einem öffentlichen ECR-Repository bereitzustellen, geben Sie im Image-Feld der Auftragsdefinition den Link zu dem in unserem privaten ECR-Repository gespeicherten Image an. Sehen Sie sich die folgende Beispielauftragsdefinition an:

$ cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "account-id.dkr.ecr.region.amazonaws.com/amazonlinux:2", "command": [ "sleep", "60" ], "resources": { "limits": { "cpu": "1", "memory": "1024Mi" } } } ], "metadata": { "labels": { "environment": "test" } } } } } EOF $ aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json

Um kubectl-Befehle auszuführen, benötigen Sie privaten Zugriff auf Ihren Amazon-EKS-Cluster. Dies bedeutet, dass der gesamte Datenverkehr zu Ihrem Cluster-API-Server aus der VPC Ihres Clusters oder einem verbundenen Netzwerk stammen muss.

Schritt 5: Senden eines Auftrags

$ aws batch submit-job - -job-queue My-Eks-JQ1 \ - -job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1 $ aws batch describe-jobs - -job <jobId-from-submit-response>
Hinweise

(Optional) Senden eines Auftrags mit Überschreibungen

Dieser Auftrag überschreibt den an den Container übergebenen Befehl.

$ cat <<EOF > ./submit-job-override.json { "jobName": "EksWithOverrides", "jobQueue": "My-Eks-JQ1", "jobDefinition": "MyJobOnEks_Sleep", "eksPropertiesOverride": { "podProperties": { "containers": [ { "command": [ "/bin/sh" ], "args": [ "-c", "echo hello world" ] } ] } } } EOF $ aws batch submit-job - -cli-input-json file://./submit-job-override.json
Hinweise

Fehlerbehebung

Wenn Knoten AWS Batch , die von gestartet werden, keinen Zugriff auf das Amazon-ECR-Repository (oder ein anderes Repository) haben, das Ihr Image speichert, können Ihre Aufträge im STARTING-Status verbleiben. Dies liegt daran, dass der Pod das Image nicht herunterladen und Ihren AWS Batch Auftrag ausführen kann. Wenn Sie auf den von gestarteten Pod-Namen klicken, sollten AWS Batch Sie die Fehlermeldung sehen und das Problem bestätigen können. Die Fehlermeldung sollte in etwa wie folgt aussehen:

Failed to pull image "public.ecr.aws/amazonlinux/amazonlinux:2": rpc error: code = Unknown desc = failed to pull and unpack image "public.ecr.aws/amazonlinux/amazonlinux:2": failed to resolve reference "public.ecr.aws/amazonlinux/amazonlinux:2": failed to do request: Head "https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/2": dial tcp: i/o timeout

Weitere gängige Problembehandlungsszenarien finden Sie unter Problembehandlung. AWS Batch Informationen zur Fehlerbehebung auf der Grundlage des Pod-Status finden Sie unter Wie behebe ich Probleme mit dem Pod-Status in Amazon EKS?.