ネットワーク

NGINX Plus Ingress Controller を触ってみた

kubernetes の Ingress Controller として、NGINX Plus を使ってみた話。

はじめまして。

東京エレクトロンデバイスでエンジニアをやっている narai です。

 

grasys 様とリレー形式のブログもTEDでは第4回目になりました。私からは NGINX Plus Ingress Controller について紹介したいと思います。また、本ブログの続きとして「NGINX Plus Ingress Controller を触ってみた(CRD 設定編」も公開致しましたので合わせてご覧ください!


さっそく本題に入ります。

今回はローカル環境で  NGINX Plus Ingress Controller を自由にいじれるように minikube を使用して Ingress Controller を展開できるようにしたいと思います。  

初めに、Ingress とは以下のような役割を持つものです。  

Kubernetes クラスタ環境内にデプロイされた Pod に対して、外部からアクセスするために、外部疎通できる URL や負荷分散、SSL/TLS終端の機能を提供するものであり、Ingress 単体では動作せず、必ず Controller が必要になります。

詳細は以下のURLを参照ください
 
 

では、NGINX を Ingress Controller として使ってみましょう・・・と、言いたいところですが、 NGINX Ingress Controller にはいくつか種類がありますので、ここから確認していきましょう。

 

  • kubernetes/ingress-nginx
    Kubernetes コミュニティによって管理されているオープンソースの NGINX Ingress Controller です。

  • nginxinc/kubernetes-ingress with NGINX
    F5/NGINX コミュニティによって管理されているオープンソースの NGINX Ingress Controller です。

  • nginxinc/kubernetes-ingress with NGINX Plus
    F5/NGINX によって開発/保守されている商用版の NGINX Ingress Controller です。

nginxinc/kubernetes-ingress with NGINX Plus は他の製品に比べて、高度な負荷分散や JWT 認証、セッション管理等があらかじめ含まれております。また、当社やメーカーによるサポートもついています。                           

 

今回、僕がいじるのは nginxinc/kubernetes-ingress with NGINX Plus (以降、NGINX Plus Ingress Controller) になります。

 
 

NGINX Plus Ingress Controller のインストール

それでは kubernetes 環境に NGINX Plus Ingress Controller をインストールしてみます。

環境

  • ubuntu 20.04
  • Docker 20.10.3
  • minikube v1.25.2
  • git 2.25.1

NGINX Plus Ingress Controller のインストール方法は多数ありますが、今回はマニフェストを使用する方法を試します。

事前準備

NGINX Plus Ingress Controller のコンテナイメージは F5 Docker Registry にあります。

F5 Docker Registry は Private Registry であるため、そのままでは minikube から参照できません。

Secret を作成して F5 Docker Registry  からコンテナイメージを Pull できるようにしますが、そのために、NGINX Plus Ingress Controller ライセンスに付与されている JWT token を使う必要があります。

 ※ JWT 認証については、あつふみさんが詳しく書いていますので、NGINX PlusでJWT認証をやってみた! をご覧ください。

 

F5 Docker Registry を使うための secret を作成するコマンドは以下となります。  

$ kubectl create secret docker-registry regcred --docker-server=private-registry.nginx.com --docker-username=<JWT Token> --docker-password=none -n nginx-ingress

  • docker-server には F5 docker registry である  private-registry.nginx.com を指定します
  • username に NGINX ライセンスの JWT token の値を指定します
  • password に none を指定します

※ JWT token の値はパスワードではなくユーザ名に入力してください。

 

以下のように、regcred という名前の secret が作成されていれば準備完了です。

$ kubectl get secret -n nginx-ingress
NAME                  TYPE                                  DATA   AGE
default-token-5tdjl   kubernetes.io/service-account-token   3      56m
regcred               kubernetes.io/dockerconfigjson        1      6s

 

NGINX Plus Ingress Controller のインストール

それでは NGINX Plus Ingress Controller をインストールしていきます。

 

まずは、github から Ingress Controller リポジトリを Clone します。

$ git clone https://github.com/nginxinc/kubernetes-ingress.git

clone したファイルの deployment フォルダにインストールに必要なマニフェスト(yaml) が保存されていますので、これを使って環境を作成します。

deployment フォルダに移動します。

$ cd kubernetes-ingress/deployments

 

NGINX 用に RBAC を構成します

NGINX Plus Ingress Controller 用の名前空間とサービスアカウントを作成します。

$ kubectl apply -f common/ns-and-sa.yaml

Cluster Role を作成して nginx-ingress Service Account に紐づけます。

$ kubectl apply -f rbac/rbac.yaml

 

共通リソースを作成します

TLS 証明書を Secret に登録します。

この証明書は設定していないドメインからのリクエストに対して、応答する際に使用しますので key と crt は環境に合わせて書き換えてください。今回は検証なのでデフォルトの証明書を使用します。

$ kubectl apply -f common/default-server-secret.yaml

NGINX Plus Ingress Controller の設定用の ConfigMap を作成します。

$ kubectl apply -f common/nginx-config.yaml

Ingress Class を作成します。

$ kubectl apply -f common/ingress-class.yaml

 

カスタムリソースを作成します

これらをデプロイすることで NGINX Plus Ingress Controller の pod が使用できるようになります。

$ kubectl apply -f common/crds/k8s.nginx.org_virtualservers.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_virtualserverroutes.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_transportservers.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_policies.yaml

 

NGINX Plus Ingress Controller をデプロイします

いよいよ、NGINX Plus Ingress Controller をデプロイします。  

デプロイする方法もいくつかありますが、今回は deployment リソースを使用します。

コンテナイメージを F5 docker Registry からデプロイするために、deployment/nginx-plus-ingress.yaml を以下のように書き換えます。

    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: nginx/nginx-ingress:2.2.0
        imagePullPolicy: IfNotPresent
        name: nginx-ingress

  ↓

    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: private-registry.nginx.com/nginx-ic/nginx-plus-ingress:2.2.2  <-!!!
        imagePullPolicy: IfNotPresent
        name: nginx-ingress
      imagePullSecrets:                                                      <-!!!
      - name: regcred                                                        <-!!!
  • image はコンテナイメージを Pull する場所を指定します
  • imagePullSecrets は使用する Secret を指定します

 

NGINX Plus IngressController をデプロイします。

$ kubectl apply -f deployment/nginx-plus-ingress.yaml

正常にデプロイできているか確認します。

$ kubectl get pods --namespace=nginx-ingress

以下のように Running となっていれば問題ないです。

$ kubectl get pods --namespace=nginx-ingress
NAME READY STATUS RESTARTS AGE
nginx-ingress-7b8bf494d6-qqhx6 1/1 Running 0 3m42s

これで、NGINX Plus Ingress Controller のデプロイが完了です。

 

が、これだけでは動作しません。

Ingress と Ingress Controller は別物なので、外部からの通信を pod に渡すためには Ingress をデプロイする必要があります。

今回はサービス用の pod も一緒に作るので、以下のようなマニフェストを用意しました。

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-svc
  namespace: nginx-ingress
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    targetPort: 443
    protocol: TCP
    name: https
  selector:
    app: nginx-ingress
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: nginx-ingress
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  defaultBackend:
    service:
      name: nginx-ingress-test-default
      port:
        number: 80
  rules:
  - host: wwwtest.nginx.dev.tedlab.net
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-ingress-test
            port:
              number: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-test-default
  namespace: nginx-ingress
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: nginx-ingress-test
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-test
  namespace: nginx-ingress
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: nginx-ingress-test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: testapp
  namespace: nginx-ingress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-ingress-test
  template:
    metadata:
      labels:
        app: nginx-ingress-test
    spec:
      containers:
      - name: testapp
        image: nginxdemos/nginx-hello
        ports:
        - containerPort: 8080

これで、外部からアクセスできるようになります。 Service の port 番号を確認して、


$ kubectl get svc --namespace=nginx-ingress
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
nginx-ingress-svc            NodePort    172.20.79.243   <none>        80:30557/TCP,443:31725/TCP   27m

以下のようにアクセスすれば、 Hello world が返ってきます

$ curl http://<kubernetesのnode ip>:30577

Hello World

これで、NGINX Plus Ingress Controller を導入することができました。

今回は、一つ一つ確認の意味を込めてマニフェストからインストールしましたが、helm を使えばもっと簡単にインストールできそうです。具体的な方法は以下を見てください。

https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/

 

ちょっと長くなってしまったので、Ingress Controller の具体的な設定方法は次の機会に掲載しようと思います。

 


最後に、NGINX Plus Ingress Controller を経由した通信は以下のようなイメージとなります。 クライアントからのリクエストを NGINX Plus Ingress Controller の pod で受けた際、Ingress Resource を参照して Service に転送します。 NGINX Plus Ingress Controller は Pod なので ReplicaSet を使用して Scale や Self healing が可能です。

 


 

 

今回の私のブログはここまでとなります。

また、第二弾!NGINX Plus Ingress Controller を触ってみた(CRD 設定編)を公開致しましたので合わせてご覧ください!

 


<<  grasys×F5×TED ブログ一覧  >>

4月27日   NGINX Plusの検証をした!(grasys様)

6 2日    grasys×F5×TEDが徹底解析! NGINX Plusの仕組みがよくわかる!TED

6月9日    NGINX Plusのインストール方法とLBの基本設定(grasys様)

6月16日   NGINX PlusでJWT認証をやってみた!(TED)

6月22日  NGINX PlusのLB機能:アクティブヘルスチェック&セッション維持 (grasys様)

6月30日 NGINX Controllerをインストールしてみた!(TED)

7月7日 NGINX PlusのLB機能:DNSディスカバリー  (grasys様)

7月14日  NGINX Plus Ingress Controller を触ってみた (TED)

7月25日 NGINX WAFを試してみよう! (TED)


【 株式会社grasys:https://www.grasys.io/ 】

大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

この記事に関連する製品・サービス

この記事に関連する記事