はじめに
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ベースとなるのでこのあたりは覚えておきたいです。
以上です。