Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Post on 22-Jan-2018

2446 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

Transcript

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

レッドハット株式会社v1.3 2015-11-04

2

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

自己紹介

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

日々の仕事– Senior Solution Architect and

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

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

好評発売中!

本日のデモで使用するコンテナイメージの作り方は、この本に記載されています。

3

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

デモの詳細はブログを参照してください

デモの手順(スクリプトやコマンド)の詳細は下記のブログに掲載しています。– OpenStack上でRHEL7のDockerを使う手順– http://enakai00.hatenablog.com/entry/2015/10/06/194542

本スライドに記載のスクリプトやコマンドは、一部を抜粋したものです。スクリプトの全体像は上記のブログを参考にしてください。

4

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Contents

OpenStackの機能概要(復習) Dockerの機能概要(復習) OpenStackとDockerを組み合わせるメリット Docker用仮想マシンの構成

(ブロックボリュームを使わない例) Docker用仮想マシンの構成

(ブロックボリュームを使う例と複数コンテナの連携例) Kubernetes/OpenShiftによるオーケストレーション

OpenStackの機能概要(復習)

6

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

OpenStackが提供するコンピューティングリソース

OpenStackのユーザは、Webコンソール/APIを利用して、次のようなコンピューティングリソースを利用します。

– 仮想ネットワーク– 仮想マシンインスタンス– ブロックボリューム

データ領域 ブロックボリューム

仮想ルータ

仮想スイッチ

外部ネットワーク

プロジェクト環境

OpenStackユーザ

OS領域

各ユーザは特定の「プロジェクト」に所属します。

– プロジェクト内でリソースを共有– プロジェクト全体でのリソース使用

量の上限設定、リソース使用状況のレポーティングなどが可能

仮想マシンインスタンス

7

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

カスタマイズ・スクリプト(UserData)による自動化

仮想マシンインスタンス起動時に「カスタマイズ・スクリプト(UserData)」を与えると任意のテキストをメタデータとしてゲストOSに受け渡すことができます。

Cloud-Initは、カスタマイズ・スクリプトを解釈して、さまざまな自動化を実現します。– 下図はシェルスクリプトを渡して、「/etc/motd」を設定しています。– この他にもCloud-Init独自の構文で、処理内容を指示することができます。

$ curl http://169.254.169.254/2009-04-04/user-data#!/bin/shecho 'Hello, World' > /etc/motdexit 0

Dockerの概要(復習)

9

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Dockerが提供する基本機能

Dockerfile

① Dockerイメージを自動作成

OSイメージ

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

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

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

Dockerイメージ

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

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

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

10

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

フレームワーク

データベース

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

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

テストが実施された「確実動くアプリケーション」をそのままDockerイメージに固めて、本番環境に自動デプロイするという運用を想像してみましょう・・・。

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

OpenStackとDockerを組み合わせるメリット

12

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

OpenStackによる自動化(オーケストレーション)手法

Dockerが無かった時代は・・・– 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成– ゲストOS上のアプリはChef/Ansible/Puppetなどの構成管理ツールで自動構成

ゲストOSとアプリの管理が別れているため「Immutable」な運用が困難!– ゲストOSのテンプレートはOpenStack側で管理– 仮想マシン起動時に動的にアプリの導入・設定を実施

「第14章 Dockerを利用したアプリケーション展開」より引用

ゲストOSの変更に起因するアプリ導入の失敗が発生

13

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

OpenStackとDockerの組み合わせ手法

Dockerを用いた運用だと・・・– OpenStackは、「インフラ+DockerホストOS」の提供に専念– アプリの実行環境は、Dockerイメージで作成・管理・デプロイ

インフラとアプリの管理を分離することで「Immutable」な運用が容易に!– ゲストOSのテンプレートはDockerの稼働環境を提供– 事前作成済みのDockerイメージを配布してアプリを起動

「第14章 Dockerを利用したアプリケーション展開」より引用

アプリの導入・管理をOpenStackから分離可能

14

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Docker用仮想マシンの構成(全体像)

永続データ領域

イメージ保存領域

OS領域Docker導入済みVMテンプレート

ホストLinuxの/dataにマウント

仮想マシン

ブロックボリューム追加の

エフェメラルディスク

コンテナ(アプリケーション)

/data

コンテナイメージ

Dockerデーモン

ゲストOS(ホストLinux)

/var/lib/mysql

永続データは特定のディレクトリに保存

Dockerで管理

OpenStackで管理

Docker用仮想マシンの構成手順(ブロックボリュームを使わない例)

16

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Railsアプリをコンテナで起動する構成例

イメージ保存領域

OS領域Docker導入済みVMテンプレート

仮想マシン

追加のエフェメラルディスク

コンテナ(Railsアプリ)

コンテナイメージ

DockerデーモンDockerで管理

OpenStackで管理 フローティングIP

コンテナ内でRailsアプリを起動

Railsアプリ(伝言板)のイメージを事前登録

フローティングIPにアクセス

17

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

ゲストOSとイメージ保存領域の用意

イメージ保存領域

OS領域Docker導入済みVMテンプレート

仮想マシン

OS領域とイメージ保存領域のディスクを用意します。– RHEL7の公式ゲストイメージにdockerパッケージを導入

したスナップショットを用意します。– また、イメージ保存領域用に「一時ディスク」の容量を

設定したフレーバーを定義しておきます。

# subscription-manager register# subscription-manager attach --pool=<pool id># subscription-manager repos --disable=*# subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-extras-rpms# yum -y update# yum -y install docker lvm2

18

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

仮想マシンの作成とコンテナの起動(Railsアプリ)

イメージ保存領域

OS領域Docker導入済みテンプレート

仮想マシン

Nova APIから仮想マシンを作成します。–先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。–起動後に外部からアクセス可能なフローティングIPを割り当てます。

UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。– イメージ保存領域をセットアップ

– コンテナイメージを取得して、コンテナを起動

cat <<'EOF' >/etc/sysconfig/docker-storage-setupVG=vg_poolDATA_SIZE=18GEOFrm -rf /var/lib/docker/*pvcreate -f /dev/vdbvgcreate vg_pool /dev/vdbdocker-storage-setup

docker run -itd -p 8000:80 --name dengonban01 \ registry01:5000/enakai00/rails:ver1.0

「/dev/vdb」にVGを作成して、イメージ保存領域として構成

ゲストOSからは「/dev/vdb」として認識

8000番ポートへのアクセスをコンテナの80番ポートに転送

19

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

コンテナー

(参考)Dockerの内部ネットワーク構成

それぞれのコンテナーには独立した仮想NICとプライベートIPアドレスが割り当てられて、ホストLinuxの仮想ブリッジ(docker0)に接続します。

– IPアドレスは自動で割り当てられますが、他のコンテナーからは環境変数で参照できるように設定が可能です。

外部ネットワークからアクセスする際は、ホストLinuxで受信したパケットをコンテナー内に転送するように設定します。

ホストLinuxvethXX

eth0

docker0

eth0

外部ネットワーク

– 外部のクライアントはホストLinuxにアクセスするので、コンテナーの存在を意識することはありません。

– OpenStack環境の場合、外部からは、仮想マシンに割り当てた「フローティングIP」にアクセスします。

172.17.42.1# docker run -it -p 8000:80 ...

ホストLinuxのIPアドレスに接続

TCP 8000

TCP 80

ポートフォワーディング

Docker用仮想マシンの構成手順(ブロックボリュームを使う例と

複数コンテナの連携例)

21

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

MySQLをコンテナで起動する構成例

永続データ領域

イメージ保存領域

OS領域Docker導入済みテンプレート

ホストLinuxの/dataにマウント

仮想マシン

ブロックボリューム追加の

エフェメラルディスク

コンテナ(MySQL)

/data

コンテナイメージ

Dockerデーモン

/var/lib/mysqlMySQLのデータ領域「/var/lib/mysql」にブロックボリュームの

ディクレクトリを割り当て

Dockerで管理

OpenStackで管理

コンテナ内でMySQLを起動

MySQLのイメージを事前登録

22

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

仮想マシンの作成とコンテナの起動(MySQL)

Nova APIから仮想マシンを作成します。–先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。–起動後にフローティングIPとブロックボリュームを割り当てます。

UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。– イメージ保存領域をセットアップ– ブロックボリュームが割り当てられるのを待って、ホストLinuxの/dataにマウント

– コンテナイメージを取得して、コンテナを起動

mkfs.xfs -f /dev/vddmkdir /datamount /dev/vdd /datachcon -Rt svirt_sandbox_file_t /data

docker run -itd --name mysql01 -v /data:/var/lib/mysql -p 10000:3306 registry01:5000/enakai00/mysql:ver1.0sleep 5docker exec mysql01 mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'nodeuser'@'localhost';"docker exec mysql01 mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'nodeuser'@'%' IDENTIFIED BY 'pas4mysql';"docker exec mysql01 mysql -u nodeuser -e "CREATE DATABASE shorturl_service;"docker exec mysql01 mysql shorturl_service -u nodeuser -e " \CREATE TABLE url_list ( \hash CHAR(12) PRIMARY KEY, \url VARCHAR(256) UNIQUE NOT NULL COLLATE utf8_bin \);"EOF

この後で起動するnode.jsアプリで使用するデータベースを作成

23

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

MySQLにアクセスするコンテナの構成例

永続データ領域

イメージ保存領域

OS領域

コンテナ(MySQL)

/data

コンテナイメージ

Dockerデーモン

/var/lib/mysql

フローティングIP

イメージ保存領域

OS領域

コンテナ(node.jsアプリ)

コンテナイメージ

Dockerデーモン

フローティングIP フローティングIPにアクセス

フローティングIPにアクセス

var DBHOST = process.env.DB_PORT_3306_TCP_ADDR;var DBPORT = process.env.DB_PORT_3306_TCP_PORT;

接続先DBのIP/ポートは環境変数で参照

24

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

仮想マシンの作成とコンテナの起動(node.jsアプリ)

仮想マシン

Nova APIから仮想マシンを作成します。–先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。–起動後に外部からアクセス可能なフローティングIPを割り当てます。

UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。– イメージ保存領域をセットアップ– コンテナイメージを取得して、コンテナを起動

docker run -itd --name shorturl01 -p 8000:80 \ -e DB_PORT_3306_TCP_ADDR=192.168.1.104 \ -e DB_PORT_3306_TCP_PORT=10000 \ registry01:5000/enakai00/shorturl:ver1.0

接続先DBのIP/ポートを環境変数に設定して

コンテナを起動

接続先DBのIP/ポートは環境変数で参照

コンテナ(node.jsアプリ)

コンテナイメージ

Dockerデーモン

var DBHOST = process.env.DB_PORT_3306_TCP_ADDR;var DBPORT = process.env.DB_PORT_3306_TCP_PORT;

Kubernetes/OpenShiftによるオーケストレーション

26

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Docker活用パターン1:アプリのデプロイを安全/簡単に

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

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

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

– コンテナイメージを開発する環境(OpenShiftなど)は、別途、必要となります。

OpenStack/仮想化基盤

仮想マシン(ゲストOS)

アプリA

・・・

・・・

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

OpenStack/仮想化基盤

仮想マシン(Dockerホスト)

アプリA(コンテナ イメージ)

仮想マシン(Dockerホスト)

アプリB(コンテナ イメージ)

・・・

・・・

仮想マシン(ゲストOS)

アプリB

27

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Docker活用パターン2:コンテナ化によるリソース有効活用

コンテナの配置先を自動的に振り分ける仕組みを用いて、複数ホストを「1つのコンピューティングリソース」として活用します。

– Kubernetesなどのオーケストレーションツールを使用します。

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

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

OpenStack/仮想化基盤

仮想マシン(Dockerホスト)

仮想マシン(Dockerホスト)

仮想マシン(Dockerホスト)・・・

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

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

28

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

Kubernetes:Dockerをより高度に管理する仕組みを提供

http://jp.techcrunch.com/2014/07/11/20140710google-microsoft-ibm-and-others-collaborate-to-make-managing-docker-containers-easier/

今後は、Kubernetesを利用したDevOps基盤が開発されていきます

OpenShift

仮想マシン/ベアメタルサーバー

Docker

Kubernetes

実行リソース提供

複数サーバーに跨るオーケストレーション

UI、モニタリング、イメージ作成ワークフロー

etc.

・・・

OpenStack

・・・

コンテナ化アプリケーション

仮想マシン/ベアメタルサーバー

Docker

OpenShift v3:DockerによるDevOps環境を実現

OpenShift v3は、Docker/Kubernetesをコアコンポーネントとして、インテグレートされたDevOps環境を提供します。

30

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

まとめ

サービス環境でDockerを使用するメリットは、大きく2種類あります。

アプリケーションのデプロイを簡単/安全に実施する。

–開発側で、テスト済みのアプリケーション環境をイメージ化する仕組みを用意する必要があります。OpenShiftの開発支援機能を活用してください。

–1VM(1ホスト)に1コンテナを配置することで、アプリケーションの設計/運用は従来と同じ方法を踏襲します。

– OpenStack + Dockerにより、VMの作成とコンテナの配置を自動化する事も可能です。

複数のホストをプール化して、リソースの有効活用を行う。

– Kubernetes, OpenShiftなど、コンテナの自動配置(オーケストレーション)を行うツールと組み合わせる必要があります。OpenStackを用いて、Kubernetes/OpenShift環境を自動構築する事も可能です。

– ハイパーバイザーのオーバーヘッドを回避したい場合は、OpenStackのベアメタルプロビジョニング機能が利用できます。

– アプリケーションのマイクロサービス化により、機能単位のオートスケール、アプリケーションの動的な機能変更が実現可能になります。

本日ご紹介した利用パターン

先進企業が取り組む世界

31

Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック

参考資料

OpenStack上でRHEL7のDockerを使う手順– http://enakai00.hatenablog.com/entry/2015/10/06/194542

"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する – http://www.slideshare.net/enakai/docker-is-not-container-dockerpaas

Dockerイメージ管理の内部構造 – http://www.slideshare.net/enakai/docker-43975886

Red Hat Enterprise Linux 7.1 Kubernetes入門– http://www.slideshare.net/enakai/red-hat-enterprise-linux-71-kubernetes

Open shift 3 technical architecture– http://www.slideshare.net/hyoungseunglee/open-shift-3-technical-architecture

EMPOWER PEOPLE,

EMPOWER ENTERPRISE,

OPEN INNOVATION.

top related