🔀
Nginx Ingress Controller (nginxinc) の VirtualServerでhttpsするメモ
まえがき
- 今回の話は 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
蛇足
設定できる設定値
ドキュメント
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