🔀

Nginx Ingress Controller (nginxinc) の VirtualServerでhttpsするメモ

2023/02/09に公開

まえがき

  • 今回の話は nginxinc/nginx-ingress の方
  • Nginx Ingress Controllerには nginxinc/nginx-ingress 版 と k8s版があり、どちらも同じベースだが結構違う(のではっきりさせておかないと混乱する)
  • helmを使ってインストールしている
  • nginxinc/nginx-ingressのバージョンは 3.0.1。2.4でも同じだと思うが新し目の機能なようなので新しいバージョンを使った方がよい
  • SSL証明書はcert-managerと連携してcert-managerに取得してもらう(なのでcert-managerは先に設定されている必要がある)

完成形

とやかく言う前に完成形はこちら。

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: nicename
spec:
  host: nice.example.com
  tls:
    secret: nicename-tls
    cert-manager:
      cluster-issuer: "letsencrypt-prod"
      common-name: "nice.example.com"
    redirect:
      enable: true
  upstreams:
  - name: web
    service: niceservice
    port: 8080
  routes:
  - path: /
    action:
      pass: web

ハマったポイント

enableCertmanager=falseのときのエラーメッセージ

VirtualServer default/virtualservername was rejected with error: spec.tls.cert-manager: Forbidden: field requires cert-manager enablement

nginx-ingressのdeploymentの起動オプションに --enable-certmanager=false が指定されている(デフォルト値)

解決方法

helmを使っている場合は以下のコマンドで変更可能。
手動でdeploymentを投入しているのであればそれを修正すればOK

helm upgrade prod nginx-stable/nginx-ingress --set controller.enableCertManager=true

蛇足

設定できる設定値

https://github.com/nginxinc/kubernetes-ingress/blob/main/deployments/helm-chart/values.yaml

ドキュメント

https://docs.nginx.com/nginx-ingress-controller/configuration/virtualserver-and-virtualserverroute-resources/#virtualservertlscertmanager

helmによるアップグレードの方法

知らなくてぐぐったのでメモ

(以前にこれをやっていない場合に限る。ローカルのPCに対する設定なので何度やっても問題はない)
helm repo add nginx-stable https://helm.nginx.com/stable
helm repo update
helm upgrade prod nginx-stable/nginx-ingress --set controller.enableCertManager=true

VirtualServerにするとなにか良いことがあるの?

Ingressでも同じことは可能なはず。しかし、文法的に厳しい部分がある(annotationに無理やり指定するのでエラーがよくわからない感じになるなど)
が、VirtualServerならわざわざCRDを作っただけあって割と自然である。

Discussion