Amazon EKS Auto Mode を有効化する際に NGINX Ingress Controller を移行する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon EKS Auto Mode を有効化する際に NGINX Ingress Controller を移行する

Amazon Web Services、Olawale Olaleye、Shamanth Devagari

概要

Amazon Elastic Kubernetes Service (Amazon EKS) の EKS Auto Mode を使用すると、Kubernetes クラスターでワークロードを実行する際の運用オーバーヘッドを削減できます。このモードでは AWS 、 がユーザーに代わってインフラストラクチャを設定および管理することもできます。既存のクラスターで EKS Auto Mode を有効にする場合は、NGINX Ingress Controller の設定移行を慎重に実施する必要があります。Network Load Balancer の直接転送は不可となっているためです。

既存の Amazon EKS クラスターで EKS Auto Mode を有効にすると、ブルー/グリーンデプロイを用いて NGINX Ingress Controller インスタンスを移行できます。

前提条件と制限

前提条件

アーキテクチャ

ブルー/グリーンデプロイとは、構成が同一である 2 つの環境を別々に構築するデプロイメント戦略です。ブルー/グリーンデプロイではリリースのためのダウンタイムがほとんどなく、ロールバックが可能になります。異なるアプリケーションバージョンを実行している 2 つの同一環境間で、トラフィックを移行することを主な目的としています。

次の図は、EKS Auto Mode を有効にする際の 2 つの異なる NGINX Ingress Controller インスタンスからの Network Load Balancer の移行を示しています。ブルー/グリーンデプロイを使用して、2 つの Network Load Balancer 間でトラフィックをシフトします。

ブルー/グリーンデプロイを使用して NGINX Ingress Controller インスタンスを移行します。

オリジナルの名前空間はで示されています。EKS Auto Mode を有効にする前に、元の NGINX Ingress Controller サービスとインスタンスが実行される場所です。元のサービスとインスタンスは、Route 53 で設定された DNS 名を持つ Network Load Balancer に接続します。AWS Load Balancer Controller は、この Network Load Balancer をターゲット仮想プライベートクラウド (VPC) にデプロイします。

この図は、ブルー/グリーンデプロイの環境設定を行う以下のワークフローを示します。

  1. 別の NGINX Ingress Controller インスタンスをの名前空間にインストールして設定します。

  2. Route 53 で、新しい Network Load Balancer の DNS 名を設定します。

ツール

AWS のサービス

  • Amazon Elastic Kubernetes Service (Amazon EKS) を使用すると、独自の Kubernetes コントロールプレーンやノードをインストールまたは維持 AWS することなく、 で Kubernetes を実行できます。

  • 受信したアプリケーションまたはネットワークトラフィックを複数のターゲットに分散するには、Elastic Load Balancing を使用します。例えば、1 つまたは複数のアベイラビリティーゾーンの Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレスにトラフィックを分散できます。

  • Amazon Route 53 は、高可用性でスケーラブルな DNS ウェブサービスです。

  • Amazon Virtual Private Cloud (Amazon VPC) は、定義した仮想ネットワークに AWS リソースを起動するのに役立ちます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、 AWSのスケーラブルなインフラストラクチャを使用できるという利点があります。

その他のツール

  • Helm は、Kubernetes 用のオープンソースのパッケージマネージャです。Kubernetes クラスター上でアプリケーションをインストールおよび管理できます。

  • kubectlは、Kubernetes クラスターに対してコマンドを実行するためのコマンドラインインターフェイスです。

  • NGINX Ingress Controller は、Kubernetes アプリケーションとサービスをリクエスト処理、認証、セルフサービスのカスタムリソース、デバッグに接続します。

エピック

タスク説明必要なスキル

元の NGINX Ingress Controller インスタンスが動作していることを確認します。

次のコマンドを入力して、ingress-nginx 名前空間内のリソースが動作していることを確認します。NGINX Ingress Controller を別の名前空間にデプロイした場合は、このコマンドで名前空間名を更新します。

kubectl get all -n ingress-nginx

出力で、NGINX Ingress Controller ポッドが実行中であることを確認します。以下は、その出力例です。

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-xqn9d 0/1 Completed 0 88m pod/ingress-nginx-admission-patch-lhk4j 0/1 Completed 1 88m pod/ingress-nginx-controller-68f68f859-xrz74 1/1 Running 2 (10m ago) 72m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.100.67.255 k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80:30330/TCP,443:31462/TCP 88m service/ingress-nginx-controller-admission ClusterIP 10.100.201.176 <none> 443/TCP 88m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 88m NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-68f68f859 1 1 1 72m replicaset.apps/ingress-nginx-controller-d8c96cf68 0 0 0 88m NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 88m job.batch/ingress-nginx-admission-patch Complete 1/1 5s 88m
DevOps エンジニア
タスク説明必要なスキル

Kubernetes リソースを作成します。

次のコマンドを入力して、Kubernetes のサンプルデプロイ、サービス、イングレスを作成します。

kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
kubectl create ingress demo --class=nginx \ --rule nginxautomode.local.dev/=demo:80
DevOps エンジニア

デプロイされたリソースを確認します。

次のコマンドを入力して、デプロイ済みリソースリストを表示します。

kubectl get all,ingress

出力で、サンプル HTTPd ポッドが実行中であることを確認します。以下は、その出力例です。

NAME READY STATUS RESTARTS AGE pod/demo-7d94f8cb4f-q68wc 1/1 Running 0 59m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo ClusterIP 10.100.78.155 <none> 80/TCP 59m service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 117m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/demo 1/1 1 1 59m NAME DESIRED CURRENT READY AGE replicaset.apps/demo-7d94f8cb4f 1 1 1 59m NAME CLASS HOSTS ADDRESS PORTS AGE ingress.networking.k8s.io/demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 56m
DevOps エンジニア

サービスに到達できることを確認します。

次のコマンドを入力して、サービスが Network Load Balancer の DNS 名を介して到達可能であることを確認します。

curl -H "Host: nginxautomode.local.dev" http://k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com

予想される出力は次のようになります。

<html><body><h1>It works!</h1></body></html>
DevOps エンジニア

(オプション) DNS レコードを作成します。

  1. Creating records by using the Amazon Route 53 console (Route 53 ドキュメント)」に記載の手順に従って、設定されたドメインの DNS レコードを作成します。

  2. 次のコマンドを入力して、サービスが設定されたドメイン名を介して到達可能であることを確認します。

    curl "http://nginxautomode.local.dev/?[1-5]"

    予想される出力は次のようになります。

    <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html>
DevOps エンジニア、AWS DevOps
タスク説明必要なスキル

EKS Auto Mode を有効にします。

既存のクラスターで EKS Auto Mode モードを有効にする (Amazon EKS ドキュメント)」に記載の手順に従います。

AWS DevOps
タスク説明必要なスキル

新しい NGINX Ingress Controller インスタンスを設定します。

  1. [deploy.yaml] テンプレートをダウンロードします。

  2. 任意のエディタで [deploy.yaml] テンプレートを開きます。

  3. [kind: Namespace] セクションで、名前空間に一意の名前を入力します。例: ingress-nginx-v2

    apiVersion: v1 kind: Namespace metadata: labels: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-v2
  4. 各セクションで、[namespace] 値を新しい名前に更新します。

  5. [kind: Deployment] セクションで、次の操作を行います。

    1. [k8s.io/ingress-nginx-v2] など、[--controller-class] に一意の値を入力します。

    2. [nginx-v2] など、[--ingress-class] に一意の値を入力します。

    apiVersion: apps/v1 kind: Deployment name: ingress-nginx-controller namespace: ingress-nginx-v2 ... spec: containers: - args: - /nginx-ingress-controller - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - --election-id=ingress-nginx-leader - --controller-class=k8s.io/ingress-nginx-v2 - --ingress-class=nginx-v2
  6. [kind: IngressClass] セクションで、前のセクションで使用したものと同じ値を [--controller-class] と [--ingress-class] に入力します。

    apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.12.0 name: nginx-v2 spec: controller: k8s.io/ingress-nginx-v2
  7. 次のセクションでは、[loadBalancerClass: eks.amazonaws.com/nlb] を追加して NGINX Ingress Controller インスタンスの Network Load Balancer をプロビジョニングします。

    apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx-v2 spec: ... selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: LoadBalancer loadBalancerClass: eks.amazonaws.com/nlb
  8. [deploy.yaml] テンプレートを保存して閉じます。

DevOps エンジニア

新しい NGINX Instance Controller インスタンスをデプロイします。

次のコマンドを入力して、変更後のマニフェストを適用します。

kubectl apply -f deploy.yaml
DevOps エンジニア

デプロイが成功したことを確認します。

次のコマンドを入力して、[ingress-nginx-v2] の名前空間内のリソースが動作していることを確認します。

kubectl get all -n ingress-nginx-v2

出力で、NGINX Ingress Controller ポッドが実行中であることを確認します。以下は、その出力例です。

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-7shrj 0/1 Completed 0 24s pod/ingress-nginx-admission-patch-vkxr5 0/1 Completed 1 24s pod/ingress-nginx-controller-757bfcbc6d-4fw52 1/1 Running 0 24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.100.208.114 k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80:31469/TCP,443:30658/TCP 24s service/ingress-nginx-controller-admission ClusterIP 10.100.150.114 <none> 443/TCP 24s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 24s NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-757bfcbc6d 1 1 1 24s NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 24s job.batch/ingress-nginx-admission-patch Complete 1/1 5s 24s
DevOps エンジニア

サンプル HTTPd ワークロードに新規イングレスを作成します。

既存のサンプル HTTPd ワークロードに新規イングレスを作成するには、以下のコマンドを入力してください。

kubectl create ingress demo-new --class=nginx-v2 \ --rule nginxautomode.local.dev/=demo:80
DevOps エンジニア

新規イングレスが機能することを確認します。

次のコマンドを入力して、新規イングレスが機能することを確認してください。

curl -H "Host: nginxautomode.local.dev" k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com

予想される出力は次のようになります。

<html><body><h1>It works!</h1></body></html>
DevOps エンジニア
タスク説明必要なスキル

新しい名前空間にカットオーバーします。

  1. (オプション)「Editing records (Route 53 ドキュメント)」に記載の手順に従って、DNS レコードを更新します。

  2. 新しい NGINX Ingress Controller インスタンスが正常に動作していることを確認したら、元のインスタンスを削除します。

  3. セルフマネージド AWS Load Balancerコントローラーを削除します。手順については、「非推奨になった ALB Ingress Controller からのアプリの移行 (Amazon EKS ドキュメント)」を参照してください。

  4. マネージド型ノードグループをドレインします。手順については、「Deleting and draining node groups (eksctl ドキュメント)」を参照してください。

AWS DevOps、DevOps エンジニア

2 つのイングレスを確認します。

次のコマンドを入力して、サンプルの HTTPd ワークロード用に作成された 2 つのイングレスを確認します。

kubectl get ingress

以下は、その出力例です。

NAME CLASS HOSTS ADDRESS PORTS AGE demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 95m demo-new nginx-v2 nginxautomode.local.dev k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80 33s
DevOps エンジニア

関連リソース