Managed OpenShiftのLoad BalancerのIP Addressを調べる
簡易的なアプリの検証の関係で、指定したホストで動かしたい、が会社のドメインに登録するような正式なレベルではまだやりたくない、という状況があった。
そこでアクセス元の/etc/hosts
を書き換えるとともに、OpenShift上のRouteに登録する、という方法で対応することにしたが、/etc/hosts
に記載するべきIPアドレスがわからなくて困った。
調べ方はいくつかあったので、どちらも記録しておく。
ちなみに確認した環境はIBM CloudのManagedのOpenShift環境。AzureやAWSだとまたちょっと事情が違うかもしれない。
Digで確認する
まずは、比較的汎用性の高そうな方法から。
なんらかの方法でIngress Subdomainを調べる。例えば、デフォルトでアクセスできるインターネットアクセス向けのクラスターのURLのサブドメインなどがそれに該当。
IBM Cloudならクラスター一覧( https://cloud.ibm.com/kubernetes/clusters?platformType=openshift )から辿れる該当のクラスターの "Ingress Subdomain"を確認する。
例えば xxxx.jp-tok.containers.appdomain.cloud
のようなサブドメイン名が得られるので、これに対してdigコマンドをかける。
結果はこんな感じ。(一部置き換えている)
$ dig xxxx.jp-tok.containers.appdomain.cloud
; <<>> DiG 9.10.6 <<>> xxxx.jp-tok.containers.appdomain.cloud
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26408
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;xxxx.jp-tok.containers.appdomain.cloud. IN A
;; ANSWER SECTION:
xxxx.jp-tok.containers.appdomain.cloud. 300 IN A 1xx.1xx.xx.xx
;; Query time: 85 msec
;; SERVER: 1xx.1xx.xx.x#53(1xx.1xx.xx.x)
;; WHEN: Thu Apr 29 11:21:53 JST 2021
;; MSG SIZE rcvd: 224
ANSWER SECTIONに記載のある1xx.1xx.xx.xx
の箇所がそれ。(実際にはIPv4のアドレスが入っているがxxで置き換えている)
ここで得た結果を使い、/etc/hosts
に記載する。
例えば、DNSに登録なしに ocpcheck.example.com
ドメインにアクセスして試したいなら、次のように記載する。
1xx.1xx.xx.xx ocpcheck.example.com
その上で、OpenShiftのRouteリソースに例えば次のように設定する。
これで、ocpcheck.example.com とブラウザに入れると、アクセスできる。
apiVersion: route.openshift.io/v1
kind: Route
(中略)
spec:
host: ocpcheck.example.com
port:
targetPort: 8081
to:
kind: Service
name: ocpcheck
weight: 100
wildcardPolicy: None
Dig以外の方法で確認しても、/etc/hosts
への記載方法やRouteリソースの書き方については一緒。
この方法は一番わかりやすいのだけど、一方で少し公式っぽくないというか、ここで取れた値だと変更をWatchできないし、変わらない保証もないし、というところが僅かながらに懸念。検証目的なのでまあ良いのだけど。
OpenShiftのLoadBalancerリソースで確認する
これでなぜ取れるのか、実はわかっていない。
IBM CloudのManagedのOpenShiftを使っているのだから、きっとIBM Cloudのコマンドで取れるのだろうと思い探していた。
その中でこの辺りなどを見ていると、openshift-ingressというnamespaceに何かありそう、と思い、コマンドを流してみるとdigで得た結果と同じものが即座に得られた。
OpenShiftに確認して取れる、の方がOpenShiftで完結できる感じは良いなと思った。
openshift-ingressの他にopenshift-ingress-operatorも検索中にはよく出てきたので、このあたりをもっと理解すれば仕組みがわかるようになってくる、かもしれない。
Setting up Ingress in OpenShift 4 https://cloud.ibm.com/docs/openshift?topic=openshift-ingress-roks4
oc get all -n openshift-ingress
(前略)
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/router-default LoadBalancer 1xx.xx.1xx.1xx 1xx.1xx.xx.xx 80:31541/TCP,443:31206/TCP 302d
(後略)
ちなみに、このsvc/router-defaultを見てみるとspec.typeにLoadBalancerと書いてある。
職場の先輩に教えてもらったのだけど、このLoadBalancerというtypeはCloud Provider環境下でのみ有効なものの様子。詳しくは次のページを見ると雰囲気を掴める。
Create an External Load Balancer | Kubernetes
IBM Cloudのコマンドで確認する
これは使用しているクラウド特有の方法となる。
まず、構築しているクラスターのIDを確認する。
ちなみに、クラスター一覧( https://cloud.ibm.com/kubernetes/clusters?platformType=openshift )から辿れる該当のクラスターの "Cluster ID"を確認することでも把握できる。
$ ibmcloud ks cluster ls
OK
Name ID State Created Workers Location Version Resource Group Name Provider
xxxx xxxxclusteridxxxx normal 10 months ago 2 Tokyo 4.6.22_1538_openshift Default classic
次にここで得たCluster IDを使ってnlb-dnsをチェックすると回答が得られる。
$ ibmcloud oc nlb-dns ls --cluster xxxxclusteridxxxx
OK
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name Secret Namespace
xxxx.jp-tok.containers.appdomain.cloud 1xx.1xx.xx.xx None created xxxx openshift-ingress
次の記事の、IBM-provided domain and TLS secret: から確認できる。
Setting up Ingress in OpenShift 4 https://cloud.ibm.com/docs/openshift?topic=openshift-ingress-roks4
この辺も、概要を掴むのにはよかった。
Classic: About network load balancers (NLBs) https://cloud.ibm.com/docs/openshift?topic=openshift-loadbalancer-about&mhsrc=ibmsearch_a&mhq=openshift load balancing
丁寧にサービスから取る方法を調べてみたものの、正直digで調べるのが簡単だなという感想。
OpenShiftにアプリを乗せるのは大きな不安も無くなってきているけど、こういうベース部分についてはまだまだ全く勉強が足りてなさそうだ。
Discussion