サンプルの Linux ワークロードをデプロイする - Amazon EKS

サンプルの Linux ワークロードをデプロイする

このトピックでは、Kubernetes マニフェストを作成し、クラスターにデプロイします。

Prerequisites

  • サンプルアプリケーションをデプロイするには、既存の Kubernetes クラスターが必要です。既存のクラスターがない場合は、Amazon EKS の使用開始 のガイドに従って Amazon EKS クラスターをデプロイできます。

  • コンピュータに kubectl がインストールされている必要があります。詳細については、「」を参照してくださいkubectl のインストール

  • クラスターと通信できるように kubectl を設定する必要があります。詳細については、「」を参照してくださいAmazon EKS の kubeconfig を作成する

サンプルアプリケーションをデプロイするには

  1. サンプリアプリケーション用に、Kubernetes 名前空間を作成します。

    kubectl create namespace <my-namespace>
  2. Kubernetes サービスとデプロイメントを作成します。

    1. 次の内容をコンピュータ上の sample-service.yaml という名前のファイルに保存します。AWS Fargate ポッドをデプロイするには、namespace の値が AWS Fargate プロファイル で定義した名前空間と一致することを確認します。このサンプルのデプロイメントでは、パブリックリポジトリからコンテナイメージをプルし、コンテナイメージの 3 つのレプリカをクラスターにデプロイします。クラスター内からのみアクセスできる独自の IP アドレスで Kubernetes サービスを作成します。クラスターの外部からサービスにアクセスするには、ネットワークロードバランサーまたは ALB Ingress Controller をデプロイする必要があります。

      イメージはマルチアーキテクチャであるため、クラスターに x86 ノードと Arm ノードの両方が含まれている場合、どちらのタイプのハードウェアアーキテクチャでもポッドをスケジュールできます。Kubernetes は、ポッドをスケジュールするノードのハードウェアタイプに基づいて、適切なハードウェアイメージをデプロイします。また、特定のハードウェアアーキテクチャでノードを実行するためだけにデプロイを行う場合、またはクラスターにハードウェアアーキテクチャが 1 つしか含まれていない場合は、次の例から amd64 または arm64 を削除します。

      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

      Kubernetes のサービスデプロイの詳細については、Kubernetes ドキュメントを参照してください。サンプルマニフェストのコンテナではネットワークストレージを使用しませんが、使用できる場合があります。詳細については、「」を参照してくださいStorage この例では実装されていませんが、ポッド用の Kubernetes サービスアカウントを作成し、AWS IAM アカウントと連携することをお勧めします。サービスアカウントを指定することで、他のサービスとのやり取りに必要な最小限のアクセス許可をポッドに付与できます。詳細については、「サービスアカウントの IAM ロール」を参照してください。

    2. アプリケーションをデプロイします。

      kubectl apply -f <sample-service.yaml>
  3. my-namespace 名前空間内に存在するすべてのリソースを表示します。

    kubectl get all -n my-namespace

    出力

    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

    出力では、前の手順でデプロイしたサンプルマニフェストで指定されているサービスとデプロイメントが表示されます。また、サンプルマニフェストで replicas3 と指定するため、3 つのポッドも確認できます。詳細については、Kubernetes ドキュメントの Pods (ポッド) を参照してください。Kubernetes では、サンプルマニフェストで指定されていなくても自動的に replicaset リソースを作成できました。ReplicaSets の詳細については、Kubernetes ドキュメントの「ReplicaSet」を参照してください。

    注記

    Kubernetes では、マニフェストで指定したレプリカの数を維持できます。本稼働デプロイメントで、Kubernetes を使用してレプリカ数を水平にスケーリングしたり、ポッドのコンピュートリソースを垂直にスケーリングする場合は、Horizontal Pod AutoscalerVertical Pod Autoscaler を使用する必要があります。

  4. デプロイされたサービスの詳細を表示します。

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

    省略された出力

    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 ...

    出力では、IP: の値は、クラスター内のどのポッドからもアクセスできる一意の IP アドレスです。

  5. デプロイされたポッドのうち 1 つの詳細を表示します。

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

    省略された出力

    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 ...

    出力では、IP: の値は CIDR ブロックがポッドに割り当てる一意の IP です。CIDR ブロックは、デフォルトではノードが存在するサブネットに割り当てられています。ノードが存在するサブネットとは異なる CIDR ブロックからの IP アドレスをポッドに割り当てたい場合は、デフォルトの動作を変更できます。詳細については、「」を参照してくださいCNI カスタムネットワーク また、Kubernetes スケジューラが IP アドレス 192.168.9.36 を使用してノード上のポッドをスケジュールしたことを確認できます。

  6. <value> 以下の値をステップ 3 でポッドの 1 つに対して返された値に置き換えて、いずれかのポッドでシェルを実行します。

    kubectl exec -it <my-deployment-776d8f8fd8-78w66> -n <my-namespace> -- /bin/bash
  7. DNS リゾルバーの設定ファイルを表示します。

    cat /etc/resolv.conf

    出力

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

    前の出力では、nameserver の値はクラスターのネームサーバーであり、クラスターにデプロイされたあらゆるポッドのネームサーバーとして自動的に割り当てられます。

  8. exit を入力して、ポッドの接続を切断します。

  9. サンプルのサービス、デプロイメント、ポッド、名前空間を削除します。

    kubectl delete namespace <my-namespace>