😡
Ingressで異なるnamespaceにロードバランシングしたい ~4番目のService (CKAで見なかったやつ)~
きっかけ
以下の図のように、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.
多謝 等々感謝カンゲキ雨嵐なわけです。
ExternalNameとは
labelSelectorやpodSelectorを使わずにDNS名で指定するためのSVCです。
これを使わなければならなかったわけです。素人丸出しで悲しい。
疎通後の状況
構成図
※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
おしまい
Discussion