Ingressの活用例
    • PDF

    Ingressの活用例

    • PDF

    Article Summary

    VPC環境で利用できます。

    Kubernetes Service(VPC)の開始で紹介したKubectl CLIを通じてIngressを配布してルーティングを行う例です。

    KubernetesのIngressは、クラスタ外部のリクエストをIngressリソースに定義されたルールに基づいてクラスタ内部のサービスにルーティングします。 Ingressについての詳しい説明は、Ingressをご参照ください。


    Kubectlを用いたIngress配布の例

    以下は、Kubectlを通じてIngressを配布してIngressサービスを作成する例です。

    1. 以下のコマンドを実行して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
      
    2. 以下のコマンドを実行して、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
      
    3. 以下のコマンドを実行して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は、自分のホスト情報を表示するためのnginxcontainerであり、例題用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ベースのルーティングの例

    生成したIngressServiceのEXTERNALIPに表示される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を設定する場合、このアノテーションは削除してください。

    1. 以下のコマンドを実行して作成されたIngressを確認します。
      $ kubectl --kubeconfig $KUBE_CONFIG get ingress
      NAME           CLASS   HOSTS   ADDRESS            PORTS   AGE
      path-ingress   nginx   *       [nginx_address]    80      7s
      
    2. 以下の例のようにブラウザまたは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はサービスで外部トラフィックをルーティングする設定で、ClusterLocalの値を使用できます。


    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で確認できます。


    この記事は役に立ちましたか?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.