- 印刷する
- PDF
Ingressの活用例
- 印刷する
- PDF
VPC環境で利用できます。
Kubernetes Service(VPC)の開始で紹介したKubectl CLIを通じてIngressを配布してルーティングを行う例です。
KubernetesのIngressは、クラスタ外部のリクエストをIngressリソースに定義されたルールに基づいてクラスタ内部のサービスにルーティングします。 Ingressについての詳しい説明は、Ingressをご参照ください。
Kubectlを用いたIngress配布の例
以下は、Kubectlを通じてIngressを配布してIngressサービスを作成する例です。
以下のコマンドを実行してingress-nginxをインストールします。
kubectl --kubeconfig $KUBE_CONFIG apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
以下のコマンドを実行して、ingress-nginxパッドの状態を確認します。
$ 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
- Load Balancerの作成が完了すると、
ルーティングの例
ルーティング例では、異なる情報を持つ例題用DeploymentとServiceを使用します。 例題用Deploymentは、自分のホスト情報を表示するためのnginxcontainerであり、例題用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ベースのルーティングの例
生成したIngressServiceのEXTERNALIP
に表示される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番目のホップを誘発することがありますが、Podへのトラフィックはバランスよく分散できます。
Local
の場合、外部トラフィックをローカルNodeにあるPodにのみ伝達します。 他のNodeに対する2番目のホップを避けられますが、バランスの悪いトラフィック分散が発生する可能性があります。
ingress-nginx Serviceの設定が.spec.externalTrafficPolicy: Local
になっている場合、ingress-nginx Podが動作中のノードにのみトラフィックが伝達されるため、その他のサーバはHealth Checkに失敗したものと表示されます。
動作に関するより詳しい内容は、Using Source IPで確認できます。