スキップしてコンテンツを表示

Amazon EKS でIngress NGINX Controller を設定し、トラブルシューティングを行う方法を教えてください。

所要時間4分
0

Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで Ingress NGINX Controller for Kubernetes を設定し、問題のトラブルシューティングも行えるようにしたいと考えています。

簡単な説明

Ingress NGINX Controller は、オープンソースの HTTP およびリバースプロキシサーバーである NGINX インスタンスを含むポッドをデプロイ、構成、管理します。これらのポッドは、コントローラーのサービスリソース経由で公開されます。サービスリソースは、Kubernetes の Ingress および Service リソースが定義する関連アプリケーションのトラフィックを受信します。詳細については、「Ingress NGINX Controller」 (GitHub のウェブサイト) および 「NGINX」 NGINX のウェブサイトを参照してください。

解決策

必要に応じて: Helm をインストールします。詳細については、Helm のウェブサイトで「Helm のインストール」を参照してください。Ingress NGINX Controller のインストールに YAML マニフェストを使用する場合は、Helm は必須ではありません。

必要に応じて: AWS Load Balancer Controller をインストールします。このコントローラーは、Network Load Balancer ターゲットグループのターゲットタイプを IP ターゲットタイプに設定する場合、必須です。IP ターゲットタイプは、Ingress NGINX Controller ポッドの IP をターゲットグループに登録します。インスタンスのターゲットタイプは、NodePort で Ingress NGINX Controller サービスを使用してインスタンスを登録します。

Ingress INGINX Controller のインストール

次のいずれかの方法で Ingress NGINX Controller を Kubernetes クラスターにインストールします。

各コンポーネントがすべて定義された YAML マニフェストファイルを使用します。kubectl を使用してマニフェスト内のリソースを作成します。

または、

Helm を使用してプロジェクトのリポジトリチャート経由で Ingress NGINX Controller をデプロイします。

Ingress NGINX Controller は、AWS Classic Load Balancer または AWS Network Load Balancer 経由で外部公開できます。デフォルトでは上記どちらの方法でも、コントローラーはインターネット接続された Classic Load Balancer 経由で公開されます。

Helm を使用して Ingress NGINX Controller をデプロイする

条件に応じたコマンドを使用してコントローラーを設定、公開します。

インターネット接続された Classic Load Balancer

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
ingress-nginx

内部 Classic Load Balancer

Ingress NGINX Controller を公開する Kubernetes サービスには、次のアノテーションを追加する必要があります。

service.beta.kubernetes.io/aws-load-balancer-internal: true

例:

インターネット接続された Network Load Balancer

ロードバランサーの種類を Classic から Network に変更するには、次のアノテーションを追加します。

service.beta.kubernetes.io/aws-load-balancer-type: nlb

例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
ingress-nginx

内部 Network Load Balancer

内部 Network Load Balancer をプロビジョニングする場合は、次のアノテーションを追加します。

service.beta.kubernetes.io/aws-load-balancer-type: nlb

service.beta.kubernetes.io/aws-load-balancer-internal: true

例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-internal"="true" \
ingress-nginx

AWS Load Balancer Controller を使用する IP モードの Network Load Balancer

クラスターに AWS Load Balancer Controller がインストールされている必要があります。詳細については、GitHub のウェブサイトで「AWS Load Balancer Controller」を参照してください。

AWS Load Balancer Controller が Network Load Balancer のプロビジョニングを引き受けられるようにするために、次のアノテーションを使用します。

service.beta.kubernetes.io/aws-load-balancer-type: external

デフォルトでは、システムは内部 Network Load Balancer を作成します。ただし、次のアノテーションを追加することで、IP ターゲットグループのターゲットタイプを使用する、インターネット接続された Network Load Balancer を作成できます。

service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing

例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="external" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-scheme"="internet-facing" \
ingress-nginx

kubectl および YAML マニフェストファイルを使用する

YAML マニフェストファイルをダウンロードします。次のコマンドを実行すると、Ingress NGINX Controller バージョン 1.11.2 がダウンロードされます。

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

注: この値は、他のコントローラーバージョンに置き換えることができます。詳細については、GitHub のウェブサイトで「Tags」を参照してください。一部の状況では、Kubernetes Load Balancer サービス (ingress-nginx-controller) をアノテーションすることで、システムがプロビジョニングするロードバランサーの種類とプロパティを変更する必要があります。

例:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

インターネット接続された Classic Load Balancer

マニフェストを変更せずにクラスターに適用できます。次のコマンドを実行します。

kubectl apply -f ingress-nginx.yaml

内部 Classic Load Balancer

次の手順を実行します。

  1. YAML マニフェストを変更し、次のアノテーションを指定するアノテーションセクションを追加します:
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 次のコマンドを実行してマニフェストをクラスターに適用します。

    kubectl apply -f ingress-nginx.yaml

インターネット接続された Network Load Balancer

  1. 次のアノテーションを使用して Network Load Balancer を作成します:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
      ...
    type: LoadBalancer
    ...
  2. 次のコマンドを実行してマニフェストをクラスターに適用します:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    例:

    kubectl apply -f ingress-nginx.yaml

内部ネットワークロードバランサー:

  1. 以下のアノテーションを組み合わせて内部 Network Load Balancer を作成します:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 次のコマンドを実行してマニフェストをクラスターに適用します。

    kubectl apply -f ingress-nginx.yaml

AWS Load Balancer Controller を使用する IP モードの Network Load Balancer

  1. AWS Load Balancer Controller をクラスターにインストールします。詳細については、GitHub のウェブサイトで「AWS Load Balancer Controller」を参照してください。次のアノテーションを使用して AWS Load Balancer Controller が Network Load Balancer をプロビジョニングするようにします。

    service.beta.kubernetes.io/aws-load-balancer-type: external
  2. デフォルトでは、システムは内部 Network Load Balancer を作成します。ターゲットグループのターゲットタイプを IP としてインターネット接続された Network Load Balancer を作成するには、次のアノテーションを追加します:
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    例:

    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: external
        service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      ...
    type: LoadBalancer
  3. 次のコマンドを実行してマニフェストをクラスターに適用します。

    kubectl apply -f ingress-nginx.yaml

問題のトラブルシューティング

詳細については、GitHub のウェブサイトで「トラブルシューティング」を参照してください。

サブネットエラー

Network Load Balancer がサブネットを自動的に検出できない場合、次のエラーメッセージが表示される可能性があります。

"Reconciler error","controller":"ingress",...,"error":"couldn't auto-discover subnets: unable to resolve at least one subnet"

AWS Load Balancer Controller は、サブネットタグを使用してロードバランサーに使用するサブネットを自動的に特定します。AWS ロードバランサーでは、コントローラーは異なるアベイラビリティーゾーン内の 2 つ以上のサブネットを必要とします。Network Load Balancer では、コントローラーは 1 つ以上のサブネットを必要とします。自動検出を行うには、サブネットにタグを付ける必要があります。

  • パブリックサブネットに kubernetes.io/role/elb キーでタグを付けます。値を 1 に設定します。
  • プライベートサブネットに kubernetes.io/role/internal-elb キーでタグを付けます。値を 1 に設定します。
  • AWS Load Balancer Controller バージョン 2.1.1 以前を使用する場合は、パブリックおよびプライベートサブネットに kubernetes.io/cluster/your-cluster-name キーでタグを付けます。値を owned または shared に設定します。

アドレスフィールドが表示されない (kubectl get または describe ingress)

kubectl get ingress your-ingress-name コマンドを実行した結果、アドレスフィールドが空である場合があります。または、kubectl describe ingress を実行した結果、割り当てられたアドレスが表示されない場合があります。上記いずれかに当てはまる場合、次の手順を実行します。

  • Ingress リソースの Describe 結果を参照し、ingressClassName または kubernetes.io/ingress.class アノテーションが適切に使用されていることを確認します。Ingress NGINX Controller の IngressClass 名は、ingressClassName フィールドまたは kubernetes.io/ingress.class アノテーションの値と一致する必要があります。一致していない場合は、Ingress NGINX Controller の IngressClass リソースを、クラスター唯一のデフォルト IngressClass として構成します。詳細については、Kubernetes のウェブサイトで「デフォルト IngressClass」を参照してください。
  • Ingress リソースの Describe 結果を参照し、Ingress NGINX Controllerによるイベントにエラーが追加されていないかどうかを確認します。イベントが表示されない場合、そのイベントは保持期間制限に達しています。または、Ingress NGINX Controller は対応する必要のあるイングレスを検出できない可能性があります。
  • Ingress NGINX Controller ポッドのログにロールベースアクセス制御 (RBAC) やその他の関連エラーがないか確認するには、次のコマンドを実行します。
    kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
    注: ingress-nginx-controller-pod-name を Ingress NGINX Controller のポッド名に置き換えてください。ingress-nginx-namespace Ingress NGINX の名前空間名に置き換えてください。

アクセスログとリクエストログ

Ingress NGINX Controller のデフォルトのログ形式をレビューし、特定のリクエストと応答に関連する情報を特定します。手順については、GitHub のウェブサイトで「ログ形式」を参照してください。下記の例では、デフォルトのログ形式が次のサンプルログと一致しています。バックエンドターゲットの IP アドレスとポートが 192.168.114.102.80 であり、バックエンドターゲットからの HTTP 応答が 200 であることを示しています。

192.168.116.133 - - \[24/Sep/2024:22:14:59 +0000\] "GET / HTTP/1.1" 200 45 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 524 0.003 \[default-apache-service-80\] \[\] 192.168.114.102:80 45 0.003 200 ffe584bdeb28959241e8d8408cfc06e5

関連情報

Kubernetes アプリケーションを公開する - パート 3: Ingress-Nginx Controller

AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ