Nginx Ingress Controller は、パブリックネットワークとプライベートネットワークの両方へのアクセス、パブリックネットワークのみへのアクセス、プライベートネットワークのみへのアクセスという 3 種類のアクセスモードをサポートしています。これにより、異なるネットワーク環境におけるクライアントのアクセス要件を満たすことができます。
仕組み
クラスター内で、SLB インスタンスがクライアントからのリクエストを受け取り、Nginx Ingress Controller ワークロードに転送します。その後、ワークロードが他のサービスにリクエストを転送します。
パブリックネットワークおよびプライベートネットワークの両方へのアクセスを有効にする Nginx Ingress の設定
Nginx Ingress Controller のバックエンド Pod に対して 2 つのサービスをデプロイします。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が含まれている場合、現在のタイプはプライベートです。それ以外の場合はパブリックです。パブリックおよびプライベートの両方のネットワークタイプが存在することを保証するため、新しいサービスを作成します。
nginx-ingress-lb-new.yamlという名前のファイルを作成して保存し、kubectl apply -f nginx-ingress-lb-new.yamlを実行してサービスを作成します。プライベートネットワークのサービスを追加
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パブリックネットワークのサービスを追加
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-name>を新しく作成したサービスの名前に置き換え、コマンドを実行します。戻り値が200の場合、新しいサービスが正しく動作しています。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-name>を新しく作成したサービスの名前に置き換え、kubectl get service <service-name>を実行します。サービスの External IP を記録し、サービスのタイプに基づいて DNS を設定します。新しいプライベートネットワークのサービス
Alibaba Cloud DNS – Private DNS にログインします。 タブで、Add Zone をクリックします。すでにドメインを追加済みの場合は、手順 c に進んでください。
イントラネット権威ドメイン名 (Zone) にドメイン名を入力します。その他のオプションはデフォルトのままにして、OK をクリックします。
対象のドメインをクリックします。Settings タブで、Add Record をクリックします。以下の表の値を使用してフォームに入力します。その他の設定はデフォルトのままにして、OK をクリックします。
設定項目
値
Record Type
A
Hostname
必要に応じてサブドメインプレフィックスを入力します。
Record Value
新しいサービスの IP アドレス。
User Defined Zones リストに戻ります。対象ドメインの操作列で、Effective Scope を選択します。Alibaba Cloud VPC イントラネットで有効 の下で、ACK クラスターが配置されている VPC を選択し、OK をクリックします。
新しいパブリックネットワークのサービス
Alibaba Cloud DNS – Public Authoritative DNS にログインします。対象のドメインをクリックして 解決設定 ページを開き、Add Record ボタンをクリックします。
以下の表の値を使用してフォームに入力します。その他の設定はデフォルトのままにして、OK をクリックします。
設定項目
値
レコードタイプ
A.
ホストレコード
必要に応じてサブドメインプレフィックスを入力します。
レコード値
新しいサービスの IP アドレス。
ネットワークタイプの変更
この操作では、SLB インスタンスを置き換えるためにサービスを削除して再作成します。これにより、Nginx Ingress が一時的に中断されます。削除された SLB インスタンスおよびその IP アドレスは復旧できません。
既存の SLB インスタンスにトラフィックがないことを確認します。
Container Service 管理コンソール にログインします。対象のクラスターをクリックし、左側のナビゲーションウィンドウで に移動します。
kube-system名前空間でnginx-ingress-lbを探します。外部 IP アドレス (External IP) を記録します。Classic Load Balancer コンソール にログインします。クラスターと同じリージョンを選択します。前の手順で記録した IP アドレスと一致する IP を持つ CLB インスタンスを探します。インスタンスをクリックし、モニタ タブで接続数が 0 であることを確認してから、次の手順に進んでください。
Nginx Ingress Controller で使用中の現在のサービスを削除します。
kubectl delete svc -n kube-system nginx-ingress-lbnginx-ingress-lb.yamlという名前のファイルを作成して保存し、kubectl apply -f nginx-ingress-lb.yamlを実行してサービスを作成します。重要新しいサービス名は
nginx-ingress-lbである必要があります。プライベートネットワークのサービス
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パブリックネットワークのサービス
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新しいサービスをテストします。戻り値が
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を実行します。サービスの External IP を記録し、サービスのタイプに基づいて DNS を設定します。新しいプライベートネットワークのサービス
Alibaba Cloud DNS – Private DNS にログインします。 タブで、Add Zone をクリックします。すでにドメインを追加済みの場合は、手順 c に進んでください。
イントラネット権威ドメイン名 (Zone) にドメイン名を入力します。その他のオプションはデフォルトのままにして、OK をクリックします。
対象のドメインをクリックします。Settings タブで、Add Record をクリックします。以下の表の値を使用してフォームに入力します。その他の設定はデフォルトのままにして、OK をクリックします。
設定項目
値
Record Type
A
Hostname
必要に応じてサブドメインプレフィックスを入力します。
Record Value
新しいサービスの IP アドレス。
User Defined Zones リストに戻ります。対象ドメインの操作列で、Effective Scope を選択します。Alibaba Cloud VPC イントラネットで有効 の下で、ACK クラスターが配置されている VPC を選択し、OK をクリックします。
新しいパブリックネットワークのサービス
Alibaba Cloud DNS – Public Authoritative DNS にログインします。対象のドメインをクリックして 解決設定 ページを開き、Add Record ボタンをクリックします。
以下の表の値を使用してフォームに入力します。その他の設定はデフォルトのままにして、OK をクリックします。
設定項目
値
レコードタイプ
A.
ホストレコード
必要に応じてサブドメインプレフィックスを入力します。
レコード値
新しいサービスの IP アドレス。
よくある質問
古いサービスを削除する前に新しいサービスを作成できないのはなぜですか?
Nginx Ingress Controller のネットワークタイプを変更する際、新しいサービスを先に作成してから古いサービスを削除する方法では切り替えられません。古いサービスを削除した後に新しいサービスを作成する必要があります。コンポーネントのアップグレード中に、Nginx Ingress Controller ワークロードはデフォルトの名前 (nginx-ingress-lb) でサービスとマッチングします。サービスは同じ名前を共有できないため、古いサービスを削除せずに新しいサービスを作成すると、ワークロードが正しい SLB インスタンスとマッチングできず、アップグレードが失敗します。
クライアントが使用する IP アドレスがコンソールに表示されるエンドポイントと異なるのはなぜですか?
コンソールの Ingress ページに表示される エンドポイント は、nginx-ingress-lb という名前のサービスに関連付けられた SLB インスタンスの IP アドレスです。LoadBalancer タイプのサービスを複数構成している場合でも、Nginx Ingress はすべてのリクエストを正しく転送します。ただし、コンソールにはデフォルトのサービスに紐づく SLB インスタンスの IP アドレスのみが表示されます。クライアントが実際にアクセスする IP アドレスは、使用する SLB インスタンスによって異なります(これは DNS 名前解決テストで確認できます)。そのため、コンソールに表示される エンドポイント と異なる場合があります。
nginx-ingress-lb を削除して同じ名前のサービスを再作成した場合は、表示されるエンドポイントを更新するために Ingress リソースを更新する必要があります。誤った変更を行った後のロールバック方法を教えてください。
できるだけ早く、以下の手順を順番に実行してください。
コンポーネントがデフォルトのサービスを作成できなくなるような名前衝突を防ぐため、新しく作成したサービスを削除します。
コンソールで、Nginx Ingress Controller コンポーネントをアンインストールして再インストール します。これにより、クラスター内に新しいデフォルトのサービスが作成され、Nginx Ingress のエントリポイントが復元されます。
DNS を設定 して、新しいデフォルトのサービス (
nginx-ingress-lb) のドメイン名名前解決を追加し、転送が正しく機能するかテストします。
関連ドキュメント
既存の SLB インスタンスに対するアノテーションの設定方法の詳細については、「既存の SLB インスタンスの使用」をご参照ください。