😡

Ingressで異なるnamespaceにロードバランシングしたい ~4番目のService (CKAで見なかったやつ)~

2022/10/09に公開

きっかけ

以下の図のように、ingressと異なるnamespaceのserviceにロードバランシングするのがうまくいかなくて難儀しておりました。
散々デバッグして繋がらずにググる等の末解決したわけです。

結論

Service ExternalNameを使えよで終わりなんですが

「お前CKAで見かけなかったぞ、誰だよ!」

溶けた時間から八つ当たり心境に駆られる次第。
ingressもCKAだとあんまり突っ込んだ問題じゃなかったから意識してなかったです。
考えてみれば当たり前の話なんだけど、 インフラ業務未経験丸出しだよね。

状況

構成図

ざっくり以下の構成で疎通すると考えてましたが繋がりません。
※ingress-controllerは省略

最初に書いたingress.yaml

最初に書いたyamlをざっくり表すと以下のようなyaml。
※defaultのmanifestは省略。

kind: Ingress
metadata:
  name: sample-app
  namespace: ingress-basic
  annotations:
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/ssl-redirect: 'false'
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: sample-app
            port:
              number: 8080

疎通しない

疎通しない、ingresscontrollerをdebugしても認識してくれない。
ログ見ると

ingress-basic/sample-app

の文字が。。。。
そりゃ繋がらないわ

ExternalNameを使え

散々ググって以下の記事に行き着き解決しました。
God save me.
多謝 等々感謝カンゲキ雨嵐なわけです。

https://qiita.com/murata-tomohide/items/0538d03abde5c7ab94dd

ExternalNameとは

labelSelectorやpodSelectorを使わずにDNS名で指定するためのSVCです。
これを使わなければならなかったわけです。素人丸出しで悲しい。

https://kubernetes.io/ja/docs/concepts/services-networking/service/#externalname

疎通後の状況

構成図

※2022/10/10 16:52 マニフェストと画像に相違あり(ExternalNameの名前)

マニフェスト

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-app
  namespace: ingress-basic
  annotations:
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/ssl-redirect: 'false'
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: sample-app-default
            port:
              number: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: sample-app-default
  namespace: ingress-basic
spec:
  type: ExternalName
  externalName: sample-app.default.svc.cluster.local

名前空間について

公式に記載の通りServiceは須く、以下の形式でDNSエントリを持ちます。
デバッグする時に大事だから覚えておいた方がいいと思います。

<service-name>.<namespace-name>.svc.cluster.local

https://kubernetes.io/ja/docs/concepts/services-networking/service/#externalname

おしまい

Discussion