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 が必要になります。
では、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システムの重要な基盤を設計・構築し、改善を続けながら運用しています。