(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Openshift/IngressOperator】Routeを利用してServiceに割り振られる仕組み

スポンサーリンク

はじめに

Red Hat OpenShiftではIngress Operatorによって外部からのアクセスを可能にしています。
同コンポーネントはKubernetesにはデフォルトで付属している要素ではないので、IBM CloudでオーダーしたOpenshiftの環境にて本項目について調査してみました。

環境情報
$ oc version
Client Version: 4.6.X
Server Version: 4.6.X
Kubernetes Version: v1.19.X

IngressOperator/LoadBalancer

冒頭に記載した「IngressOperator」ですが実体は以下のDeploymentで

$ oc get deployment -n openshift-ingress-operator
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
ingress-operator   1/1     1            1           ...

ingresscontroller というリソース名で存在する下記を編集することでRoute関連の設定を編集することができます。

$ oc get ingresscontroller -n openshift-ingress-operator
NAME      AGE
default   ...

上記のオペレータによってロードバランス機能としてHAProxyを実装したPodが展開されていて、それは以下のnamespaceとなります。

$ oc get deployment -n openshift-ingress
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
router-default   2/2     2            2           ...

このPodは以下のサービスと紐付いており

$ oc get service -n openshift-ingress
NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                      AGE
router-default            LoadBalancer   ...    XX     80:30127/TCP,443:32225/TCP   ...
router-internal-default   ClusterIP      ...    <none>            80/TCP,443/TCP,1936/TCP     ...
router-tok04              LoadBalancer   ...   XX   80:31964/TCP,443:31232/TCP   ...
router-tok05              LoadBalancer   ...      XX     80:31762/TCP,443:31023/TCP   ...

提供されたドメイン名がDNSに登録されているので外部からのアクセス経路が存在しています。

$ ibmcloud oc nlb-dns ls --cluster XX
OK
Hostname                                                                                        IP(s)                                         Health Monitor
  SSL Cert Status   SSL Cert Secret Name                                          Secret Namespace
xx   XX,XX,XX   enabled  regenerating      ...   openshift-ingress

routerの中身

openshift-ingressプロジェクトに存在するPodまでの経路は確認できたので、ここからは同Podから別のServiceに対する割り振りです。

同Podの内部でpsコマンドを押下すると分かりますがhaproxyが動いています。

sh-4.4$ ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000030+      ... /usr/bin/openshift-router --v=2
1000030+    ... /usr/sbin/haproxy -f /var/lib/haproxy/conf/haproxy.config -p /var/lib/haproxy/run/haproxy.p
1000030+    ... /usr/sbin/haproxy -f /var/lib/haproxy/conf/haproxy.config -p /var/lib/haproxy/run/haproxy.p
1000030+    ... sh
1000030+    ... ps aux

そしてrouteとして切られている経路は

$ oc get route -A

以下に全て格納されているので

sh-4.4$ cat /var/lib/haproxy/conf/haproxy.config
...
backend be_secure:test-ns:test
  mode http
  option redispatch
  option forwardfor
  balance leastconn

  timeout check 5000ms
  http-request add-header X-Forwarded-Host %[req.hdr(host)]
  http-request add-header X-Forwarded-Port %[dst_port]
  http-request add-header X-Forwarded-Proto http if !{ ssl_fc }
  http-request add-header X-Forwarded-Proto https if { ssl_fc }
  http-request add-header X-Forwarded-Proto-Version h2 if { ssl_fc_alpn -i h2 }
  http-request add-header Forwarded for=%[src];host=%[req.hdr(host)];proto=%[req.hdr(X-Forwarded-Proto)]
  cookie e582e73d9c089af76cce24b0ddd0083f insert indirect nocache httponly secure attr SameSite=None
  server pod:test-8ddf59869-nfmfw:test:http:172.30.189.200:3001 172.30.189.200:3001 cookie ... weight 256 ssl verifyhost test.test-ns.svc verify required ca-file /var/run/configmaps/service-ca/service-ca.crt

端末>Router>Serviceとアクセスが可能となっています。

終わりに

Openshiftではrouteを作成することでrouterのhaproxy.configを書き換え、それによって任意のServiceに割り振る仕組みを提供しています。KubernetesではNginxベースのIngressControllerをよく見ますが、HAProxyベースとなるのでこのあたりは覚えておきたいです。

以上です。