OpenShiftをプライベートネットワーク上に立てる時にひっかかったこと

# プライベートネットワーク

はい。閉域ネットワークです。
一応プロキシ通せば外には出られます。
社内DNSあり環境です。

OpenShiftを使用する時は普通はopenshift_master_default_subdomainとか設定して`https://<app_name>-<project_name>.<openshift_master_default_subdomain>`てな感じでアクセスできるようにすると思います。
んで社内でのみ使用する場合は社内DNSに登録すると思います。

この時、社内DNSを見に行かないとopenshift_master_default_subdomainがDNS解決できず、アクセスで問題が発生する場合があります。具体的な話をするとopenshift-web-consoleのconfig-mapにて`https`でURLを指定する部分があるのです。loggingとメトリクスとかの話です。httpで指定するとはじかれて通らないのでサービスのURLだとアクセスできないのです。

なのでクラスタ内部からはopenshift_master_default_subdomainを解決できるようにしておく必要があります。<del>めんどい</del>

# サービスエンドポイントのホスト名はどこで解決する？

OpenShiftは内部的にDNSをもっています。
結論から言うと各ノードがDNS解決する仕組み(skydns)になっています。
ですので各VMから最初にローカルDNS（localhost:53）を見に行き、解決できなかったら社内DNSへforwardする仕組みにします。

# OpenShiftをプライベートでないネットワークで構築した場合

この場合、DNS解決の第一段階として`/etc/resolv.conf`の`nameserver`項目の値を見に行きます。OpenShiftを構築した場合、各VMのNodeのIPになります。各Nodeにはdnsmasqという簡易DNSがインストールされます。ここからさらに`xxx.svc.cluster.local`というサブドメインを持つホスト名のみ、`127.0.0.1`へforwardされます。
するとNode内部のDNSから該当サービスのIPが返される仕組みになっています。
んでDNS解決対象外のドメインへのアクセスは多分デフォルトのDNSへforwardされる仕組みになってるのかな。

# プライベートネットワークでアクセスしたい場合どういう設定になるの？

<del>とりあえず各VMにて`xxx.svc.cluster.local`がアクセスできる状態になっていればOKです。
dnsmasqの設定に`server=/cluster.local/127.0.0.1`とかそんな雰囲気の設定があるのでここでコンテナ内から`xxx.svc`へアクセスされると、dnsmasqがxxx.svc.cluster.localへのアクセスと解釈し、アクセスできるようになります。
さらに`/etc/dnsmasq.conf`の`resolv-file`に設定されたupstream設定に上位DNSへのアクセス設定を書いておけば完成です。つまり社内DNSを記載するということです。</del>
NetworkManagerの領分っぽい。
インターフェースのNM_CONTROLLEDを`yes`にしておくとopenshift3.11だとNetworkManager再起動時に自動設定してくれた。Ansibleのプレイブック実行時も自動で再起動するっぽいのであまりきにしなくてもよいかも。元々resolv.confに記載されている社内DNSはserver=/<社内DNS_IP>/みたいな設定でupstreamに設定されるようになっていた。ちなみにAzureの場合、`PEERDNS=no`にしないとVMに入っているエージェントがかってにAzureのDNSへ書き換えてしまうので注意。
とりあえず、Ansible実行前に各Nodeのresolv.confに社内DNSを設定しておけばOKっぽい。

# 全体感

サービス名前解決。
ドメインを見て`社内DNS`にはいかずに`OpenShiftのNodeにあるDNS`を見る。
![openshift-service-dns-resolv.png](https://qiita-image-store.s3.amazonaws.com/0/105030/bae340d6-f789-26a5-19bc-11c576092eac.png)

ルート名前解決。
ドメインを見て`OpenShiftのNodeにあるDNS`にはいかずに`社内DNS`を見る。
![openshift-route-dns-resolv.png](https://qiita-image-store.s3.amazonaws.com/0/105030/845bd2b4-9a73-35ec-4670-d9cf87f510fa.png)

# インストーラによる設定

OpenShiftをインストールするときはansible使ってやるかと思います。
んで案の定`openshift_dns_ip`という設定があります。
ありますがなんか夏場に設定した時に上手く動かなかったのでこの辺手動で設定してます。
※うろ覚えだけどなんか違ったのかも。

# インストーラのバグ

バグ情報あった。
[Bug 1586368 - openshift_dns_ip does not take effect](https://bugzilla.redhat.com/show_bug.cgi?id=1586368)

3.9では動くって書いてある。設定するとこ間違えたのかな。

# Router機能解説

理解するのに結構時間かかったので簡単な構造と解説を書いておく。
![openshift-route-network.png](https://qiita-image-store.s3.amazonaws.com/0/105030/b81b640e-613e-a51c-9b96-66e330a74f90.png)

## そもそもDNSって何？

とっても簡単に言うとこのドメインの実態はどこですか？って問い合わせるとIPとか返してくれるサービスです。
Aレコードを登録しておけばIPv4のIPを返してくれます。
AAAAレコードを登録しておけばIPv6のIPを返してくれます。
CNAMEレコードを登録しておけばドメインのエイリアスを返してくれます。
エイリアスとは別名ですね。
設定次第で見つからなかったら上位のDNSに行きます。
OpenShiftでRouterとか設定する場合はRouterポッドが動作しているサーバーに対してアクセス元からアクセスさせなければならないので最低限上記の知識は必要です。
ただし、まずい設定をすると他のDNSに負荷をかけてしまったりすることがあるのでわからなかったらインフラの人に協力してもらいましょう。

## 細かいRouterの解説

OpenShiftではRouterという仕組みがあり、これの実態はha-proxyというミドルウェアをリバースプロキシとして機能させ、一つの仕組みでOpenShift上で動くすべてのサービスを一元的に割り振りしちゃおうという機能です。
こうすることで`サービスの公開`というインフラ色の強い作業を`セルフサービス化`することができます。

OpenShiftって総合的にやってることをまとめるとインフラレイヤーを抽象化して知識がなくともOpenShift利用者が勝手にやれるようにした製品なんですね。
`セルフサービス化`を促進するのでインフラとアプリの垣根で時間がかかっている組織さんとかでは非常に導入効果が見込めるのではないでしょうか。