NGINX Ingress Controller をパブリックアクセス、プライベートアクセス、またはデュアルアクセス用に設定することで、さまざまなネットワーク環境のクライアントに対応できます。
仕組み
クラスターでは、Server Load Balancer (SLB) インスタンスがクライアントリクエストを受信し、それらを NGINX Ingress Controller のワークロードに転送します。その後、ワークロードはリクエストを他の Service に転送します。
パブリックアクセスとプライベートアクセスの両方に対応する NGINX Ingress の設定
パブリックアクセスとプライベートアクセスの両方を有効にするには、NGINX Ingress Controller のバックエンド Pod をターゲットとする 2 つの Service をデプロイします。1 つはパブリック SLB インスタンスに、もう 1 つは内部 (プライベート) SLB インスタンスにそれぞれ関連付けます。
現在の SLB インスタンスのネットワークタイプを確認します。
kubectl describe service -n kube-system nginx-ingress-lb | grep "service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"出力に
intranetが含まれている場合、現在の SLB は内部向けです。それ以外の場合は、パブリック向けです。パブリックと内部の両方のタイプを揃えるために、新しい Service を作成します。
nginx-ingress-lb-new.yamlという名前のファイルを作成します。次に、kubectl apply -f nginx-ingress-lb-new.yamlを実行して Service を作成します。内部 Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-intranet namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # SLB インスタンスのアドレスタイプが内部であることを指定します。 spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxパブリック Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-internet namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx新しい Service が正しく機能していることを確認します。次のコマンドの
<service-name>を新しい Service の名前に置き換えます。200応答は、新しい Service が正しく機能していることを示します。curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system <service-name> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')新しい Service の外部 IP を取得し、それに応じて DNS レコードを設定します。次のコマンドの
<service-name>を新しい Service の名前に置き換えます。kubectl get service <service-name>内部 Service
Alibaba Cloud DNS-Private Zone にログインします。 タブで、[Add Zone] をクリックします。すでにゾーンを追加している場合は、ステップ c に進みます。
[Authoritative Zone] フィールドにドメイン名を入力します。他のオプションはデフォルト設定のままにして、[OK] をクリックします。
ターゲットゾーンをクリックします。[Settings] タブで、[Add Record] をクリックします。次の表の値を入力し、他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。
パラメーター
値
Record Type
A
Hostname
必要に応じてサブドメインのプレフィックスを入力します。
Record Value
新しい Service の IP アドレス。
[User Defined Zones] リストに戻ります。ターゲットゾーンの [Actions] 列で、[Effective Scope] をクリックします。[Effective In VPCs] オプションで、Container Service for Kubernetes (ACK) クラスターが配置されている VPC を選択し、[OK] をクリックします。
パブリック Service
Alibaba Cloud DNS-Public Zone にログインします。ターゲットゾーンをクリックして [Settings] ページに移動します。[Add Record] ボタンをクリックします。
次の表の値を入力します。他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。
パラメーター
値
Record Type
A
Hostname
必要に応じてサブドメインのプレフィックスを入力します。
Record Value
新しい Service の IP アドレス。
ネットワークタイプの変更
この手順では、Service を削除して再作成するため、関連付けられている SLB インスタンスが置き換えられます。これにより、NGINX Ingress へのトラフィックが一時的に中断されます。元の SLB インスタンスとそれに関連付けられた IP アドレスは復元できません。
既存の SLB インスタンスにトラフィックがないことを確認します。
ACK コンソール にログインし、ターゲットクラスターをクリックします。左側メニューで、 を選択します。
kube-system名前空間でnginx-ingress-lbService を見つけ、その [外部 IP] を記録します。Classic Load Balancer (CLB) コンソール にログインします。ページの上部で、クラスターと同じリージョンを選択します。前のステップの IP アドレスと一致する [IP アドレス] を持つ CLB インスタンスを見つけます。CLB インスタンスをクリックし、[モニタリング] タブに移動して、インスタンスのアクティブな接続がゼロであることを確認してから次に進んでください。
NGINX Ingress Controller で使用されている現在の Service を削除します。
kubectl delete svc -n kube-system nginx-ingress-lb新しい Service を作成します。以下の適切なマニフェストを
nginx-ingress-lb.yamlとして保存し、コマンドkubectl apply -f nginx-ingress-lb.yamlを実行して適用します。重要新しい Service には
nginx-ingress-lbという名前を付ける必要があります。内部 Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # SLB インスタンスのアドレスタイプが内部であることを指定します。 spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxパブリック Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx新しい Service をテストします。
200応答コードは、正しく機能していることを示します。curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system nginx-ingress-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')kubectl get service nginx-ingress-lbを実行し、 Service の外部 IP を記録します。次に、新しい Service タイプに基づいて DNS 名前解決を設定します。内部 Service
Alibaba Cloud DNS-Private Zone にログインします。 タブで、[Add Zone] をクリックします。すでにゾーンを追加している場合は、ステップ c に進みます。
[Authoritative Zone] フィールドにドメイン名を入力します。他のオプションはデフォルト設定のままにして、[OK] をクリックします。
ターゲットゾーンをクリックします。[Settings] タブで、[Add Record] をクリックします。次の表の値を入力し、他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。
パラメーター
値
Record Type
A
Hostname
必要に応じてサブドメインのプレフィックスを入力します。
Record Value
新しい Service の IP アドレス。
[User Defined Zones] リストに戻ります。ターゲットゾーンの [Actions] 列で、[Effective Scope] をクリックします。[Effective In VPCs] オプションで、Container Service for Kubernetes (ACK) クラスターが配置されている VPC を選択し、[OK] をクリックします。
パブリック Service
Alibaba Cloud DNS-Public Zone にログインします。ターゲットゾーンをクリックして [Settings] ページに移動します。[Add Record] ボタンをクリックします。
次の表の値を入力します。他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。
パラメーター
値
Record Type
A
Hostname
必要に応じてサブドメインのプレフィックスを入力します。
Record Value
新しい Service の IP アドレス。
よくある質問
古い Service を削除する前に新しい Service を作成できないのはなぜですか?
これは不可能です。なぜなら、NGINX Ingress Controller コンポーネントはアップグレードや調整中に、ワークロードがデフォルト名 nginx-ingress-lb を持つ Service を使用してマッチングを行うことを前提としているためです。Service 名は名前空間内で一意でなければならないため、古い Service がまだ存在している間は、この名前で新しい Service を作成することはできません。まず古い Service を削除してください。
クライアントのアクセス IP がコンソールに表示されるエンドポイントと異なるのはなぜですか?
ACK コンソールの [Ingresses] ページに表示される [エンドポイント] は、nginx-ingress-lb という名前の Service にのみ関連付けられている SLB インスタンスの IP アドレスです。複数の LoadBalancer Service を設定した場合、Ingress Controller はそれらすべてからのトラフィックを正しくルーティングしますが、コンソールにはそれらの IP は表示されません。クライアントが実際に使用する IP アドレスは DNS 設定によって決まり、コンソールに表示されるものとは異なる SLB インスタンスを指している可能性があります。
nginx-ingress-lb Service を削除して再作成した場合は、Ingress リソースを更新して、コンソールに表示されるエンドポイントの表示を更新する必要があります。変更操作が失敗した場合、どのようにロールバックすればよいですか?
ネットワークタイプの変更が失敗した場合は、次の手順に従って Ingress エントリポイントを復元します。
失敗した Service の削除: 作成した新しい Service を削除して、デフォルト Service の再作成を妨げる名前の競合を解消します。
コンポーネントの再インストール: ACK コンソールで、NGINX Ingress Controller をアンインストールして再インストールします。この操作により、デフォルトの
nginx-ingress-lbService が再作成され、Ingress エントリポイントが復元されます。DNS の更新: 新しい
nginx-ingress-lbService に対して DNS 名前解決を設定します。ドメインがその新しい外部 IP を指すように設定し、トラフィックが正しくルーティングされていることを確認します。
関連ドキュメント
既存 SLB インスタンスのアノテーション設定の詳細については、「既存 SLB インスタンスの使用」をご参照ください。