🔍

Managed OpenShiftのLoad BalancerのIP Addressを調べる

2021/04/29に公開

簡易的なアプリの検証の関係で、指定したホストで動かしたい、が会社のドメインに登録するような正式なレベルではまだやりたくない、という状況があった。
そこでアクセス元の/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

https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/

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