NGINX Ingress Controller(NIC) 環境のセットアップ #### | 以下の手順に従ってNGINX Ingress Controllerのイメージを作成します | 参考: `Installation with Manifests `__ 1. 環境セットアップ ==== UDFのWEB SHELLを使用する場合は以下を実行ください。 .. code-block:: cmdin su ubuntu ファイルを取得します .. code-block:: cmdin cd ~/ git clone https://github.com/nginxinc/kubernetes-ingress/ --branch v3.1.1 cd ~/kubernetes-ingress ライセンスファイルをコピーしてください ファイルが配置されていない場合、トライアルを申請し証明書と鍵を取得してください なお、SSL証明書および鍵ファイルは以下に配置しています。 JumpBox:C:\Users\user\Desktop\Key ubuntu-host1:/home/ubuntu/ .. code-block:: cmdin cp ~/nginx-repo* . ls nginx-repo.* 2. コンテナイメージの作成 ==== | NGINX Plus + NGINX App Protectのコンテナイメージを作成します | 参考: `Building the Ingress Controller Image `__ .. code-block:: cmdin make debian-image-nap-dos-plus PREFIX=registry.example.com/root/nic/nginxplus-ingress-nap-dos TARGET=container TAG=3.1.1 # Image の Build は数分(約5分)必要となります docker images | grep nginxplus-ingress-nap-dos .. code-block:: bash :linenos: :caption: 実行結果サンプル registry.example.com/root/nic/nginxplus-ingress-nap-dos 3.1.1 9eca3c333eb6 About a minute ago 659MB Container Image のPushのためにレジストリへログイン .. code-block:: cmdin # registry.example.com にログイン docker login registry.example.com Username: root << 左の文字列を入力 Password: password << 左の文字列を入力 .. code-block:: bash :linenos: :caption: 実行結果サンプル WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded Container Image のPush .. code-block:: cmdin docker push registry.example.com/root/nic/nginxplus-ingress-nap-dos:3.1.1 3. NGINX Ingress Controller環境のセットアップ ==== 先程の手順で取得したGitHubのフォルダへ移動し、必要となるリソースをデプロイします。 .. code-block:: cmdin cd ~/kubernetes-ingress/deployments # Create RBAC kubectl apply -f common/ns-and-sa.yaml kubectl apply -f rbac/rbac.yaml kubectl apply -f rbac/ap-rbac.yaml kubectl apply -f rbac/apdos-rbac.yaml # Create Common resources kubectl apply -f ../examples/shared-examples/default-server-secret/default-server-secret.yaml kubectl apply -f common/nginx-config.yaml kubectl apply -f common/ingress-class.yaml # Create Custom Resource 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 kubectl apply -f common/crds/k8s.nginx.org_globalconfigurations.yaml kubectl apply -f common/crds/appprotect.f5.com_aplogconfs.yaml kubectl apply -f common/crds/appprotect.f5.com_appolicies.yaml kubectl apply -f common/crds/appprotect.f5.com_apusersigs.yaml kubectl apply -f common/crds/appprotectdos.f5.com_apdoslogconfs.yaml kubectl apply -f common/crds/appprotectdos.f5.com_apdospolicy.yaml kubectl apply -f common/crds/appprotectdos.f5.com_dosprotectedresources.yaml 4. NGINX App Protect Dosで利用するArbitratorを実行 ==== Deploymentの内容を確認 ``deployment/appprotect-dos-arb.yaml`` の内容を確認します。 .. code-block:: bash :linenos: :caption: deployment/appprotect-dos-arb.yaml kind: Deployment metadata: name: appprotect-dos-arb namespace: nginx-ingress spec: replicas: 1 selector: matchLabels: app: appprotect-dos-arb template: metadata: labels: app: appprotect-dos-arb spec: containers: - name: appprotect-dos-arb image: docker-registry.nginx.com/nap-dos/app_protect_dos_arb:1.1.0 imagePullPolicy: IfNotPresent resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 3000 securityContext: allowPrivilegeEscalation: false runAsUser: 1001 capabilities: drop: - ALL ``service/appprotect-dos-arb-svc.yaml`` の内容を確認します。 .. code-block:: bash :linenos: :caption: service/appprotect-dos-arb-svc.yaml apiVersion: v1 kind: Service metadata: name: svc-appprotect-dos-arb namespace: nginx-ingress spec: selector: app: appprotect-dos-arb ports: - name: arb port: 3000 protocol: TCP targetPort: 3000 デプロイします。 .. code-block:: cmdin kubectl apply -f deployment/appprotect-dos-arb.yaml kubectl apply -f service/appprotect-dos-arb-svc.yaml デプロイ結果を確認します。 .. code-block:: cmdin kubectl get deployment -n nginx-ingress .. code-block:: bash :linenos: :caption: 実行結果サンプル NAME READY UP-TO-DATE AVAILABLE AGE appprotect-dos-arb 1/1 1 1 4m32s .. code-block:: cmdin kubectl get pod -n nginx-ingress .. code-block:: bash :linenos: :caption: 実行結果サンプル NAME READY STATUS RESTARTS AGE appprotect-dos-arb-5d89486bbc-pkbrg 1/1 Running 0 4m43s .. code-block:: cmdin kubectl get svc -n nginx-ingress .. code-block:: bash :linenos: :caption: 実行結果サンプル NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc-appprotect-dos-arb ClusterIP None 3000/TCP 6s 5. NGINX Ingress Controllerの実行 ==== NGINX Ingress Controllerのpodを実行します。DeploymentとDaemonSetによる実行が可能ですが、のこの記事ではDeploymentで実行します。DaemonSetで実行したい場合にはマニュアルを参照して適切に読み替えて進めてください。 argsで指定するパラメータの詳細は `Command-line Arguments `__ を参照してください .. code-block:: cmdin ## cd ~/kubernetes-ingress/deployments vi deployment/nginx-plus-ingress.yaml コメントを付与した行を適切な内容に修正してください .. code-block:: yaml :linenos: :caption: deployment/nginx-plus-ingress.yaml :emphasize-lines: 5,12-16 ** 省略 ** spec: serviceAccountName: nginx-ingress containers: - image: registry.example.com/root/nic/nginxplus-ingress-nap-dos:3.1.1 # 対象のレジストリを指定してください imagePullPolicy: IfNotPresent name: nginx-plus-ingress ** 省略 ** args: - -nginx-plus - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret - -enable-app-protect # App Protect WAFを有効にします - -enable-app-protect-dos # App Protect DoSを利用する場合、有効にします - -enable-oidc # (追加) OIDCに必要となるArgsを有効にします - -enable-snippets # (追加) OIDCで一部設定を追加するためsnippetsを有効にします #- -v=3 # Enables extensive logging. Useful for troubleshooting. #- -report-ingress-status #- -external-service=nginx-ingress #- -enable-prometheus-metrics #- -enable-service-insight #- -global-configuration=$(POD_NAMESPACE)/nginx-configuration 修正したマニフェストを指定しPodを作成します。 .. code-block:: cmdin ## cd ~/kubernetes-ingress/deployments kubectl apply -f deployment/nginx-plus-ingress.yaml .. code-block:: bash :linenos: :caption: 実行結果サンプル deployment.apps/nginx-ingress created .. code-block:: cmdin kubectl get pods --namespace=nginx-ingress | grep nginx-ingress .. code-block:: bash :linenos: :caption: 実行結果サンプル nginx-ingress-7f67968b56-d8gf5 1/1 Running 0 3s .. code-block:: cmdin kubectl get deployment -n nginx-ingress | grep nginx-ingress .. code-block:: bash :linenos: :caption: 実行結果サンプル nginx-ingress 1/1 1 1 2m52s 6. NGINX Ingress Controller を外部へ NodePort で公開する ==== 本ラボの環境ではKubernetesへのアクセスを受けるため、NGINX Ingress Controllerを外部へNodePortで公開します。 ``service/nodeport.yaml`` の設定内容を確認します。type NodePortでHTTP、HTTPSで待ち受ける設定であることを確認します。 .. code-block:: yaml :linenos: :caption: service/nodeport.yaml apiVersion: v1 kind: Service metadata: name: nginx-ingress 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 NodePortをデプロイします。 .. code-block:: cmdin ## cd ~/kubernetes-ingress/deployments kubectl apply -f service/nodeport.yaml .. code-block:: bash :linenos: :caption: 実行結果サンプル service/nginx-ingress created .. code-block:: cmdin kubectl get svc -n nginx-ingress | grep nginx-ingress .. code-block:: bash :linenos: :caption: 実行結果サンプル nginx-ingress NodePort 10.108.250.160 80:32692/TCP,443:31957/TCP 5s このコマンドを実行した結果、Kubernetes の Worker Nodeでそれぞれのサービスに対しポートが割り当てられています。 図の内容を確認してください。 .. image:: ./media/kube_nodeport.jpg :width: 400 | クライアントからアクセスするため、HTTP(TCP/80)、HTTPS(TCP/443)を待ち受け、それぞれNodePortで公開するポート番号へ転送するLBを用意します。 | 今回のラボ環境では同Linux Host上にNGINX Plusをインストールし以下nginx.confとしました。NGINX OSSでも同様の設定で問題ありません .. NOTE:: NGINX Plusをインストールする場合、こちらの手順「 `NGINX Plusのインストール (15min) `__」を参考に、NGINX Plusをインストールしてください。 先程確認したNodePortで割り当てられたポート番号宛に通信を転送するように、NGINXを設定します。 .. code-block:: cmdin cd ~/ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf- cat << EOF > nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } # TCP/UDP load balancing # stream { upstream tcp80_backend { server node1:32692; # HTTP(TCP/80)に割り当てられたポート番号 } upstream tcp443_backend { server node1:31957; # HTTPS(TCP/443)に割り当てられたポート番号 } server { listen 80; proxy_pass tcp80_backend; } server { listen 443; proxy_pass tcp443_backend; } } EOF sudo cp nginx.conf /etc/nginx/nginx.conf sudo nginx -s reload 現在の状態は以下となり、サービスを外部に公開する準備が完了しました。 .. image:: ./media/kube_external_nginx.jpg :width: 400