サンプルアプリケーションをデプロイする - Amazon EKS

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

このトピックでは、サンプルアプリケーションをクラスターにデプロイします。

前提条件
  • 既存の少なくとも 1 つのノードがある Kubernetes クラスター。既存の Amazon EKS クラスターがない場合は、Amazon EKS の使用開始 のガイドの 1 つを使用して Amazon EKS クラスターをデプロイできます。Windows アプリケーションをデプロイする場合は、クラスターと少なくとも 1 つの Amazon EC2 Windows ノードで Windows サポート を有効にする必要があります。

  • コンピュータに Kubectl がインストールされている。詳細については、「kubectl のインストールまたは更新」を参照してください。

  • クラスターと通信できるように Kubectl が設定されている。詳細については、「Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」を参照してください。

  • サンプルワークロードを Fargate にデプロイする予定の場合は、名前を変更しない限り、このチュートリアルで作成したのと同じ名前空間 eks-sample-app を含む既存の Fargate プロファイルが必要です。入門ガイドのいずれかを使用してクラスターを作成した場合は、新しいプロファイルを作成するか、既存のプロファイルに名前空間を追加する必要があります。これは、入門ガイドで作成されたプロファイルでは、このチュートリアルで使用される名前空間が指定されていないためです。VPC には、少なくとも 1 つのプライベートサブネットも必要です。

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

多くの変数は次のステップで変更できますが、変数値は、指定された場合のみ変更することをお勧めします。KubernetesPods、デプロイ、およびサービスについて理解を深めたら、他の値を変更して試すことができます。

  1. 名前空間を作成します。名前空間を使用すると、Kubernetes 内のリソースをグループ化できます。詳細については、「Kubernetes ドキュメント」の「名前空間」を参照してください。サンプルアプリケーションを AWS Fargate にデプロイする予定の場合、AWS Fargate プロファイル 内の namespace の値が eks-sample-app であることを確認します。

    kubectl create namespace eks-sample-app
  2. Kubernetes デプロイを作成する。このサンプルのデプロイでは、パブリックリポジトリからコンテナイメージをプルし、その 3 つのレプリカ (個別の Pods) をクラスターにデプロイします。詳細については、「Kubernetes ドキュメント」の「デプロイ」を参照してください。アプリケーションを Linux ノードまたは Windows ノードにデプロイできます。Fargate にデプロイする場合は、Linux アプリケーションのみデプロイできます。

    1. 次の内容を eks-sample-deployment.yaml という名前のファイルに保存します。サンプルアプリケーションのコンテナではネットワークストレージを使用しませんが、それを使用する必要があるアプリケーションが存在する場合があります。詳細については、「ストレージ」を参照してください。

      Linux

      kubernetes.io/arch キーの下の amd64 または arm64 values は、アプリケーションをいずれかのハードウェアアーキテクチャにデプロイできることを意味します (クラスター内に両方がある場合)。これは、このイメージがマルチアーキテクチャイメージであるため可能ですが、すべてがそうであるわけではありません。イメージを取得するリポジトリ内のイメージの詳細を表示することで、イメージがサポートされているハードウェアアーキテクチャを判別できます。ハードウェアアーキテクチャのタイプをサポートしないイメージをデプロイする場合、またはイメージをデプロイしない場合は、そのタイプをマニフェストから削除します。詳細については、「Kubernetes ドキュメント」の「よく知られているラベル、注釈、テイント」を参照してください。

      kubernetes.io/os: linux nodeSelector は、クラスターに、例えば、Linux ノードと Windows ノードがある場合、イメージは Linux ノードにのみデプロイされることを意味します。詳細については、「Kubernetes ドキュメント」の「よく知られているラベル、注釈、テイント」を参照してください。

      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
      Windows

      kubernetes.io/os: windows nodeSelector は、クラスターに、例えば、Windows ノードと Linux ノードがある場合、イメージは Windows ノードにのみデプロイされることを意味します。詳細については、「Kubernetes ドキュメント」の「よく知られているラベル、注釈、テイント」を参照してください。

      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. デプロイマニフェストをクラスターに適用します。

      kubectl apply -f eks-sample-deployment.yaml
  3. サービスを作成します。サービスを利用すると、単一の IP アドレスまたは名前を使用して、すべてのレプリカにアクセスできます。詳細については、「Kubernetes ドキュメント」の「サービス」を参照してください。サンプルアプリケーションには実装されていませんが、他の AWS サービスと対話する必要があるアプリケーションがある場合、Pods の Kubernetes サービスアカウントを作成し、AWS IAM アカウントに関連付けることをお勧めします。サービスアカウントを指定すると、Pods には、他のサービスとのやり取りのために指定した最小限のアクセス許可だけが与えられます。詳細については、「サービスアカウントの IAM ロール」を参照してください。

    1. 次の内容を eks-sample-service.yaml という名前のファイルに保存します。Kubernetes は、クラスター内からのみアクセスできる独自の IP アドレスをサービスに割り当てます。クラスターの外部からサービスにアクセスするには、AWS Load Balancer Controller をデプロイして、サービスに対してアプリケーションネットワークトラフィックの負荷分散を行います。

      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. サービスマニフェストをクラスターに適用します。

      kubectl apply -f eks-sample-service.yaml
  4. eks-sample-app 名前空間内に存在するすべてのリソースを表示します。

    kubectl get all -n eks-sample-app

    出力例は次のとおりです。

    Windows リソースをデプロイした場合は、次の出力の linux のすべてのインスタンスは windows です。他の 値の例 は、実際の出力とは異なる場合があります。

    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

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

    注記

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

  5. デプロイされたサービスの詳細を表示します。Windows サービスをデプロイした場合は、linuxwindows で置き換えます。

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

    出力例は次のとおりです。

    Windows リソースをデプロイした場合は、次の出力の linux のすべてのインスタンスは windows です。他の 値の例 は、実際の出力とは異なる場合があります。

    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>

    前の出力では、IP: の値は、クラスター内のどのノードまたは Pod からもアクセスできる一意の IP アドレスですが、クラスターの外からはアクセスできません。Endpoints の値は、VPC 内からサービスの一部である Pods に割り当てられる IP アドレスです。

  6. 前のステップで 名前空間を表示 したときに、出力にリストされた Pods のうち、1 つの詳細を表示します。Windows アプリケーションをデプロイした場合は、linuxwindows に置き換え、776d8f8fd8-78w66 をいずれかの Pods に対して返された値に置き換えます。

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

    省略された出力

    Windows リソースをデプロイした場合は、次の出力の linux のすべてのインスタンスは windows です。他のexample values は、実際の出力とは異なる場合があります。

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

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

    ヒント

    コマンドラインを使用する代わりに、Pods、サービス、デプロイ、その他の Kubernetes リソースに関する多くの詳細を AWS Management Console に表示できます。詳細については、「Kubernetes リソースを表示する」を参照してください。

  7. 前の手順で説明した Pod でシェルを実行し、65b7669776-m6qxz をいずれかの Pods の ID に置き換えます。

    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. Pod シェルから、前のステップでデプロイと共にインストールされたウェブサーバーからの出力を表示します。サービス名のみ指定する必要があります。デフォルトでは、Amazon EKS クラスターとともにデプロイされる CoreDNS によって、サービスの IP アドレスに解決されます。

    Linux
    curl eks-sample-linux-service

    出力例は次のとおりです。

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

    出力例は次のとおりです。

    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. Pod シェルから、Pod の DNS サーバーを表示します。

    Linux
    cat /etc/resolv.conf

    出力例は次のとおりです。

    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

    前の出力では、クラスターにデプロイされたすべての Pods に対して、10.100.0.10nameserver として自動的に割り当てられます。

    Windows
    Get-NetIPConfiguration

    省略された出力

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

    前の出力では、クラスターにデプロイされたすべての Pods に対して、10.100.0.10 が DNS サーバーとして自動的に割り当てられます。

  10. exit を入力して、Pod の接続を切断します。

  11. サンプルアプリケーションの使用が終了したら、次のコマンドを使用して、サンプルの名前空間、サービス、デプロイを削除できます。

    kubectl delete namespace eks-sample-app

次のステップ

サンプルアプリケーションをデプロイしたら、次の演習の一部を試すことができます。