機械翻訳について

3 NGINX Ingress Controllerの使用

この章では、NGINX Ingress Controllerを使用してイングレス・ルールをテストする2つの例について説明します。

1つ以上のKubernetesイングレス、VirtualServerまたはVirtualServerRouteカスタム・リソース定義(CRD)を使用して、イングレス・ルールを作成できます。 これらの定義によってイングレス構成が設定されます。

例3-1 単一アプリケーション・ルーティング・テスト

この例では、NGINXアプリケーションに受信トラフィックを転送するイングレス・ルールを作成します。

  1. CRD YAMLファイルにデプロイメントおよび関連付けられたサービスを作成します:

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: container-registry.oracle.com/olcne/nginx:1.17.7 
            ports:
            - containerPort: 80
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
      - name: http
        port: 80
        targetPort: 80
  2. 次を使用してデプロイメントおよびサービスを作成します:

    kubectl apply -f filename.yaml
  3. NGINXサービスのYAMLファイルにイングレスCRDを作成します。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
    spec:
      ingressClassName: nginx
      rules:
      - http:
          paths:
            - path: /
              pathType: Prefix 
              backend:
                service: 
                  name: nginx-service
                  port:
                    number: 80 
  4. その後、次を使用してイングレスを作成できます:

    kubectl apply -f filename.yaml
  5. イングレスは次のものを使用して作成されます:

    kubectl get ingress

    出力は次のようになります:

    NAME              CLASS   HOSTS   ADDRESS           PORTS   AGE
    example-ingress   nginx   *       203.0.113.11      80      7m16s

    表示されるADDRESSは、ロード・バランサのアドレスでもあります。 これを確認するには、次を使用します:

    kubectl get service --namespace ingress-nginx

    出力は次のようになります:

    NAME                                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                      AGE
    myingress-nginx-controller             LoadBalancer   10.106.167.143   203.0.113.11      80:31036/TCP,443:32343/TCP   7d1h
    myingress-nginx-controller-admission   ClusterIP      10.105.9.191     <none>            443/TCP                      7d1h
  6. 次のものを使用してイングレス・ルールを表示できます:

    kubectl describe ingress example-ingress

    出力は次のようになります:

    Name:             example-ingress
    Labels:           <none>
    Namespace:        default
    Address:          203.0.113.11
    Ingress Class:    nginx
    Default backend:  <default>
    Rules:
      Host        Path  Backends
      ----        ----  --------
      *           
                  /   nginx-service:80 (10.244.1.4:80,10.244.3.4:80,10.244.4.3:80 + 1 more...)
    Annotations:  <none>
    Events:
      Type    Reason  Age                From                      Message
      ----    ------  ----               ----                      -------
      Normal  Sync    14m (x2 over 15m)  nginx-ingress-controller  Scheduled for sync

    これは、すべてのトラフィックがnginx-serviceにルーティングされることを示しています。

  7. curlコマンドを使用して、NGINXアプリケーションへのリクエストを作成します。 ロード・バランサのIPアドレスとイングレスを使用します。

    curl http://203.0.113.11

    出力は次のようになります:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
  8. イングレス、デプロイメントおよびサービスを削除するには、次を使用します:

    kubectl delete ingress example-ingress
    kubectl delete service nginx-service
    kubectl delete deployment nginx-deployment

例3-2 2つのアプリケーションおよびURLリダイレクション・テスト

このテスト・アプリケーションは、カスタマイズされたHTMLページを含む2つのNGINXデプロイメントと、デプロイメントごとに1つのサービスを作成します。 次に、URLに入力されたパスに応じて、これらのサービスにトラフィックをリダイレクトするイングレス・ルールが作成されます。

  1. デフォルトのwebサーバー・ページではなく、NGINXによって提供されるHTMLレスポンスを含むYAMLファイルを作成します。 サービスごとにConfigMapが提供されます。

    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: configmap-nginx-a
    data:
      index.html: |
        <html>
          <head>
            <title>NGINX Application A</title>
          </head>
          <body>
            <h1>This is from path /a to service nginx-a.</h1>
          </body>
        </html>
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: configmap-nginx-b
    data:
      index.html: |
        <html>
          <head>
            <title>NGINX Application B</title>
          </head>
          <body>
            <h1>This is from path /b to service nginx-b.</h1>
          </body>
        </html>
  2. その後、次を使用してConfigMapsを作成できます:

    kubectl apply -f filename.yaml
  3. CRD YAMLファイルに2つのNGINXデプロイメントおよび関連するサービスを作成します。 ボリュームは、ConfigMapsを使用する各デプロイメントに作成されます。 各デプロイメントには、データを返すアプリケーションを示す異なるHTMLページが用意されています。

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-a
      labels:
        app: nginx-a
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-a
      template:
        metadata:
          labels:
            app: nginx-a
        spec:
          containers:
          - name: nginx-a
            image: container-registry.oracle.com/olcne/nginx:1.17.7
            ports:
            - containerPort: 80
            volumeMounts:
            - name: volume-a
              mountPath: /usr/share/nginx/html
          volumes:
          - name: volume-a
            configMap:
              name: configmap-nginx-a
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-b
      labels:
        app: nginx-b
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-b
      template:
        metadata:
          labels:
            app: nginx-b
        spec:
          containers:
          - name: nginx-b
            image: container-registry.oracle.com/olcne/nginx:1.17.7 
            ports:
            - containerPort: 80
            volumeMounts:
            - name: volume-b
              mountPath: /usr/share/nginx/html
          volumes:
          - name: volume-b
            configMap:
              name: configmap-nginx-b
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: nginx-service-a
    spec:
      selector:
        app: nginx-a
      ports:
      - name: http
        port: 80
        targetPort: 80
    
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: nginx-service-b
    spec:
      selector:
        app: nginx-b
      ports:
      - name: http
        port: 80
        targetPort: 80
  4. 次を使用して、デプロイメントとサービスを作成します:

    kubectl apply -f filename.yaml
  5. NGINXサービスのYAMLファイルにイングレスCRDを作成します。 このイングレスでは、パス/aを含むトラフィックがnginx-service-aに送られ、パス/bnginx-service-bのトラフィックが送られます。 他のトラフィックは許可されません。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: / 
    spec:
      ingressClassName: nginx
      rules:
      - http:
          paths:
            - path: /a
              pathType: Prefix 
              backend:
                service: 
                  name: nginx-service-a
                  port:
                    number: 80 
            - path: /b
              pathType: Prefix 
              backend:
                service: 
                  name: nginx-service-b
                  port:
                    number: 80 
  6. その後、次を使用してイングレスを作成できます:

    kubectl apply -f filename.yaml
  7. 次のものを使用してイングレス・ルールを表示できます:

    kubectl describe ingress example-ingress

    出力は次のようになります:

    Name:             example-ingress
    Labels:           <none>
    Namespace:        default
    Address:          203.0.113.11
    Ingress Class:    nginx
    Default backend:  <default>
    Rules:
      Host        Path  Backends
      ----        ----  --------
      *           
                  /a   nginx-service-a:80 (10.244.2.8:80,10.244.4.5:80)
                  /b   nginx-service-b:80 (10.244.2.9:80,10.244.4.4:80)
    Annotations:  nginx.ingress.kubernetes.io/rewrite-target: /
    Events:       <none>
  8. curlコマンドを使用して、/aパスをURLに含めて、nginx-aアプリケーションへのリクエストを作成します。 ロード・バランサのIPアドレスとイングレスを使用します。

    curl http://203.0.113.11/a

    出力は次のようになります:

    <html>
      <head>
        <title>NGINX Application A</title>
      </head>
      <body>
        <h1>This is from path /a to service nginx-a.</h1>
      </body>
    </html>

    nginx-aデプロイメントは、デフォルトのHTMLページで応答し、nginx-service-aサービスを介して実行されることを示します。

  9. curlコマンドを使用して、/bパスをURLに含めて、nginx-bアプリケーションへのリクエストを作成します。

    curl http://203.0.113.11/b

    出力は次のようになります:

    <html>
      <head>
        <title>NGINX Application B</title>
      </head>
      <body>
        <h1>This is from path /b to service nginx-b.</h1>
      </body>
    </html>

    nginx-bデプロイメントは、デフォルトのHTMLページで応答し、nginx-service-bサービスを介して実行されることを示します。

  10. curlコマンドを使用して、URLへのパスを追加せずにリクエストを作成します。

    curl http://203.0.113.11

    出力は次のようになります:

    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>

    このURLにイングレス・ルールが指定されていないため、トラフィックは許可されません。

  11. イングレス、デプロイメント、サービスおよびConfigMapsは、次を使用して削除できます:

    kubectl delete ingress example-ingress
    kubectl delete service nginx-service-a
    kubectl delete service nginx-service-b
    kubectl delete deployment nginx-deployment-a
    kubectl delete deployment nginx-deployment-b
    kubectl delete configmaps configmap-nginx-a
    kubectl delete configmaps configmap-nginx-b