CentOS 7
Sponsored Link

OpenShift Origin 3.6 : 外部からのアクセスを許可する
2017/11/28
 
OpenShift クラスター内のアプリケーションへ、外部からアクセスできるよう設定します。
HTTP や HTTPS アクセスであれば、Router で対応可能です
当例では以下のような環境を例に OpenShift クラスターを構成しています。
-----------+-----------------------------------------------------------+------------
           |10.0.0.30                    |10.0.0.51                    |10.0.0.52
+----------+-----------+      +----------+-----------+      +----------+-----------+
|  [  dlp.srv.world ]  |      | [ node01.srv.world ] |      | [ node02.srv.world ] |
|     (Master Node)    |      |    (Compute Node)    |      |    (Compute Node)    |
|     (Compute Node)   |      |                      |      |                      |
+----------------------+      +----------------------+      +----------------------+

[1]
[2] Master ノードの設定を変更します。
[origin@dlp ~]$
sudo vi /etc/origin/master/master-config.yaml
# 125行目:必要に応じて自身の環境の外部ネットワーク範囲に変更

  externalIPNetworkCIDRs:
  - 10.0.0.0/24

[origin@dlp ~]$
sudo systemctl restart origin-master

[3] 任意のユーザーでアプリケーションをデプロイし、外部からのアクセス許可の設定をします。
[cent@dlp ~]$
oc whoami

cent
[cent@dlp ~]$
oc get project

NAME           DISPLAY NAME   STATUS
test-project                  Active

# [nodejs-ex] デプロイ

[cent@dlp ~]$
oc new-app https://github.com/openshift/nodejs-ex

--> Found image 0129e5e (5 days old) in image stream "openshift/nodejs" under tag "6" for "nodejs"

    Node.js 6
    ---------
    Node.js 6 available as docker container is a base platform for building and running various Node.js 6 applications and frameworks. Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

.....
.....

--> Creating resources ...
    imagestream "nodejs-ex" created
    buildconfig "nodejs-ex" created
    deploymentconfig "nodejs-ex" created
    service "nodejs-ex" created
--> Success
    Build scheduled, use 'oc logs -f bc/nodejs-ex' to track its progress.
    Run 'oc status' to view your app.

# しばらくすると Pod が稼働状態となる

[cent@dlp ~]$
oc get pods

NAME                READY     STATUS      RESTARTS   AGE
nodejs-ex-1-build   0/1       Completed   0          1m
nodejs-ex-1-vwfs6   1/1       Running     0          1m

# クラスターIP 確認

[cent@dlp ~]$
oc get svc

NAME        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nodejs-ex   172.30.163.49   <none>        8080/TCP   1m

# 内部アクセスして確認

[cent@dlp ~]$
curl 172.30.163.49:8080

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Welcome to OpenShift</title>

.....
.....

</section>
</body>
</html>

# サービスを外部に公開

[cent@dlp ~]$
oc expose service nodejs-ex

route "nodejs-ex" exposed
# アクセスパス確認

[cent@dlp ~]$
oc get routes

NAME        HOST/PORT                               PATH      SERVICES    PORT       TERMINATION   WILDCARD
nodejs-ex   nodejs-ex-test-project.apps.srv.world             nodejs-ex   8080-tcp                 None


# 外部公開を中止する場合はルートを削除すればよい

[cent@dlp ~]$
oc delete routes nodejs-ex

route "nodejs-ex" deleted
[4] 確認したアクセスパスのホスト名が名前解決可能な任意のクライアントから Web アクセスし、アプリケーションが応答するか確認します。
[5]
名前解決についての補足です。
外部アクセスの場合や、クラスター内部アクセスでも名前でアクセスする場合は、クライアント側で名前解決できることが必要ですが、 Openshift のようにアプリケーションが大量に生成可能なシステムでは、一つ一つの名前を各ローカルホストの /etc/hosts や BIND などの名前解決システムに、都度、登録していくのは現実的に難しいため、Openshift アプリケーション用に割り当てたサブドメインに対してワイルドカード指定で DNS 登録をしておくと便利です。ただし、ワイルドカードは /etc/hosts では使用できないため、BIND や Dnsmasq などの名前解決システムへの登録が必要となります。
当例では、Openshift デフォルト サブドメインは、クラスター構成時に YML ファイルで指定した [apps.srv.world] としており、別ホストで稼働する BIND のゾーンに以下のような別名を定義することで、[apps.srv.world] の頭にどのような文字列がきても Openshift Router が稼働する Master ホストへアクセスさせるようにしています。
[root@dns ~]#
cat /var/named/srv.world.lan

$TTL 86400

.....

dlp     IN  A       10.0.0.30

*.apps  IN  CNAME   dlp.srv.world.

[cent@dlp ~]$
dig ruby-ex.test-project.apps.srv.world

.....

;; QUESTION SECTION:
;ruby-ex.test-project.apps.srv.world. IN        A

;; ANSWER SECTION:
ruby-ex.test-project.apps.srv.world. 86400 IN CNAME dlp.srv.world.
dlp.srv.world.          86400   IN      A       10.0.0.30

.....
[cent@dlp ~]$
dig nodejs.test-project.apps.srv.world

.....

;; QUESTION SECTION:
;nodejs.test-project.apps.srv.world. IN A

;; ANSWER SECTION:
nodejs.test-project.apps.srv.world. 86400 IN CNAME dlp.srv.world.
dlp.srv.world.          86400   IN      A       10.0.0.30

.....
[cent@dlp ~]$
dig test.test.test.apps.srv.world

.....

;; QUESTION SECTION:
;test.test.test.apps.srv.world. IN      A

;; ANSWER SECTION:
test.test.test.apps.srv.world. 86400 IN CNAME   dlp.srv.world.
dlp.srv.world.          86400   IN      A       10.0.0.30

.....
 
Tweet