OpenShift v3
Technical Introduction
レッドハット株式会社
中井悦司 / Etsuji Nakai
Senior Solution Architect
and Cloud Evangelist
v1.3 2016/01/20
2
OpenShift v3 Technical Introduction
自己紹介
 中井悦司(なかいえつじ)
– Twitter @enakai00
 日々の仕事
– Senior Solution Architect and
Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。
 昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
好評発売中!
3
OpenShift v3 Technical Introduction
Contents
 Dockerの機能とユースケースの整理
 OpenShiftの内部構造
 OpenShiftのイメージ管理機能
 アプリケーションのデプロイ方法
 ユースケースイメージ
 参考資料
Dockerの機能とユースケースの整理
5
OpenShift v3 Technical Introduction
Dockerが提供する基本機能
Dockerfile
① Dockerイメージを自動作成
OSイメージ
アプリケーション
ライブラリー
アプリケーション
フレームワーク
イメージの
作成手順を記載
Docker
イメージ
OS上にインストール可能な
ものはすべてイメージ化可能
② Dockerイメージを保存・公開
③ Dockerサーバーに
 イメージを配布・実行
6
OpenShift v3 Technical Introduction
アプリケーション開発環境でのDockerの利用例
 Dockerイメージを用いて、多数の開発者に同一の開発環境を提供
– テストサーバーにも同じ環境を提供することで、「環境差異による問題発生」を防止
 Dockerfileからイメージを自動作成するので、イメージの修正・変更・再配布が容易
– 開発コードのように、実行環境を「バージョン管理」可能に
フレームワーク
データベース
Dockerfile
Dockerイメージを
自動作成
開発・テスト環境に
Dockerイメージを配布
開発コードを
コードリポジトリー
にプッシュ
CIツールにより
インテグレーション
テストを自動実行
イメージをバージョン管理
する仕組みは用意が必要
7
OpenShift v3 Technical Introduction
フレームワーク
データベース
アプリケーション
フレームワーク
ライブラリー
Dockerイメージを
本番環境に展開!
 テストが実施された「アプリケーション環境」をそのままDockerイメージに固め
て、本番環境にデプロイすることで、アプリケーション配布を容易に
サービス環境へのDocker適用のメリット
8
OpenShift v3 Technical Introduction
Docker利用パターン(その1):
アプリケーションのデプロイを安全/簡単に
 仮想マシン上のアプリケーションをコンテナイメージ化することで、アプリケー
ションのデプロイを安全/簡単にします。
– 「1仮想マシンに1アプリケーション」という配置はあえて変更しないことで、運用方
法やアプリケーションのデザインへの影響を最小限に留めます。
– 外部からアプリケーションに接続するユーザー/外部システムは、アプリケーションが
コンテナ化されていることを意識する必要がありません。
IaaS/仮想化基盤
仮想マシン
(ゲストOS)
アプリA
・・・
・・・
これまでの環境
アプリケーションの
コンテナイメージ化
IaaS/仮想化基盤
仮想マシン
(Dockerホスト)
アプリA
(コンテナ
 イメージ)
仮想マシン
(Dockerホスト)
アプリB
(コンテナ
 イメージ)
・・・
・・・
仮想マシン
(ゲストOS)
アプリB
9
OpenShift v3 Technical Introduction
Docker利用パターン(その2):
サーバーの境界を意識しないアプリケーションデプロイ
 コンテナーの配置先を自動的に振り分ける仕組みを用いて、複数ホストを「1つ
のコンピューティングリソース」として活用します。
 アプリケーションを機能単位に分割してコンテナ化することで、さらなるメリッ
トが得られます。
– 必要な機能を負荷に応じてオートスケールします。
– 機能単位でコンテナーを入れ替えることにより、稼働中のアプリケーションの動的な機
能変更が可能になります。
※ Dockerはあくまでイメージ配布の仕組みに利用しているだけで、上位のオーケスト   
 レーション機能は別途用意が必要
Dockerホスト Dockerホスト Dockerホスト ・・・
複数ホストを束ねて「1つのコンピュータ」として活用
マイクロサービス化
アプリケーション
10
OpenShift v3 Technical Introduction
OpenShiftが提供する主な追加機能
 Dockerイメージのバージョン管理
– イメージストリームとイメージビルドシステム
– 「開発環境」そのものを開発可能に
 同一の開発環境のクラウド上への配布
– テンプレート機能
– それぞれの開発者に「自分専用」の開発/検証環境を提供
 マルチテナントでの利用
– プロジェクト単位でのネームスペースの分割
– 開発機能(ブランチ)単位で独立した開発/検証環境を提供
 サーバーの境界を意識しないコンテナのデプロイ
– Kubernetesによるコンテナのオーケストレーション
– マイクロサービス型アプリケーションのDevOps環境を実現
OpenShiftの内部構造
12
OpenShift v3 Technical Introduction
OpenShiftの基本サーバー構成
etcd
・・・
バックエンドデータベース(KVS)
マスター
ノード
・・・
クラスタ構成で
負荷分散可能
Docker Docker Docker
必要に応じて
追加可能
 1台のマスターから複数のノードを管理するシンプルなアーキテクチャーです。
– 各ノードのエージェントとマスターが直接に通信します。
– バックエンドデータベースは、etcd(分散KVS)を使用します。
– OpenShiftの利用者(CLI)は、マスターが公開するAPIにアクセスします。
利用者(CLI)
13
OpenShift v3 Technical Introduction
OpenShiftのネットワーク構成
etcd マスター
オーバーレイネットワーク
として構成
・・・
 物理的には、全サーバーを共通のサービスネットワークに接続するだけで利用可能です。
– コンテナ間通信用の内部ネットワークは、オーバーレイネットワークとして構成されます。
– 外部からのアクセスは、ルータ用コンテナを経由します。
• ルータがあるノードの80番ポート宛のパケットは、iptablesでルーターに転送されます。ルータ
は、URLベースで接続先のコンテナを決定します。
サービスネットワーク
ノード
内部ネットワーク
コンテナ コンテナ
ブリッジ
コンテナ コンテナ
ルータ
ブリッジ
ノード
14
OpenShift v3 Technical Introduction
「サービス」によるコンテナ間接続
 コンテナで起動したアプリケーションに対して、「サービス」を定義すると、内部ネット
ワーク上の「サービスアドレス」が割り当てられます。
– 他のコンテナから「サービスアドレス」にアクセスすると、対応するコンテナにパケットが転送され
ます。(複数のコンテナがある場合は、ラウンドロビンで負荷分散が行われます。)
– 事前に「サービス」を定義した状態で、新規のコンテナを起動すると、サービスのIPアドレス/ポー
トを示す環境変数が自動的にセットされます。
# oc get service
NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE
etherpad-lite 172.30.14.201 <none> 9001/TCP deploymentconfig=etherpad-lite 7d
mysql 172.30.86.51 <none> 3306/TCP name=mysql 7d
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: 3306
selector:
name: mysql-pod
sessionAffinity: None
mysql-service.yml
MYSQL_SERVICE_HOST=172.30.86.51
MYSQL_SERVICE_PORT_MYSQL=3306
サービス定義ファイルの例
割り当てられた
サービスアドレス
新規のコンテナに
セットされる環境変数の例
15
OpenShift v3 Technical Introduction
「ルーティング」による外部接続
 「サービス」に加えて「ルーティング」を定義すると、外部からのURLアクセスが可能にな
ります。
– HAProxyが稼働するルータコンテナがURLベースのルーティング処理を行ないます。
– 下記の例では、「*.oso.example.com」が「ルータコンテナが稼働するノードのパブリックIP」に解
決されるように外部DNSが事前設定されています。
– 複数のルータコンテナを起動して、DNSラウンドロビンで負荷分散することも可能です。
# oc get route
NAME HOST/PORT PATH SERVICE
etherpad-lite-route eplite.project01.oso.example.com etherpad-lite
apiVersion: v1
kind: Route
metadata:
name: etherpad-lite-route
spec:
host: eplite.project01.oso.example.com
to:
kind: Service
name: etherpad-lite
etherpad-lite_route.yml
ルーティング定義ファイルの例
アプリケーションのURL
16
OpenShift v3 Technical Introduction
「サービス」と「ルーティング」のパケット経路
 「サービス」として定義されたIPアドレス宛のパケットは、iptables設定によって、ノード
上の「openshift-nodeエージェント」に転送されます。
– openshift-nodeエージェントは、実際にサービスを提供するコンテナにラウンドロビンでパケットを
転送します。
 「ルーティング」を定義すると、ルータコンテナ上のHAProxyに、対応する設定がなされる
ことで、URLベースでのルーティングが実施されます。
openshift-node
エージェント
オーバーレイネットワーク
ブリッジ
コンテナ コンテナ
ルータ
コンテナ
iptables
iptables
DNS
ラウンドロビン
ラウンド
ロビン リースト
コネクション
コンテナ間のアクセス
外部からのアクセス
openshift-node
エージェント
ブリッジ
コンテナ コンテナ
ルータ
コンテナ
iptables
iptables
ラウンド
ロビン リースト
コネクション
OpenShiftのイメージ管理機能
18
OpenShift v3 Technical Introduction
OpenShiftにおけるイメージ管理
 Docker Hub、もしくは、Dockerホストローカルのイメージは、「ユーザー名/リポジトリ名
: タグ」という名称で識別されます。
– タグによるバージョン管理が可能ですが、自由に付け替えができるため、利用者自身が意識的にタグ
名を操作する必要があります。
 OpenShiftで取り扱うイメージは、専用の内部レジストリーに保存して、独自のバージョン
管理を行ないます。
– 内部レジストリーの中では、「プロジェクト名/リポジトリ名@<sha256ハッシュ>」という名称でイ
メージを識別します。ハッシュ値が、GitのコミットIDに相当するユニークな識別子になります。
– バージョン情報(イメージが更新された時系列)については、別途、「イメージストリーム」を定義
して、そちらで管理します。
# oc get is
NAME DOCKER REPO TAGS UPDATED
centos7 172.30.84.64:5000/project01/centos7 latest 7 days ago
etherpad-lite 172.30.84.64:5000/project01/etherpad-lite latest 7 days ago
nodejs-base 172.30.84.64:5000/project01/nodejs-base latest 7 days ago
# oc describe is etherpad-lite
Name: etherpad-lite
Created: 7 days ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2016-01-03T09:53:25Z
Docker Pull Spec: 172.30.84.64:5000/project01/etherpad-lite
Tag Spec Created PullSpec
latest <pushed> 5 days ago 172.30.84.64:5000/project01/etherpad-lite@sha256:9b5e7f9fc58...
7 days ago 172.30.84.64:5000/project01/etherpad-lite@sha256:05c4600b8ab...
project01のイメージストリーム一覧
イメージストリーム
「etherpad-lite」
に含まれるイメージ
19
OpenShift v3 Technical Introduction
OpenShiftにおけるイメージ管理
 イメージストリームには、次のような際に新しいバージョンのイメージが登録されます。
– 内部レジストリーにイメージをPushした時
• プッシュ時の「プロジェクト名/レジストリー名」から、対応するプロジェクトの(レジスト
リーと同名の)イメージストリームに新バージョンとして登録されます。
– OpenShiftのイメージビルドシステムを用いて、新しいイメージをビルドした時
• イメージビルドシステムは、GitHubで公開したDockerfile、アプリケーションのソースコードな
どを用いて、新しいイメージを作成、内部レジストリーに保存する機能です。
# docker pull centos:7
# docker login -u enakai -e enakai@example.com -p $(oc whoami -t) registry.oso.example.com
# docker tag docker.io/centos:7 registry.oso.example.com/project01/centos7:latest
# docker push registry.oso.example.com/project01/centos7:latest
# oc get is
NAME DOCKER REPO TAGS UPDATED
centos7 172.30.84.64:5000/project01/centos7 latest 7 seconds ago
# oc describe is centos7
ame: centos7
Created: 24 seconds ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2015-12-28T11:32:19Z
Docker Pull Spec: 172.30.84.64:5000/project01/centos7
Tag Spec Created PullSpec
latest <pushed> 24 seconds ago 172.30.84.64:5000/project01/centos7@sha256:b04ac...
CentOS7のイメージを
内部レジストリーに
Pushする例
20
OpenShift v3 Technical Introduction
OpenShiftのイメージビルドシステム
 イメージビルドシステムは、「ビルド設定(BuildConfig)」を定義して利用します。次は、
GitHubで公開したDockerfile(および、ビルドに必要な関連ファイル)からイメージをビル
ドする設定の例です。
apiVersion: v1
kind: BuildConfig
metadata:
name: nginx-sample
spec:
output:
to:
kind: ImageStreamTag
name: nginx-sample:latest
source:
git:
uri: https://github.com/enakai00/openshift_nginx_sample
type: Git
strategy:
dockerStrategy:
from:
kind: ImageStreamTag
name: centos7:latest
type: Docker
triggers:
- imageChange: {}
type: ImageChange
nginx-sample_bc.yml
– Docerfileの「FROM:」行は、イメー
ジストリーム「centos7」のイメー
ジで置き換えられます。
– 作成されたイメージは、内部レジス
トリーに保存された後、イメージス
トリーム「nginx-sample」に自動登
録されます。
– 「start-build」コマンドを明示的に
実行する他に、イメージストリーム
「centos7」のイメージが更新され
たタイミング、GitHubに新たな
Commitが行われたタイミングでも
自動的にビルドが実行可能です。
アプリケーションのデプロイ方法
22
OpenShift v3 Technical Introduction
イメージストリームからのコンテナのデプロイ
 「デプロイ設定(DeploymentConfig)」を用いて、イメージストリームに登録したイメー
ジからコンテナをデプロイします。
apiVersion: v1
kind: DeploymentConfig
metadata:
name: nginx-sample
spec:
template:
metadata:
labels:
name: nginx-sample
spec:
containers:
- name: nginx-sample-latest
image: nginx-sample:latest
ports:
- containerPort: 8080
protocol: TCP
replicas: 4
selector:
name: nginx-sample
triggers:
- type: ImageChange
imageChangeParams:
automatic: true
containerNames:
- nginx-sample-latest
from:
kind: ImageStreamTag
name: nginx-sample:latest
- type: ConfigChange
nginx-sample_dc.yml
– レプリカ数で指定した数のコンテナが起動します。
先に説明した「サービス」の定義により、複数コン
テナに対するロードバランスが行われます。
– イメージストリームに新しいイメージが登録される
と、自動で再デプロイを実施することができます。
再デプロイ時は、新バージョンのコンテナを追加起
動して、新しいセッションから新バージョンに振り
分けるといった動作が可能です。
23
OpenShift v3 Technical Introduction
マルチテナント機能を利用したDevOpsの実現
 開発/テストとサービス用でプロジェクトを分割することで、OpenShift上でのDevOps環境
が実現できます。
内部レジストリー
ImageStream
BuildConfig
Deployment
Config
Route
Service Service
エイリアス
テスト済みイメージを
エイリアスで参照
Deployment
Config
開発/テスト
プロジェクト
サービス用
プロジェクト
イメージの
実体を保存アプリケーションの元ネタ
(Dockerfile/ソースコード)
を保存
Route
RHEL7
MyApp MyApp
24
OpenShift v3 Technical Introduction
設定テンプレートによる環境構築
 一連の設定ファイル(「イメージストリーム」「ビルド設定」「デプロイ設定」「サービ
ス」「ルーティング」)をテンプレート化することにより、典型的なアプリケーション環境
/開発環境が自動構築できるようになります。
# oc get -n openshift template
NAME DESCRIPTION PARAMETERS OBJECTS
cakephp-example An example CakePHP application with no database 14 (8 blank) 5
cakephp-mysql-example An example CakePHP application with a MySQL database 14 (3 blank) 7
dancer-example An example Dancer application with no database 7 (4 blank) 5
dancer-mysql-example An example Dancer application with a MySQL database 13 (4 blank) 7
django-example An example Django application with no database 12 (9 blank) 5
django-psql-example An example Django application with a PostgreSQL database 12 (4 blank) 7
jenkins-ephemeral Jenkins service, without persistent storage. WARNING: Any data stored will be... 2 (all set) 3
jenkins-persistent Jenkins service, with persistent storage. 3 (all set) 4
logging-deployer-template Template for deploying everything needed for aggregated logging. Requires clu... 19 (10 blank) 1
metrics-deployer-template Template for deploying the required Metrics integration. Requires cluster-adm... 9 (1 blank) 1
mongodb-ephemeral MongoDB database service, without persistent storage. WARNING: Any data store... 5 (3 generated) 2
mongodb-persistent MongoDB database service, with persistent storage. Scaling to more than one r... 6 (3 generated) 3
mysql-ephemeral MySQL database service, without persistent storage. WARNING: Any data stored... 4 (2 generated) 2
mysql-persistent MySQL database service, with persistent storage. Scaling to more than one rep... 5 (2 generated) 3
nodejs-example An example Node.js application with no database 11 (8 blank) 5
nodejs-mongodb-example An example Node.js application with a MongoDB database 11 (3 blank) 7
postgresql-ephemeral PostgreSQL database service, without persistent storage. WARNING: Any data st... 4 (2 generated) 2
postgresql-persistent PostgreSQL database service, with persistent storage. Scaling to more than on... 5 (2 generated) 3
rails-postgresql-example An example Rails application with a PostgreSQL database 15 (3 blank) 7
デフォルトで用意される
テンプレートの例
25
OpenShift v3 Technical Introduction
テンプレートとGUIの組み合わせによるPaaSの提供
 テンプレート機能とGUIを組み合わせることで、いわゆる「PaaS」環境を提供することも可
能です。
26
OpenShift v3 Technical Introduction
複数コンテナが連携するシステムの構築例
 下記のBlog記事に従って、MySQL + node.jsのアプリケーション環境を構築してみます。
– OpenShift OriginによるDockerイメージ管理(4)〜S2Iによるイメージビルド
• http://enakai00.hatenablog.com/entry/2016/01/03/174854
– OpenShift OriginによるDockerイメージ管理(5)〜複数コンテナの連携設定
• http://enakai00.hatenablog.com/entry/2016/01/03/200920
ユースケースイメージ
28
OpenShift v3 Technical Introduction
従来のPaaSの利用形態
アプリ開発者
開発環境
テンプレート
新しいコードをPushすると
開発・テスト環境に展開してビルド
開発したコードの
稼働確認
テンプレートそのものの
メンテナンスはどうする?
開発中に開発環境の
アップデートは可能?
開発が終わったアプリは
どうやって本番展開する?
29
OpenShift v3 Technical Introduction
OpenShiftにおける「開発環境」のメンテナンス機能
OSイメージ
開発環境イメージ
アプリケーション
イメージ
アプリ開発者
開発環境管理者
セキュリティ問題等の修正が入った
新しいOSイメージをアップロード
Dockerfileを用いて
開発環境イメージを更新
アプリケーションを
自動ビルドして機能テスト
開発環境イメージ
修正・テスト済みの
開発環境イメージを参照
アプリケーション
イメージ
新しいコードをPushすると
アプリケーションイメージを自動更新
30
OpenShift v3 Technical Introduction
マルチテナントによる機能別の並行開発
アプリ開発者
開発環境イメージ
アプリケーション
イメージ
 開発機能ごとにコードのブランチを分けて、各ブラ
ンチ専用の開発環境を個別に用意します。
アプリ開発者
開発環境イメージ
アプリケーション
イメージ
テスト担当者
開発環境イメージ
アプリケーション
イメージ
マスターブランチ
開発済み機能をマージした
マスターブランチのコードを検証
機能Aの開発
機能Bの開発
開発した機能を
マージ
開発した機能を
マージ
参考資料
32
OpenShift v3 Technical Introduction
参考資料
 OpenShift関連情報リンク集
– http://enakai00.hatenablog.com/entry/2016/01/03/211029
 OpenShift v3 Internal networking details
– http://www.slideshare.net/enakai/openshift-45465283
 RHEL7.1でKubernetesを実体験(概要編)
– http://jp-redhat.com/openeye_online/column/nakai/902/
 RHEL7.1でKubernetesを実体験(構築編)
– http://jp-redhat.com/openeye_online/column/nakai/991/
EMPOWER PEOPLE,
EMPOWER ENTERPRISE,
OPEN INNOVATION.

OpenShift v3 Technical Introduction

  • 1.
    OpenShift v3 Technical Introduction レッドハット株式会社 中井悦司/ Etsuji Nakai Senior Solution Architect and Cloud Evangelist v1.3 2016/01/20
  • 2.
    2 OpenShift v3 TechnicalIntroduction 自己紹介  中井悦司(なかいえつじ) – Twitter @enakai00  日々の仕事 – Senior Solution Architect and Cloud Evangelist at Red Hat K.K. 企業システムでオープンソースの活用を希望される お客様を全力でご支援させていただきます。  昔とった杵柄 – 素粒子論の研究(超弦理論とか) – 予備校講師(物理担当) – インフラエンジニア(Unix/Linux専門) 好評発売中!
  • 3.
    3 OpenShift v3 TechnicalIntroduction Contents  Dockerの機能とユースケースの整理  OpenShiftの内部構造  OpenShiftのイメージ管理機能  アプリケーションのデプロイ方法  ユースケースイメージ  参考資料
  • 4.
  • 5.
    5 OpenShift v3 TechnicalIntroduction Dockerが提供する基本機能 Dockerfile ① Dockerイメージを自動作成 OSイメージ アプリケーション ライブラリー アプリケーション フレームワーク イメージの 作成手順を記載 Docker イメージ OS上にインストール可能な ものはすべてイメージ化可能 ② Dockerイメージを保存・公開 ③ Dockerサーバーに  イメージを配布・実行
  • 6.
    6 OpenShift v3 TechnicalIntroduction アプリケーション開発環境でのDockerの利用例  Dockerイメージを用いて、多数の開発者に同一の開発環境を提供 – テストサーバーにも同じ環境を提供することで、「環境差異による問題発生」を防止  Dockerfileからイメージを自動作成するので、イメージの修正・変更・再配布が容易 – 開発コードのように、実行環境を「バージョン管理」可能に フレームワーク データベース Dockerfile Dockerイメージを 自動作成 開発・テスト環境に Dockerイメージを配布 開発コードを コードリポジトリー にプッシュ CIツールにより インテグレーション テストを自動実行 イメージをバージョン管理 する仕組みは用意が必要
  • 7.
    7 OpenShift v3 TechnicalIntroduction フレームワーク データベース アプリケーション フレームワーク ライブラリー Dockerイメージを 本番環境に展開!  テストが実施された「アプリケーション環境」をそのままDockerイメージに固め て、本番環境にデプロイすることで、アプリケーション配布を容易に サービス環境へのDocker適用のメリット
  • 8.
    8 OpenShift v3 TechnicalIntroduction Docker利用パターン(その1): アプリケーションのデプロイを安全/簡単に  仮想マシン上のアプリケーションをコンテナイメージ化することで、アプリケー ションのデプロイを安全/簡単にします。 – 「1仮想マシンに1アプリケーション」という配置はあえて変更しないことで、運用方 法やアプリケーションのデザインへの影響を最小限に留めます。 – 外部からアプリケーションに接続するユーザー/外部システムは、アプリケーションが コンテナ化されていることを意識する必要がありません。 IaaS/仮想化基盤 仮想マシン (ゲストOS) アプリA ・・・ ・・・ これまでの環境 アプリケーションの コンテナイメージ化 IaaS/仮想化基盤 仮想マシン (Dockerホスト) アプリA (コンテナ  イメージ) 仮想マシン (Dockerホスト) アプリB (コンテナ  イメージ) ・・・ ・・・ 仮想マシン (ゲストOS) アプリB
  • 9.
    9 OpenShift v3 TechnicalIntroduction Docker利用パターン(その2): サーバーの境界を意識しないアプリケーションデプロイ  コンテナーの配置先を自動的に振り分ける仕組みを用いて、複数ホストを「1つ のコンピューティングリソース」として活用します。  アプリケーションを機能単位に分割してコンテナ化することで、さらなるメリッ トが得られます。 – 必要な機能を負荷に応じてオートスケールします。 – 機能単位でコンテナーを入れ替えることにより、稼働中のアプリケーションの動的な機 能変更が可能になります。 ※ Dockerはあくまでイメージ配布の仕組みに利用しているだけで、上位のオーケスト     レーション機能は別途用意が必要 Dockerホスト Dockerホスト Dockerホスト ・・・ 複数ホストを束ねて「1つのコンピュータ」として活用 マイクロサービス化 アプリケーション
  • 10.
    10 OpenShift v3 TechnicalIntroduction OpenShiftが提供する主な追加機能  Dockerイメージのバージョン管理 – イメージストリームとイメージビルドシステム – 「開発環境」そのものを開発可能に  同一の開発環境のクラウド上への配布 – テンプレート機能 – それぞれの開発者に「自分専用」の開発/検証環境を提供  マルチテナントでの利用 – プロジェクト単位でのネームスペースの分割 – 開発機能(ブランチ)単位で独立した開発/検証環境を提供  サーバーの境界を意識しないコンテナのデプロイ – Kubernetesによるコンテナのオーケストレーション – マイクロサービス型アプリケーションのDevOps環境を実現
  • 11.
  • 12.
    12 OpenShift v3 TechnicalIntroduction OpenShiftの基本サーバー構成 etcd ・・・ バックエンドデータベース(KVS) マスター ノード ・・・ クラスタ構成で 負荷分散可能 Docker Docker Docker 必要に応じて 追加可能  1台のマスターから複数のノードを管理するシンプルなアーキテクチャーです。 – 各ノードのエージェントとマスターが直接に通信します。 – バックエンドデータベースは、etcd(分散KVS)を使用します。 – OpenShiftの利用者(CLI)は、マスターが公開するAPIにアクセスします。 利用者(CLI)
  • 13.
    13 OpenShift v3 TechnicalIntroduction OpenShiftのネットワーク構成 etcd マスター オーバーレイネットワーク として構成 ・・・  物理的には、全サーバーを共通のサービスネットワークに接続するだけで利用可能です。 – コンテナ間通信用の内部ネットワークは、オーバーレイネットワークとして構成されます。 – 外部からのアクセスは、ルータ用コンテナを経由します。 • ルータがあるノードの80番ポート宛のパケットは、iptablesでルーターに転送されます。ルータ は、URLベースで接続先のコンテナを決定します。 サービスネットワーク ノード 内部ネットワーク コンテナ コンテナ ブリッジ コンテナ コンテナ ルータ ブリッジ ノード
  • 14.
    14 OpenShift v3 TechnicalIntroduction 「サービス」によるコンテナ間接続  コンテナで起動したアプリケーションに対して、「サービス」を定義すると、内部ネット ワーク上の「サービスアドレス」が割り当てられます。 – 他のコンテナから「サービスアドレス」にアクセスすると、対応するコンテナにパケットが転送され ます。(複数のコンテナがある場合は、ラウンドロビンで負荷分散が行われます。) – 事前に「サービス」を定義した状態で、新規のコンテナを起動すると、サービスのIPアドレス/ポー トを示す環境変数が自動的にセットされます。 # oc get service NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE etherpad-lite 172.30.14.201 <none> 9001/TCP deploymentconfig=etherpad-lite 7d mysql 172.30.86.51 <none> 3306/TCP name=mysql 7d apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - name: mysql port: 3306 protocol: TCP targetPort: 3306 selector: name: mysql-pod sessionAffinity: None mysql-service.yml MYSQL_SERVICE_HOST=172.30.86.51 MYSQL_SERVICE_PORT_MYSQL=3306 サービス定義ファイルの例 割り当てられた サービスアドレス 新規のコンテナに セットされる環境変数の例
  • 15.
    15 OpenShift v3 TechnicalIntroduction 「ルーティング」による外部接続  「サービス」に加えて「ルーティング」を定義すると、外部からのURLアクセスが可能にな ります。 – HAProxyが稼働するルータコンテナがURLベースのルーティング処理を行ないます。 – 下記の例では、「*.oso.example.com」が「ルータコンテナが稼働するノードのパブリックIP」に解 決されるように外部DNSが事前設定されています。 – 複数のルータコンテナを起動して、DNSラウンドロビンで負荷分散することも可能です。 # oc get route NAME HOST/PORT PATH SERVICE etherpad-lite-route eplite.project01.oso.example.com etherpad-lite apiVersion: v1 kind: Route metadata: name: etherpad-lite-route spec: host: eplite.project01.oso.example.com to: kind: Service name: etherpad-lite etherpad-lite_route.yml ルーティング定義ファイルの例 アプリケーションのURL
  • 16.
    16 OpenShift v3 TechnicalIntroduction 「サービス」と「ルーティング」のパケット経路  「サービス」として定義されたIPアドレス宛のパケットは、iptables設定によって、ノード 上の「openshift-nodeエージェント」に転送されます。 – openshift-nodeエージェントは、実際にサービスを提供するコンテナにラウンドロビンでパケットを 転送します。  「ルーティング」を定義すると、ルータコンテナ上のHAProxyに、対応する設定がなされる ことで、URLベースでのルーティングが実施されます。 openshift-node エージェント オーバーレイネットワーク ブリッジ コンテナ コンテナ ルータ コンテナ iptables iptables DNS ラウンドロビン ラウンド ロビン リースト コネクション コンテナ間のアクセス 外部からのアクセス openshift-node エージェント ブリッジ コンテナ コンテナ ルータ コンテナ iptables iptables ラウンド ロビン リースト コネクション
  • 17.
  • 18.
    18 OpenShift v3 TechnicalIntroduction OpenShiftにおけるイメージ管理  Docker Hub、もしくは、Dockerホストローカルのイメージは、「ユーザー名/リポジトリ名 : タグ」という名称で識別されます。 – タグによるバージョン管理が可能ですが、自由に付け替えができるため、利用者自身が意識的にタグ 名を操作する必要があります。  OpenShiftで取り扱うイメージは、専用の内部レジストリーに保存して、独自のバージョン 管理を行ないます。 – 内部レジストリーの中では、「プロジェクト名/リポジトリ名@<sha256ハッシュ>」という名称でイ メージを識別します。ハッシュ値が、GitのコミットIDに相当するユニークな識別子になります。 – バージョン情報(イメージが更新された時系列)については、別途、「イメージストリーム」を定義 して、そちらで管理します。 # oc get is NAME DOCKER REPO TAGS UPDATED centos7 172.30.84.64:5000/project01/centos7 latest 7 days ago etherpad-lite 172.30.84.64:5000/project01/etherpad-lite latest 7 days ago nodejs-base 172.30.84.64:5000/project01/nodejs-base latest 7 days ago # oc describe is etherpad-lite Name: etherpad-lite Created: 7 days ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2016-01-03T09:53:25Z Docker Pull Spec: 172.30.84.64:5000/project01/etherpad-lite Tag Spec Created PullSpec latest <pushed> 5 days ago 172.30.84.64:5000/project01/etherpad-lite@sha256:9b5e7f9fc58... 7 days ago 172.30.84.64:5000/project01/etherpad-lite@sha256:05c4600b8ab... project01のイメージストリーム一覧 イメージストリーム 「etherpad-lite」 に含まれるイメージ
  • 19.
    19 OpenShift v3 TechnicalIntroduction OpenShiftにおけるイメージ管理  イメージストリームには、次のような際に新しいバージョンのイメージが登録されます。 – 内部レジストリーにイメージをPushした時 • プッシュ時の「プロジェクト名/レジストリー名」から、対応するプロジェクトの(レジスト リーと同名の)イメージストリームに新バージョンとして登録されます。 – OpenShiftのイメージビルドシステムを用いて、新しいイメージをビルドした時 • イメージビルドシステムは、GitHubで公開したDockerfile、アプリケーションのソースコードな どを用いて、新しいイメージを作成、内部レジストリーに保存する機能です。 # docker pull centos:7 # docker login -u enakai -e enakai@example.com -p $(oc whoami -t) registry.oso.example.com # docker tag docker.io/centos:7 registry.oso.example.com/project01/centos7:latest # docker push registry.oso.example.com/project01/centos7:latest # oc get is NAME DOCKER REPO TAGS UPDATED centos7 172.30.84.64:5000/project01/centos7 latest 7 seconds ago # oc describe is centos7 ame: centos7 Created: 24 seconds ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2015-12-28T11:32:19Z Docker Pull Spec: 172.30.84.64:5000/project01/centos7 Tag Spec Created PullSpec latest <pushed> 24 seconds ago 172.30.84.64:5000/project01/centos7@sha256:b04ac... CentOS7のイメージを 内部レジストリーに Pushする例
  • 20.
    20 OpenShift v3 TechnicalIntroduction OpenShiftのイメージビルドシステム  イメージビルドシステムは、「ビルド設定(BuildConfig)」を定義して利用します。次は、 GitHubで公開したDockerfile(および、ビルドに必要な関連ファイル)からイメージをビル ドする設定の例です。 apiVersion: v1 kind: BuildConfig metadata: name: nginx-sample spec: output: to: kind: ImageStreamTag name: nginx-sample:latest source: git: uri: https://github.com/enakai00/openshift_nginx_sample type: Git strategy: dockerStrategy: from: kind: ImageStreamTag name: centos7:latest type: Docker triggers: - imageChange: {} type: ImageChange nginx-sample_bc.yml – Docerfileの「FROM:」行は、イメー ジストリーム「centos7」のイメー ジで置き換えられます。 – 作成されたイメージは、内部レジス トリーに保存された後、イメージス トリーム「nginx-sample」に自動登 録されます。 – 「start-build」コマンドを明示的に 実行する他に、イメージストリーム 「centos7」のイメージが更新され たタイミング、GitHubに新たな Commitが行われたタイミングでも 自動的にビルドが実行可能です。
  • 21.
  • 22.
    22 OpenShift v3 TechnicalIntroduction イメージストリームからのコンテナのデプロイ  「デプロイ設定(DeploymentConfig)」を用いて、イメージストリームに登録したイメー ジからコンテナをデプロイします。 apiVersion: v1 kind: DeploymentConfig metadata: name: nginx-sample spec: template: metadata: labels: name: nginx-sample spec: containers: - name: nginx-sample-latest image: nginx-sample:latest ports: - containerPort: 8080 protocol: TCP replicas: 4 selector: name: nginx-sample triggers: - type: ImageChange imageChangeParams: automatic: true containerNames: - nginx-sample-latest from: kind: ImageStreamTag name: nginx-sample:latest - type: ConfigChange nginx-sample_dc.yml – レプリカ数で指定した数のコンテナが起動します。 先に説明した「サービス」の定義により、複数コン テナに対するロードバランスが行われます。 – イメージストリームに新しいイメージが登録される と、自動で再デプロイを実施することができます。 再デプロイ時は、新バージョンのコンテナを追加起 動して、新しいセッションから新バージョンに振り 分けるといった動作が可能です。
  • 23.
    23 OpenShift v3 TechnicalIntroduction マルチテナント機能を利用したDevOpsの実現  開発/テストとサービス用でプロジェクトを分割することで、OpenShift上でのDevOps環境 が実現できます。 内部レジストリー ImageStream BuildConfig Deployment Config Route Service Service エイリアス テスト済みイメージを エイリアスで参照 Deployment Config 開発/テスト プロジェクト サービス用 プロジェクト イメージの 実体を保存アプリケーションの元ネタ (Dockerfile/ソースコード) を保存 Route RHEL7 MyApp MyApp
  • 24.
    24 OpenShift v3 TechnicalIntroduction 設定テンプレートによる環境構築  一連の設定ファイル(「イメージストリーム」「ビルド設定」「デプロイ設定」「サービ ス」「ルーティング」)をテンプレート化することにより、典型的なアプリケーション環境 /開発環境が自動構築できるようになります。 # oc get -n openshift template NAME DESCRIPTION PARAMETERS OBJECTS cakephp-example An example CakePHP application with no database 14 (8 blank) 5 cakephp-mysql-example An example CakePHP application with a MySQL database 14 (3 blank) 7 dancer-example An example Dancer application with no database 7 (4 blank) 5 dancer-mysql-example An example Dancer application with a MySQL database 13 (4 blank) 7 django-example An example Django application with no database 12 (9 blank) 5 django-psql-example An example Django application with a PostgreSQL database 12 (4 blank) 7 jenkins-ephemeral Jenkins service, without persistent storage. WARNING: Any data stored will be... 2 (all set) 3 jenkins-persistent Jenkins service, with persistent storage. 3 (all set) 4 logging-deployer-template Template for deploying everything needed for aggregated logging. Requires clu... 19 (10 blank) 1 metrics-deployer-template Template for deploying the required Metrics integration. Requires cluster-adm... 9 (1 blank) 1 mongodb-ephemeral MongoDB database service, without persistent storage. WARNING: Any data store... 5 (3 generated) 2 mongodb-persistent MongoDB database service, with persistent storage. Scaling to more than one r... 6 (3 generated) 3 mysql-ephemeral MySQL database service, without persistent storage. WARNING: Any data stored... 4 (2 generated) 2 mysql-persistent MySQL database service, with persistent storage. Scaling to more than one rep... 5 (2 generated) 3 nodejs-example An example Node.js application with no database 11 (8 blank) 5 nodejs-mongodb-example An example Node.js application with a MongoDB database 11 (3 blank) 7 postgresql-ephemeral PostgreSQL database service, without persistent storage. WARNING: Any data st... 4 (2 generated) 2 postgresql-persistent PostgreSQL database service, with persistent storage. Scaling to more than on... 5 (2 generated) 3 rails-postgresql-example An example Rails application with a PostgreSQL database 15 (3 blank) 7 デフォルトで用意される テンプレートの例
  • 25.
    25 OpenShift v3 TechnicalIntroduction テンプレートとGUIの組み合わせによるPaaSの提供  テンプレート機能とGUIを組み合わせることで、いわゆる「PaaS」環境を提供することも可 能です。
  • 26.
    26 OpenShift v3 TechnicalIntroduction 複数コンテナが連携するシステムの構築例  下記のBlog記事に従って、MySQL + node.jsのアプリケーション環境を構築してみます。 – OpenShift OriginによるDockerイメージ管理(4)〜S2Iによるイメージビルド • http://enakai00.hatenablog.com/entry/2016/01/03/174854 – OpenShift OriginによるDockerイメージ管理(5)〜複数コンテナの連携設定 • http://enakai00.hatenablog.com/entry/2016/01/03/200920
  • 27.
  • 28.
    28 OpenShift v3 TechnicalIntroduction 従来のPaaSの利用形態 アプリ開発者 開発環境 テンプレート 新しいコードをPushすると 開発・テスト環境に展開してビルド 開発したコードの 稼働確認 テンプレートそのものの メンテナンスはどうする? 開発中に開発環境の アップデートは可能? 開発が終わったアプリは どうやって本番展開する?
  • 29.
    29 OpenShift v3 TechnicalIntroduction OpenShiftにおける「開発環境」のメンテナンス機能 OSイメージ 開発環境イメージ アプリケーション イメージ アプリ開発者 開発環境管理者 セキュリティ問題等の修正が入った 新しいOSイメージをアップロード Dockerfileを用いて 開発環境イメージを更新 アプリケーションを 自動ビルドして機能テスト 開発環境イメージ 修正・テスト済みの 開発環境イメージを参照 アプリケーション イメージ 新しいコードをPushすると アプリケーションイメージを自動更新
  • 30.
    30 OpenShift v3 TechnicalIntroduction マルチテナントによる機能別の並行開発 アプリ開発者 開発環境イメージ アプリケーション イメージ  開発機能ごとにコードのブランチを分けて、各ブラ ンチ専用の開発環境を個別に用意します。 アプリ開発者 開発環境イメージ アプリケーション イメージ テスト担当者 開発環境イメージ アプリケーション イメージ マスターブランチ 開発済み機能をマージした マスターブランチのコードを検証 機能Aの開発 機能Bの開発 開発した機能を マージ 開発した機能を マージ
  • 31.
  • 32.
    32 OpenShift v3 TechnicalIntroduction 参考資料  OpenShift関連情報リンク集 – http://enakai00.hatenablog.com/entry/2016/01/03/211029  OpenShift v3 Internal networking details – http://www.slideshare.net/enakai/openshift-45465283  RHEL7.1でKubernetesを実体験(概要編) – http://jp-redhat.com/openeye_online/column/nakai/902/  RHEL7.1でKubernetesを実体験(構築編) – http://jp-redhat.com/openeye_online/column/nakai/991/
  • 33.