VPC環境で利用できます。
Kubernetes Service(VPC) を開始するで紹介した Kubectl CLIを通じて Ingressをリリースし、ルーティングを行うユースケースです。
Kubernetesで Ingressは、クラスタ外部のリクエストを Ingressリソースに定義されたルールに従ってクラスタ内部のサービスに接続します。Ingressの詳細な説明は、Ingressをご参照ください。
Kubectlを通じた Ingressリリース例
Kubectlを通じて Ingressをリリースして Ingressサービスを作成するユースケースは、次の通りです。
- 使用中のクラスタバージョンに合った ingress-nginxをインストールします。
- Supported Versions tableをご参照ください。
-
以下のコマンドを実行して ingress-nginx Podのステータスを確認します。
$ kubectl --kubeconfig $KUBE_CONFIG get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-wnkkp 0/1 Completed 0 4m32s ingress-nginx-admission-patch-rw4f2 0/1 Completed 0 4m32s ingress-nginx-controller-fd7bb8d66-wzfkd 1/1 Running 0 4m32s -
以下のコマンドを実行して LoadBalancerの作成有無を確認します。
- Load Balancerの作成が完了したら EXTERNAL-IPの値が pendingで実際の IPアドレスに変更されます。
$ kubectl --kubeconfig $KUBE_CONFIG get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.233.38.219 [nginx_address] 80:30033/TCP,443:31110/TCP 39s ingress-nginx-controller-admission ClusterIP 10.233.33.133 <none> 443/TCP 39s
ルーティングのユースケース
ルーティングのユースケースでは、異なる情報を持つユースケース用の Deploymentと Serviceを使用します。ユースケース用の Deploymentは自分のホスト情報を表示するための nginx containerであり、ユースケース用の Serviceは NodePortタイプで作成された Serviceです。
-
以下のコマンドを使用してユースケース用の Deploymentと Serviceを作成します。
kubectl --kubeconfig $KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/examples/pub/nks-alb-ingress-sample-services.yaml -
以下のコマンドを実行してユースケース用の Deploymentと Serviceのステータスを確認します。
$ kubectl --kubeconfig $KUBE_CONFIG get pods NAME READY STATUS RESTARTS AGE cloud-8569cb49bf-k2787 1/1 Running 0 18s naver-7d855c949f-2wc2l 1/1 Running 0 18s platform-68754dccf9-8wqng 1/1 Running 0 18s $ kubectl --kubeconfig $KUBE_CONFIG get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cloud NodePort 10.233.6.109 <none> 80:31234/TCP 69s naver NodePort 10.233.29.211 <none> 80:31411/TCP 69s platform NodePort 10.233.2.191 <none> 80:31928/TCP 69s -
以下のコマンドを実行して ingress-nginxのロードバランサアクセス情報を保存します。
$ export nginx_address=$(kubectl --kubeconfig $KUBE_CONFIG get svc -n ingress-nginx ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[*].hostname}') $ echo $nginx_address
URIベースルーティングのユースケース
作成した Ingress Serviceの EXTERNAL IPに表示される path別にルーディングして/naver, /cloud, /platformにリクエストする時、それぞれ異なるサービスに接続されるよう設定できます。
URIベースルーティングのユースケースは、次の通りです。
-
以下のように Ingressのリソースを各 pathに応じて異なる backendを持つように設定し、ファイルで保存します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: path-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - http: paths: - path: /naver pathType: Prefix backend: service: name: naver port: number: 80 - path: /cloud pathType: Prefix backend: service: name: cloud port: number: 80 - path: /platform pathType: Prefix backend: service: name: platform port: number: 80 -
以下のコマンドを実行して Ingressを作成します。
$ kubectl --kubeconfig $KUBE_CONFIG apply -f ./path-ingress.yaml注意ユースケースでは、TLS設定を行っていないために強制リダイレクションを防ぐために Ingressのアノテーションに
nginx.ingress.kubernetes.io/ssl-redirect: "false"を追加しました。TLSを設定する場合、当該アノテーションは削除します。 -
以下のコマンドを実行して作成された Ingressを確認します。
$ kubectl --kubeconfig $KUBE_CONFIG get ingress NAME CLASS HOSTS ADDRESS PORTS AGE path-ingress nginx * [nginx_address] 80 7s -
以下の例のように、ブラウザまたは curlを介してアクセス結果を確認し、それぞれ異なる Serviceの Podにアクセスすることを確認します。
$ curl $nginx_address/naver Server address: 198.18.2.178:80 Server name: naver-7d855c949f-hsf8q Date: 24/May/2022:09:17:23 +0000 URI: / Request ID: dcf54d3b841e06733ae75cc08dc922d0$ curl $nginx_address/cloud Server address: 198.18.2.32:80 Server name: cloud-8569cb49bf-przrt Date: 24/May/2022:09:17:26 +0000 URI: / Request ID: 461db9ee32dc3a5e1452b426da88fce8$ curl $nginx_address/platform Server address: 198.18.3.182:80 Server name: platform-68754dccf9-7przv Date: 24/May/2022:09:17:31 +0000 URI: / Request ID: 47ae775498a2dad86ab9c9fd0ca58537
ホストベースルーティングのユースケース
同じ EXTERNAL-IPに対してそれぞれ異なるドメインにリクエストする場合、それぞれ異なるサービスに接続されるように設定できます。
ホストベースルーティングのユースケースは、次の通りです。
-
以下のように Ingressのリソースを各 hostに応じて異なる backendを持つように設定し、ファイルで保存します。
- 以下の例では、svc.naver.comにリクエストする場合は naverに、svc.cloud.comにリクエストする場合は cloudに、基本リクエストの場合は platformに接続されるように設定します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: host-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - host: "svc.naver.com" http: paths: - path: / pathType: Prefix backend: service: name: naver port: number: 80 - host: "svc.cloud.com" http: paths: - path: / pathType: Prefix backend: service: name: cloud port: number: 80 - http: paths: - path: / pathType: Prefix backend: service: name: platform port: number: 80 -
以下のコマンドを実行して Ingressを作成します。
$ kubectl --kubeconfig $KUBE_CONFIG apply -f ./host-ingress.yaml -
以下のコマンドを実行して作成された Ingressを確認します。
$ kubectl --kubeconfig $KUBE_CONFIG get ingress NAME CLASS HOSTS ADDRESS PORTS AGE host-ingress nginx * [nginx_address] 80 15s -
以下の例のように、curlコマンドに-H hostオプションを追加した後、ホスト別の接続結果を確認して各々異なるサービスに接続されるか確認します。
$ curl -H host:svc.naver.com $nginx_address Server address: 198.18.2.178:80 Server name: naver-7d855c949f-hsf8q Date: 24/May/2022:09:25:40 +0000 URI: / Request ID: f5cb5e2f152367632ebecc9dd2ef2942$ curl -H host:svc.cloud.com $nginx_address Server address: 198.18.2.32:80 Server name: cloud-8569cb49bf-przrt Date: 24/May/2022:09:25:50 +0000 URI: / Request ID: e9203271c73a8d7e908fc5bf8613850f$ curl $nginx_address Server address: 198.18.3.182:80 Server name: platform-68754dccf9-7przv Date: 24/May/2022:09:25:56 +0000 URI: / Request ID: 751e0dc1e99b79495ada5dbb06d92c4a
- 上記のユースケースでは、ホストに設定したドメインは実際に存在しないドメインであるため、実行するには curlコマンドに-H hostオプションが含まれる必要があります。
- ingress-nginxでは名前に_(アンダースコア)がある Request Headerは強制的に削除するため、当該 Request Headerはサーバで確認できません。これを避けるためには、ConfigMapに enable-underscores-in-headers: trueを追加してアンダースコア使用を許可するように設定します。
Load Balancerで ingress-nginx Podがないノードは、ヘルスチェックに失敗したと表示されます。
上記の例で ingress-nginx Serviceを作成した場合、Service .spec.externalTrafficPolicy: Local設定を確認できます。.spec.externalTrafficPolicyはサービスで外部トラフィックをルーティングする設定であり、Clusterと Local値を使用できます。
Clusterの場合、外部トラフィックを全体 Podに分散します。他の Nodeにある Podに転送する時に2つ目の hopが発生する可能性はありますが、Podへのトラフィックは均等に分散できます。
Localの場合、外部トラフィックをローカル Nodeにある Podにのみ転送します。他の Nodeに対する2つ目の hopを避けますが、均等でないトラフィック分散が発生することがあります。
ingress-nginx Serviceの設定が.spec.externalTrafficPolicy: Localの場合、ngress-nginx Podが動作中のノードのみトラフィックが転送されるので、その他のサーバは Health Checkに失敗したと表示されます。
動作に対する詳細な内容は Using Source IPでご確認ください。