openshift v3 technical introduction

33
OpenShift v3 Technical Introduction レッドハット株式会社 中井悦司 / Etsuji Nakai Senior Solution Architect and Cloud Evangelist v1.3 2016/01/20

Upload: etsuji-nakai

Post on 08-Jan-2017

2.205 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: OpenShift v3 Technical Introduction

OpenShift v3Technical Introduction

レッドハット株式会社

中井悦司 / Etsuji NakaiSenior Solution Architect

and Cloud Evangelist

v1.3 2016/01/20

Page 2: OpenShift v3 Technical Introduction

2

OpenShift v3 Technical Introduction

自己紹介

中井悦司(なかいえつじ)– Twitter @enakai00

日々の仕事– Senior Solution Architect and

Cloud Evangelist at Red Hat K.K.企業システムでオープンソースの活用を希望されるお客様を全力でご支援させていただきます。

昔とった杵柄– 素粒子論の研究(超弦理論とか)– 予備校講師(物理担当)– インフラエンジニア(Unix/Linux専門)

好評発売中!

Page 3: OpenShift v3 Technical Introduction

3

OpenShift v3 Technical Introduction

Contents

Dockerの機能とユースケースの整理 OpenShiftの内部構造 OpenShiftのイメージ管理機能 アプリケーションのデプロイ方法 ユースケースイメージ 参考資料

Page 4: OpenShift v3 Technical Introduction

Dockerの機能とユースケースの整理

Page 5: OpenShift v3 Technical Introduction

5

OpenShift v3 Technical Introduction

Dockerが提供する基本機能

Dockerfile

① Dockerイメージを自動作成

OSイメージ

アプリケーションライブラリー

アプリケーションフレームワーク

イメージの作成手順を記載

Dockerイメージ

OS上にインストール可能なものはすべてイメージ化可能

② Dockerイメージを保存・公開

③ Dockerサーバーに イメージを配布・実行

Page 6: OpenShift v3 Technical Introduction

6

OpenShift v3 Technical Introduction

アプリケーション開発環境でのDockerの利用例 Dockerイメージを用いて、多数の開発者に同一の開発環境を提供

– テストサーバーにも同じ環境を提供することで、「環境差異による問題発生」を防止 Dockerfileからイメージを自動作成するので、イメージの修正・変更・再配布が容易

– 開発コードのように、実行環境を「バージョン管理」可能に

フレームワーク

データベース

Dockerfile

Dockerイメージを自動作成

開発・テスト環境にDockerイメージを配布

開発コードをコードリポジトリーにプッシュ

CIツールによりインテグレーションテストを自動実行

イメージをバージョン管理する仕組みは用意が必要

Page 7: OpenShift v3 Technical Introduction

7

OpenShift v3 Technical Introduction

フレームワーク

データベース

アプリケーションフレームワークライブラリー

Dockerイメージを本番環境に展開!

テストが実施された「アプリケーション環境」をそのままDockerイメージに固めて、本番環境にデプロイすることで、アプリケーション配布を容易に

サービス環境へのDocker適用のメリット

Page 8: OpenShift v3 Technical Introduction

8

OpenShift v3 Technical Introduction

Docker利用パターン(その1):アプリケーションのデプロイを安全/簡単に

仮想マシン上のアプリケーションをコンテナイメージ化することで、アプリケーションのデプロイを安全/簡単にします。

– 「1仮想マシンに1アプリケーション」という配置はあえて変更しないことで、運用方法やアプリケーションのデザインへの影響を最小限に留めます。

–外部からアプリケーションに接続するユーザー/外部システムは、アプリケーションがコンテナ化されていることを意識する必要がありません。

IaaS/仮想化基盤

仮想マシン(ゲストOS)

アプリA

・・・

・・・

これまでの環境 アプリケーションのコンテナイメージ化

IaaS/仮想化基盤

仮想マシン(Dockerホスト)

アプリA(コンテナ

 イメージ)

仮想マシン(Dockerホスト)

アプリB(コンテナ

 イメージ)

・・・

・・・

仮想マシン(ゲストOS)

アプリB

Page 9: OpenShift v3 Technical Introduction

9

OpenShift v3 Technical Introduction

Docker利用パターン(その2):サーバーの境界を意識しないアプリケーションデプロイ コンテナーの配置先を自動的に振り分ける仕組みを用いて、複数ホストを「1つ

のコンピューティングリソース」として活用します。

アプリケーションを機能単位に分割してコンテナ化することで、さらなるメリットが得られます。

– 必要な機能を負荷に応じてオートスケールします。– 機能単位でコンテナーを入れ替えることにより、稼働中のアプリケーションの動的な機

能変更が可能になります。

※ Dockerはあくまでイメージ配布の仕組みに利用しているだけで、上位のオーケスト    レーション機能は別途用意が必要

Dockerホスト Dockerホスト Dockerホスト ・・・

複数ホストを束ねて「1つのコンピュータ」として活用

マイクロサービス化アプリケーション

Page 10: OpenShift v3 Technical Introduction

10

OpenShift v3 Technical Introduction

OpenShiftが提供する主な追加機能

Dockerイメージのバージョン管理– イメージストリームとイメージビルドシステム– 「開発環境」そのものを開発可能に

同一の開発環境のクラウド上への配布– テンプレート機能– それぞれの開発者に「自分専用」の開発/検証環境を提供

マルチテナントでの利用– プロジェクト単位でのネームスペースの分割– 開発機能(ブランチ)単位で独立した開発/検証環境を提供

サーバーの境界を意識しないコンテナのデプロイ– Kubernetesによるコンテナのオーケストレーション–マイクロサービス型アプリケーションのDevOps環境を実現

Page 11: OpenShift v3 Technical Introduction

OpenShiftの内部構造

Page 12: OpenShift v3 Technical Introduction

12

OpenShift v3 Technical Introduction

OpenShiftの基本サーバー構成

etcd

・・・

バックエンドデータベース(KVS)

マスターノード

・・・

クラスタ構成で負荷分散可能

Docker Docker Docker

必要に応じて追加可能

1台のマスターから複数のノードを管理するシンプルなアーキテクチャーです。– 各ノードのエージェントとマスターが直接に通信します。– バックエンドデータベースは、etcd(分散KVS)を使用します。– OpenShiftの利用者(CLI)は、マスターが公開するAPIにアクセスします。

利用者(CLI)

Page 13: OpenShift v3 Technical Introduction

13

OpenShift v3 Technical Introduction

OpenShiftのネットワーク構成

etcd マスター

オーバーレイネットワークとして構成

・・・

物理的には、全サーバーを共通のサービスネットワークに接続するだけで利用可能です。– コンテナ間通信用の内部ネットワークは、オーバーレイネットワークとして構成されます。– 外部からのアクセスは、ルータ用コンテナを経由します。

• ルータがあるノードの80番ポート宛のパケットは、iptablesでルーターに転送されます。ルータは、URLベースで接続先のコンテナを決定します。

サービスネットワーク

ノード

内部ネットワーク

コンテナ コンテナ

ブリッジ

コンテナ コンテナ

ルータ

ブリッジ

ノード

Page 14: OpenShift v3 Technical Introduction

14

OpenShift v3 Technical Introduction

「サービス」によるコンテナ間接続

コンテナで起動したアプリケーションに対して、「サービス」を定義すると、内部ネットワーク上の「サービスアドレス」が割り当てられます。

– 他のコンテナから「サービスアドレス」にアクセスすると、対応するコンテナにパケットが転送されます。(複数のコンテナがある場合は、ラウンドロビンで負荷分散が行われます。)

– 事前に「サービス」を定義した状態で、新規のコンテナを起動すると、サービスのIPアドレス/ポートを示す環境変数が自動的にセットされます。

# oc get serviceNAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGEetherpad-lite 172.30.14.201 <none> 9001/TCP deploymentconfig=etherpad-lite 7dmysql 172.30.86.51 <none> 3306/TCP name=mysql 7d

apiVersion: v1 kind: Service metadata: name: mysqlspec: ports: - name: mysql port: 3306 protocol: TCP targetPort: 3306 selector: name: mysql-pod sessionAffinity: None

mysql-service.yml

MYSQL_SERVICE_HOST=172.30.86.51MYSQL_SERVICE_PORT_MYSQL=3306

サービス定義ファイルの例

割り当てられたサービスアドレス

新規のコンテナにセットされる環境変数の例

Page 15: OpenShift v3 Technical Introduction

15

OpenShift v3 Technical Introduction

「ルーティング」による外部接続

「サービス」に加えて「ルーティング」を定義すると、外部からのURLアクセスが可能になります。

– HAProxyが稼働するルータコンテナがURLベースのルーティング処理を行ないます。– 下記の例では、「*.oso.example.com」が「ルータコンテナが稼働するノードのパブリックIP」に解決されるように外部DNSが事前設定されています。

– 複数のルータコンテナを起動して、DNSラウンドロビンで負荷分散することも可能です。

# oc get routeNAME HOST/PORT PATH SERVICE etherpad-lite-route eplite.project01.oso.example.com etherpad-lite

apiVersion: v1kind: Routemetadata: name: etherpad-lite-routespec: host: eplite.project01.oso.example.com to: kind: Service name: etherpad-lite

etherpad-lite_route.yml ルーティング定義ファイルの例

アプリケーションのURL

Page 16: OpenShift v3 Technical Introduction

16

OpenShift v3 Technical Introduction

「サービス」と「ルーティング」のパケット経路 「サービス」として定義されたIPアドレス宛のパケットは、iptables設定によって、ノード

上の「openshift-nodeエージェント」に転送されます。– openshift-nodeエージェントは、実際にサービスを提供するコンテナにラウンドロビンでパケットを転送します。

「ルーティング」を定義すると、ルータコンテナ上のHAProxyに、対応する設定がなされることで、URLベースでのルーティングが実施されます。

openshift-nodeエージェント

オーバーレイネットワーク

ブリッジ

コンテナ コンテナルータ

コンテナ

iptables

iptables

DNSラウンドロビン

ラウンドロビン リースト

コネクション

コンテナ間のアクセス

外部からのアクセス

openshift-nodeエージェント

ブリッジ

コンテナ コンテナルータ

コンテナ

iptables

iptables

ラウンドロビン リースト

コネクション

Page 17: OpenShift v3 Technical Introduction

OpenShiftのイメージ管理機能

Page 18: OpenShift v3 Technical Introduction

18

OpenShift v3 Technical Introduction

OpenShiftにおけるイメージ管理

Docker Hub、もしくは、Dockerホストローカルのイメージは、「ユーザー名/リポジトリ名 : タグ」という名称で識別されます。

– タグによるバージョン管理が可能ですが、自由に付け替えができるため、利用者自身が意識的にタグ名を操作する必要があります。

OpenShiftで取り扱うイメージは、専用の内部レジストリーに保存して、独自のバージョン管理を行ないます。

– 内部レジストリーの中では、「プロジェクト名/リポジトリ名@<sha256ハッシュ>」という名称でイメージを識別します。ハッシュ値が、GitのコミットIDに相当するユニークな識別子になります。

– バージョン情報(イメージが更新された時系列)については、別途、「イメージストリーム」を定義して、そちらで管理します。

# oc get isNAME DOCKER REPO TAGS UPDATEDcentos7 172.30.84.64:5000/project01/centos7 latest 7 days agoetherpad-lite 172.30.84.64:5000/project01/etherpad-lite latest 7 days agonodejs-base 172.30.84.64:5000/project01/nodejs-base latest 7 days ago

# oc describe is etherpad-liteName: etherpad-liteCreated: 7 days agoLabels: <none>Annotations: openshift.io/image.dockerRepositoryCheck=2016-01-03T09:53:25ZDocker 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」

に含まれるイメージ

Page 19: OpenShift v3 Technical Introduction

19

OpenShift v3 Technical Introduction

OpenShiftにおけるイメージ管理

イメージストリームには、次のような際に新しいバージョンのイメージが登録されます。– 内部レジストリーにイメージをPushした時

• プッシュ時の「プロジェクト名/レジストリー名」から、対応するプロジェクトの(レジストリーと同名の)イメージストリームに新バージョンとして登録されます。

– OpenShiftのイメージビルドシステムを用いて、新しいイメージをビルドした時• イメージビルドシステムは、GitHubで公開したDockerfile、アプリケーションのソースコードなどを用いて、新しいイメージを作成、内部レジストリーに保存する機能です。

# docker pull centos:7# docker login -u enakai -e [email protected] -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 isNAME DOCKER REPO TAGS UPDATEDcentos7 172.30.84.64:5000/project01/centos7 latest 7 seconds ago

# oc describe is centos7ame: centos7Created: 24 seconds agoLabels: <none>Annotations: openshift.io/image.dockerRepositoryCheck=2015-12-28T11:32:19ZDocker 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する例

Page 20: OpenShift v3 Technical Introduction

20

OpenShift v3 Technical Introduction

OpenShiftのイメージビルドシステム

イメージビルドシステムは、「ビルド設定(BuildConfig)」を定義して利用します。次は、GitHubで公開したDockerfile(および、ビルドに必要な関連ファイル)からイメージをビルドする設定の例です。

apiVersion: v1kind: BuildConfigmetadata: name: nginx-samplespec: 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が行われたタイミングでも自動的にビルドが実行可能です。

Page 21: OpenShift v3 Technical Introduction

アプリケーションのデプロイ方法

Page 22: OpenShift v3 Technical Introduction

22

OpenShift v3 Technical Introduction

イメージストリームからのコンテナのデプロイ

「デプロイ設定(DeploymentConfig)」を用いて、イメージストリームに登録したイメージからコンテナをデプロイします。

apiVersion: v1kind: DeploymentConfigmetadata: name: nginx-samplespec: 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– レプリカ数で指定した数のコンテナが起動します。先に説明した「サービス」の定義により、複数コンテナに対するロードバランスが行われます。

– イメージストリームに新しいイメージが登録されると、自動で再デプロイを実施することができます。再デプロイ時は、新バージョンのコンテナを追加起動して、新しいセッションから新バージョンに振り分けるといった動作が可能です。

Page 23: OpenShift v3 Technical Introduction

23

OpenShift v3 Technical Introduction

マルチテナント機能を利用したDevOpsの実現

開発/テストとサービス用でプロジェクトを分割することで、OpenShift上でのDevOps環境が実現できます。

内部レジストリー

ImageStream

BuildConfig

DeploymentConfig

Route

Service Service

エイリアス

テスト済みイメージをエイリアスで参照

DeploymentConfig

開発/テストプロジェクト

サービス用プロジェクト

イメージの実体を保存アプリケーションの元ネタ

(Dockerfile/ソースコード)を保存

Route

RHEL7

MyApp MyApp

Page 24: OpenShift v3 Technical Introduction

24

OpenShift v3 Technical Introduction

設定テンプレートによる環境構築

一連の設定ファイル(「イメージストリーム」「ビルド設定」「デプロイ設定」「サービス」「ルーティング」)をテンプレート化することにより、典型的なアプリケーション環境/開発環境が自動構築できるようになります。

# oc get -n openshift templateNAME DESCRIPTION PARAMETERS OBJECTScakephp-example An example CakePHP application with no database 14 (8 blank) 5cakephp-mysql-example An example CakePHP application with a MySQL database 14 (3 blank) 7dancer-example An example Dancer application with no database 7 (4 blank) 5dancer-mysql-example An example Dancer application with a MySQL database 13 (4 blank) 7django-example An example Django application with no database 12 (9 blank) 5django-psql-example An example Django application with a PostgreSQL database 12 (4 blank) 7jenkins-ephemeral Jenkins service, without persistent storage. WARNING: Any data stored will be... 2 (all set) 3jenkins-persistent Jenkins service, with persistent storage. 3 (all set) 4logging-deployer-template Template for deploying everything needed for aggregated logging. Requires clu... 19 (10 blank) 1metrics-deployer-template Template for deploying the required Metrics integration. Requires cluster-adm... 9 (1 blank) 1mongodb-ephemeral MongoDB database service, without persistent storage. WARNING: Any data store... 5 (3 generated) 2mongodb-persistent MongoDB database service, with persistent storage. Scaling to more than one r... 6 (3 generated) 3mysql-ephemeral MySQL database service, without persistent storage. WARNING: Any data stored... 4 (2 generated) 2mysql-persistent MySQL database service, with persistent storage. Scaling to more than one rep... 5 (2 generated) 3nodejs-example An example Node.js application with no database 11 (8 blank) 5nodejs-mongodb-example An example Node.js application with a MongoDB database 11 (3 blank) 7postgresql-ephemeral PostgreSQL database service, without persistent storage. WARNING: Any data st... 4 (2 generated) 2postgresql-persistent PostgreSQL database service, with persistent storage. Scaling to more than on... 5 (2 generated) 3rails-postgresql-example An example Rails application with a PostgreSQL database 15 (3 blank) 7

デフォルトで用意されるテンプレートの例

Page 25: OpenShift v3 Technical Introduction

25

OpenShift v3 Technical Introduction

テンプレートとGUIの組み合わせによるPaaSの提供

テンプレート機能とGUIを組み合わせることで、いわゆる「PaaS」環境を提供することも可能です。

Page 26: OpenShift v3 Technical Introduction

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

Page 27: OpenShift v3 Technical Introduction

ユースケースイメージ

Page 28: OpenShift v3 Technical Introduction

28

OpenShift v3 Technical Introduction

従来のPaaSの利用形態

アプリ開発者

開発環境テンプレート

新しいコードをPushすると開発・テスト環境に展開してビルド

開発したコードの稼働確認

テンプレートそのもののメンテナンスはどうする?

開発中に開発環境のアップデートは可能?

開発が終わったアプリはどうやって本番展開する?

Page 29: OpenShift v3 Technical Introduction

29

OpenShift v3 Technical Introduction

OpenShiftにおける「開発環境」のメンテナンス機能

OSイメージ

開発環境イメージ

アプリケーションイメージ

アプリ開発者

開発環境管理者セキュリティ問題等の修正が入った新しいOSイメージをアップロード

Dockerfileを用いて開発環境イメージを更新

アプリケーションを自動ビルドして機能テスト

開発環境イメージ

修正・テスト済みの開発環境イメージを参照

アプリケーションイメージ

新しいコードをPushするとアプリケーションイメージを自動更新

Page 30: OpenShift v3 Technical Introduction

30

OpenShift v3 Technical Introduction

マルチテナントによる機能別の並行開発

アプリ開発者

開発環境イメージ

アプリケーションイメージ

開発機能ごとにコードのブランチを分けて、各ブランチ専用の開発環境を個別に用意します。

アプリ開発者

開発環境イメージ

アプリケーションイメージ

テスト担当者

開発環境イメージ

アプリケーションイメージ

マスターブランチ

開発済み機能をマージしたマスターブランチのコードを検証

機能Aの開発

機能Bの開発

開発した機能をマージ

開発した機能をマージ

Page 31: OpenShift v3 Technical Introduction

参考資料

Page 32: OpenShift v3 Technical Introduction

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/

Page 33: OpenShift v3 Technical Introduction

EMPOWER PEOPLE,

EMPOWER ENTERPRISE,

OPEN INNOVATION.