Ingress 活用のユースケース

Prev Next

VPC環境で利用できます。

Kubernetes Service(VPC) を開始するで紹介した Kubectl CLIを通じて Ingressをリリースし、ルーティングを行うユースケースです。

Kubernetesで Ingressは、クラスタ外部のリクエストを Ingressリソースに定義されたルールに従ってクラスタ内部のサービスに接続します。Ingressの詳細な説明は、Ingressをご参照ください。

Kubectlを通じた Ingressリリース例

Kubectlを通じて Ingressをリリースして Ingressサービスを作成するユースケースは、次の通りです。

  1. 使用中のクラスタバージョンに合った ingress-nginxをインストールします。
  1. 以下のコマンドを実行して 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
    
  2. 以下のコマンドを実行して 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です。

  1. 以下のコマンドを使用してユースケース用の 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
    
  2. 以下のコマンドを実行してユースケース用の 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
    
  3. 以下のコマンドを実行して 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ベースルーティングのユースケースは、次の通りです。

  1. 以下のように 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
    
  2. 以下のコマンドを実行して Ingressを作成します。

    $ kubectl --kubeconfig $KUBE_CONFIG apply -f ./path-ingress.yaml
    
    注意

    ユースケースでは、TLS設定を行っていないために強制リダイレクションを防ぐために Ingressのアノテーションに nginx.ingress.kubernetes.io/ssl-redirect: "false"を追加しました。TLSを設定する場合、当該アノテーションは削除します。

  3. 以下のコマンドを実行して作成された Ingressを確認します。

    $ kubectl --kubeconfig $KUBE_CONFIG get ingress
    NAME           CLASS   HOSTS   ADDRESS            PORTS   AGE
    path-ingress   nginx   *       [nginx_address]    80      7s
    
  4. 以下の例のように、ブラウザまたは 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に対してそれぞれ異なるドメインにリクエストする場合、それぞれ異なるサービスに接続されるように設定できます。

ホストベースルーティングのユースケースは、次の通りです。

  1. 以下のように 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
    
  2. 以下のコマンドを実行して Ingressを作成します。

    $ kubectl --kubeconfig $KUBE_CONFIG apply -f ./host-ingress.yaml
    
  3. 以下のコマンドを実行して作成された Ingressを確認します。

    $ kubectl --kubeconfig $KUBE_CONFIG get ingress
    NAME           CLASS   HOSTS   ADDRESS            PORTS   AGE
    host-ingress   nginx   *       [nginx_address]    80      15s
    
  4. 以下の例のように、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でご確認ください。