♨️
Kubernetes の ingress-nginx で basic 認証をかける/かけないホストを一緒に記述する
ingress-nginx の ingress マニフェストでは、basic 認証をかけるとマニフェスト全体に効いてしまいます。
basic 認証をかけたいホストとかけたくないホストを一つの ingress-nginx で動かすときは、ちょっとひと工夫必要になります。
basic 認証自体の設定はマニュアルをご覧ください。
コード
工夫といっても下記のようにマニフェストを二つ書けばいいだけです。
ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-auth
namespace: 【namespace】
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
spec:
ingressClassName: nginx
rules:
- host: 【basic認証をかけたいホスト】
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: 【basic認証をかけたいサービス】
port:
number: 80
tls:
- hosts:
- 【basic認証をかけたいホスト】
secretName: 【TLS証明書の名前】
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
namespace: 【namespace】
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
ingressClassName: nginx
rules:
- host: 【basic認証をかけたくないホスト】
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: 【basic認証をかけたくないサービス】
port:
number: 80
tls:
- hosts:
- 【basic認証をかけたくないホスト】
secretName: 【TLS証明書の名前】
片方のマニフェストには basic 認証の設定が入っていて、もう片方には入っていません。
これで切り分けます。
これを読み込むと、
$ kubectl apply -f ingress-nginx.yaml
下記のように二つの ingress が立ち上がります。
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
【namespace】 ingress.networking.k8s.io/ingress-auth nginx 【basic認証をかけたいホスト】 【IPアドレス】 80, 443 14h
【namespace】 ingress.networking.k8s.io/ingress nginx 【basic認証をかけたくないホスト】 【IPアドレス】 80, 443 14h
両方とも問題なく動作します。
さいごに
Kubernetes 楽しいですね!
ただ、進化が速かったり情報の新旧が入り乱れてたりして、なかなか目的の情報にたどり着けなかったりするので、あっという間に時間が溶けていきます……
一度マニフェストを作ってしまえば、あとはいつでも何度でも立ち上げられるんですけどね。
ここでは、クラスターを作る際に得られた小技などをいろいろ紹介していきたいです。
Discussion