OpenShift 4.2におけるProxy環境下でのインストール

Red Hatの福岡オフィスでソリューションアーキテクトをしている田中司恩です。 今回はOpenShift 4.2で追加される「Proxy環境下でのインストール(Cluster-wide Proxy)」について説明していきます。*1

説明に使用する環境構成は前回記事と同様ですので、合わせてこちらもご参照ください。

rheb.hatenablog.com


本記事の章立てはこのようになります。

  • Proxy環境下でのインストール概要
  • インストール方法
  • インストール後の確認

対応する日本語ドキュメントは下記になります。

6.1.7.2. インストール時のクラスター全体のプロキシーの設定

Proxy環境下でのインストール概要

OpenShift 4.1では、インストールの時点から各ノードがインターネットへ接続できる必要がありました。 OpenShift 4.2からは新たにProxyのサポートが追加され、インストール時およびインストール後のクラスターから、Proxy経由でのインターネット通信が可能となりました。 主な用途はオンプレ環境にクラスタを配置するような場合で、インターネットへのアクセスにProxyの利用が必須な状況に対応が可能です。 Proxyの問題で躊躇していたような方も、これにより検証などが進めやすくなるのではないでしょうか。

Cluster-wide Proxy
Cluster-wide Proxy

また、Proxyも無く、完全に制限された環境にクラスタを配置するオプションについてもOpenShift 4.2からサポートされます。これについては機会があれば別途解説できればと思います。*2

インストール方法

では、Proxy環境下でのインストール方法について説明していきます。 前回の記事同様に、ベアメタルでのUPIインストールを例にします。 ※なお、現時点ではOpenShift 4.2はGAになっていないので、Developer Preview版を利用して説明します。*3

インストール構成

今回利用する環境は、前回記事の環境に少し変更を加えました。

  • Proxyサーバーの追加
  • 踏み台サーバーのNATをオフ*4

検証環境ネットワーク構成図
検証環境ネットワーク構成図

この環境では、社内ネットワークのルーターは、検証用ネットワークへの戻りルートを知らないので、結果的に検証用ネットワークからはProxyサーバーを経由しないとインターネットへの接続が出来ない構成となっています。*5

また、社内Proxyサーバーは、以下のような要件となっています。

  • Proxyはsquidで構成
  • HTTPおよびHTTPSはTCP:8080で待ち受け。ただし、テスト時はHTTPまたはHTTPSどちらかのみに切り替えて実行。*6
  • HTTPSはSSL Bumpで構成
  • ユーザー認証有り(ID: user/PASS: user)
  • OSに検証用ネットワークへの戻りルートを静的に追加

インストール設定ファイル

UPIインストール方法自体は前回記事と同様です。 異なるのは、Proxy設定をインストール設定ファイルinstall-config.yamlに記載する点です。

設定する内容は下記の項目です。

proxy:
  httpProxy: http://<username>:<pswd>@<ip>:<port> 
  httpsProxy: http://<username>:<pswd>@<ip>:<port> 
  noProxy: example.com 
additionalTrustBundle: | 
    -----BEGIN CERTIFICATE-----
      <MY_TRUSTED_CA_CERT>
    -----END CERTIFICATE-----
  • 必須項目はhttpProxyです。httpsProxyを省略した場合は、httpProxyのみが使用されます。
  • URLスキーマはhttp://のみサポート
  • ユーザー認証がある場合は、IPアドレスの前に付与します。
  • noProxyには直接アクセスしたい宛先をカンマ区切りで記載します。ドメイン名やIPアドレス、ネットワークCIDRなどが使用できます。
  • additionalTrustBundle:SSLサーバー証明書の内容をここに記載します。

各設定は利用するProxyサーバーに合わせて変更してください。 HTTP、HTTPSでの設定例は下記の通りです。

HTTP場合
apiVersion: v1
baseDomain: example.local
proxy:
  httpProxy: http://user:user@192.168.1.22:8080
  noProxy: example.local
compute:
...
HTTPSの場合
apiVersion: v1
baseDomain: example.local
proxy:
  httpProxy: http://user:user@192.168.1.22:8080
  httpsProxy: http://user:user@192.168.1.22:8080
  noProxy: example.local,172.16.0.0/24
additionalTrustBundle: |
    -----BEGIN CERTIFICATE-----
      <MY_TRUSTED_CA_CERT>
    -----END CERTIFICATE-----
compute:
...
※注意点。
  • noProxybaseDomainを指定しておいた方が良いです。インストール後半で、クラスタからoauth-openshift、consoleへのルートへアクセスできず、authenticationとconsole operatorが起動しません。
  • HTTPSの場合、noProxyに各ノードのIPアドレスまたはネットワークアドレスを指定する必要が有ります。インストール後半で、クラスタからoauth-openshiftへのアクセスでエラーになり、authentication operatorが起動しません。
    • エラー内容 WellKnownEndpointDegraded: failed to GET well-known https://172.16.0.101:6443/.well-known/oauth-authorization-server: x509: certificate signed by unknown authority
  • additionalTrustBundleにSSLサーバー証明書をコピペした場合は、スペース(1つ以上)でインデントを行うこと。

インストールの実行

install-config.yaml作成後の手順は通常と同じです。前回の記事を参考にしてください。 インストール開始後は、まずBootstrapノードがquay.ioに接続します。トレースを行う場合は、まずはBootstrapノードが通信できているかどうかを確認してみてください。 参考に検証環境でのProxyサーバー(squid)のログを載せておきます。

HTTP接続時のログ
1570812044.098    920 172.16.0.100 TCP_TUNNEL/200 5591 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812044.938    839 172.16.0.100 TCP_TUNNEL/200 6820 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812045.753    814 172.16.0.100 TCP_TUNNEL/200 7239 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812046.572    816 172.16.0.100 TCP_TUNNEL/200 7509 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812047.479    906 172.16.0.100 TCP_TUNNEL/200 7139 CONNECT d3uo42mtx6z2cr.cloudfront.net:443 user HIER_DIRECT/99.86.193.123 -
1570812048.261    779 172.16.0.100 TCP_TUNNEL/200 7480 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812048.270    786 172.16.0.100 TCP_TUNNEL/200 7480 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812048.297    814 172.16.0.100 TCP_TUNNEL/200 7480 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812048.329    846 172.16.0.100 TCP_TUNNEL/200 7480 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812048.337    854 172.16.0.100 TCP_TUNNEL/200 7509 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812048.477    994 172.16.0.100 TCP_TUNNEL/200 7509 CONNECT quay.io:443 user HIER_DIRECT/54.204.46.170 -
1570812049.042    744 172.16.0.100 TCP_TUNNEL/200 7206 CONNECT d3uo42mtx6z2cr.cloudfront.net:443 user HIER_DIRECT/99.86.193.123 -
1570812049.671   1409 172.16.0.100 TCP_TUNNEL/200 515090 CONNECT d3uo42mtx6z2cr.cloudfront.net:443 user HIER_DIRECT/99.86.193.123 -
1570812050.595   2324 172.16.0.100 TCP_TUNNEL/200 4256164 CONNECT d3uo42mtx6z2cr.cloudfront.net:443 user HIER_DIRECT/99.86.193.123 -
...
  • HTTPでSSLをトンネリングしていることが、ログ上のTCP_TUNNELで確認できます
HTTPS接続時のログ
1570907184.934    650 172.16.0.100 NONE/200 0 CONNECT quay.io:443 user HIER_DIRECT/23.23.158.172 -
1570907185.146    192 172.16.0.100 TCP_MISS/401 385 GET https://quay.io/v2/ user HIER_DIRECT/23.23.158.172 text/html
1570907185.738    591 172.16.0.100 NONE/200 0 CONNECT quay.io:443 user HIER_DIRECT/23.23.158.172 -
1570907185.996    254 172.16.0.100 TCP_MISS/200 1614 GET https://quay.io/v2/auth? user HIER_DIRECT/23.23.158.172 application/json
1570907186.622    625 172.16.0.100 NONE/200 0 CONNECT quay.io:443 user HIER_DIRECT/23.23.158.172 -
1570907186.867    241 172.16.0.100 TCP_MISS/200 2033 GET https://quay.io/v2/openshift-release-dev/ocp-release-nightly/manifests/sha256:75f065cf0590077ffba27ac61e104420660b8d2a344e09a11edd3cde50d14b01 user HIER_DIRECT/23.23.158.172 application/vnd.docker.distribution.manifest.v2+json
1570907187.457    588 172.16.0.100 NONE/200 0 CONNECT quay.io:443 user HIER_DIRECT/23.23.158.172 -
1570907187.709    245 172.16.0.100 TCP_MISS/302 2274 GET https://quay.io/v2/openshift-release-dev/ocp-release-nightly/blobs/sha256:5b7c299128e6dc655d47b57424e9cfde33585ed958ba5572ec1b184d5fb81866 user HIER_DIRECT/23.23.158.172 text/html
1570907187.829    119 172.16.0.100 NONE/200 0 CONNECT d3uo42mtx6z2cr.cloudfront.net:443 user HIER_DIRECT/13.224.151.231 -
1570907188.572    738 172.16.0.100 TCP_MISS/200 2125 GET https://d3uo42mtx6z2cr.cloudfront.net/sha256/5b/5b7c299128e6dc655d47b57424e9cfde33585ed958ba5572ec1b184d5fb81866? user HIER_DIRECT/13.224.151.231 binary/octet-stream
1570907189.148    572 172.16.0.100 NONE/200 0 CONNECT quay.io:443 user HIER_DIRECT/23.23.158.172 -
1570907189.153    577 172.16.0.100 NONE/200 0 CONNECT quay.io:443 user HIER_DIRECT/23.23.158.172 -
1570907189.159    584 172.16.0.100 NONE/200 0 CONNECT quay.io:443 user HIER_DIRECT/23.23.158.172 -
...
  • GET https://〜のログが確認できるので、ProxyサーバーからSSLで通信していることが分かります

インストール後の確認

無事にクラスタが起動したら、下記の操作でインストール後の設定を確認してください。

HTTPの場合

# oc get proxy/cluster -o yaml
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
  creationTimestamp: "2019-10-11T16:44:26Z"
  generation: 1
  name: cluster
  resourceVersion: "429"
  selfLink: /apis/config.openshift.io/v1/proxies/cluster
  uid: 634d22a2-ec46-11e9-a47f-000c29e26ff4
spec:
  httpProxy: http://user:user@192.168.1.22:8080
  noProxy: example.local
  trustedCA:
    name: ""
status:
  httpProxy: http://user:user@192.168.1.22:8080
  noProxy: .cluster.local,.svc,10.0.0.0/16,10.128.0.0/14,127.0.0.1,172.30.0.0/16,api-int.test.example.local,api.test.example.local,etcd-0.test.example.local,etcd-1.test.example.local,etcd-2.test.example.local,example.local,localhost
  • status:noProxyに自動的にパラメーターが追加されているのが確認できます

HTTPSの場合

# oc get proxy/cluster -o yaml
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
  creationTimestamp: "2019-10-12T19:12:15Z"
  generation: 1
  name: cluster
  resourceVersion: "430"
  selfLink: /apis/config.openshift.io/v1/proxies/cluster
  uid: 33d1a475-ed24-11e9-96e7-000c29e26ff4
spec:
  httpProxy: http://user:user@192.168.1.22:8080
  httpsProxy: http://user:user@192.168.1.22:8080
  noProxy: example.local,172.16.0.0/24
  trustedCA:
    name: user-ca-bundle
status:
  httpProxy: http://user:user@192.168.1.22:8080
  httpsProxy: http://user:user@192.168.1.22:8080
  noProxy: .cluster.local,.svc,10.0.0.0/16,10.128.0.0/14,127.0.0.1,172.16.0.0/24,172.30.0.0/16,api-int.test.example.local,api.test.example.local,etcd-0.test.example.local,etcd-1.test.example.local,etcd-2.test.example.local,example.local,localhost
  • status:noProxyに自動的にパラメーターが追加されているのが確認できます
  • trustedCAuser-ca-bundleで登録されていることが確認できます。

user-ca-bundleの詳細は下記のコマンドで確認できます。

# oc get cm/user-ca-bundle -n openshift-config -o yaml
apiVersion: v1
data:
  ca-bundle.crt: |
    -----BEGIN CERTIFICATE-----
      <MY_TRUSTED_CA_CERT>
    -----END CERTIFICATE-----
kind: ConfigMap
metadata:
  creationTimestamp: "2019-10-12T15:29:28Z"
  name: user-ca-bundle
  namespace: openshift-config
  resourceVersion: "279"
  selfLink: /api/v1/namespaces/openshift-config/configmaps/user-ca-bundle
  uid: 1448c4a4-ed05-11e9-8305-000c29e26ff4

GUIで確認する場合

Cluster Settings > Global Configration > Proxy で、YAMLを開くと同じ内容が確認できます。 また、インストール後にクラスタからProxyの通信が問題なく行えるか確認したい場合に簡単に確認する方法があります。 Cluster Settings > Overview で、Channelを他の物に切り替える度に通信が発生します。 Proxyサーバー側で下記ような通信ログを確認すると通信の有無が確認できます。

Channel切り替え
Channel切り替え

1570981786.525    567 172.16.0.101 NONE/200 0 CONNECT api.openshift.com:443 user HIER_DIRECT/18.215.44.164 -
1570981786.724    194 172.16.0.101 TCP_MISS/200 532 GET https://api.openshift.com/api/upgrades_info/v1/graph? user HIER_DIRECT/18.215.44.164 application/json

まとめ

OpenShift 4.2における、Proxy環境下でのインストールについては以上です。 インストール設定ファイルを少し変更するだけで対応できるので、非常に簡単です。Proxy環境でのOpenShift 4の導入を検討されている方は、是非手順を参考にトライしてみてください。 それでは初秋を感じながら、4.2 GAのリリースを今しばらくお待ちください!

Let's get Big Ideas!

*1:Red Hat Japanには西日本支社 九州・中国営業所(通称:福岡オフィス)があります。最近一部屋増え、賑やかになってきました

*2:Disconnected “Air-gapped” Installについてはこちらも参考に。https://docs.google.com/document/d/1cCnER-IMDCfinO7DiSvATt8WE4-YBngKrSb2aeBToZA/edit#heading=h.d6trypcglece

*3:4.2.0-0.nightly-2019-10-07-203748を利用

*4:# firewall-cmd --zone=trusted --remove-masquerade --permanent

*5:ACKが帰ってこず、タイムアウトに時間がかかりますが、今回の検証環境ではProxy無しで直接通信するようなシチュエーションは無いので、良しとしています

*6:Proxy設定で指定できるURLスキーマがhttp://のみなので、今回の検証環境では排他実行としています。通常のProxy運用では、実運用に合わせてProxy側を設定してください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません