3 NGINX Ingress Controllerの使用
この章では、NGINX Ingress Controllerを使用してイングレス・ルールをテストする2つの例について説明します。
1つ以上のKubernetesイングレス、VirtualServerまたはVirtualServerRouteカスタム・リソース定義(CRD)を使用して、イングレス・ルールを作成できます。 これらの定義によってイングレス構成が設定されます。
例3-1 単一アプリケーション・ルーティング・テスト
この例では、NGINXアプリケーションに受信トラフィックを転送するイングレス・ルールを作成します。
-
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
-
次を使用してデプロイメントおよびサービスを作成します:
kubectl apply -f filename.yaml
-
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
-
その後、次を使用してイングレスを作成できます:
kubectl apply -f filename.yaml
-
イングレスは次のものを使用して作成されます:
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
-
次のものを使用してイングレス・ルールを表示できます:
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
にルーティングされることを示しています。 -
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>
-
イングレス、デプロイメントおよびサービスを削除するには、次を使用します:
kubectl delete ingress example-ingress kubectl delete service nginx-service kubectl delete deployment nginx-deployment
例3-2 2つのアプリケーションおよびURLリダイレクション・テスト
このテスト・アプリケーションは、カスタマイズされたHTMLページを含む2つのNGINXデプロイメントと、デプロイメントごとに1つのサービスを作成します。 次に、URLに入力されたパスに応じて、これらのサービスにトラフィックをリダイレクトするイングレス・ルールが作成されます。
-
デフォルトの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>
-
その後、次を使用してConfigMapsを作成できます:
kubectl apply -f filename.yaml
-
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
-
次を使用して、デプロイメントとサービスを作成します:
kubectl apply -f filename.yaml
-
NGINXサービスのYAMLファイルにイングレスCRDを作成します。 このイングレスでは、パス
/a
を含むトラフィックがnginx-service-a
に送られ、パス/b
がnginx-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
-
その後、次を使用してイングレスを作成できます:
kubectl apply -f filename.yaml
-
次のものを使用してイングレス・ルールを表示できます:
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>
-
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
サービスを介して実行されることを示します。 -
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
サービスを介して実行されることを示します。 -
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にイングレス・ルールが指定されていないため、トラフィックは許可されません。
-
イングレス、デプロイメント、サービスおよび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