♨️

Kubernetes の ingress-nginx で basic 認証をかける/かけないホストを一緒に記述する

2024/07/15に公開

ingress-nginx の ingress マニフェストでは、basic 認証をかけるとマニフェスト全体に効いてしまいます。

basic 認証をかけたいホストとかけたくないホストを一つの ingress-nginx で動かすときは、ちょっとひと工夫必要になります。

basic 認証自体の設定はマニュアルをご覧ください。
https://kubernetes.github.io/ingress-nginx/examples/auth/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