red hat enterprise linux openstack platform環境でのdocker活用テクニック

32
Red Hat Enterprise Linux OpenStack Platform環境での Docker活用テクニック レッドハット株式会社 v1.3 2015-11-04

Upload: etsuji-nakai

Post on 22-Jan-2018

2.447 views

Category:

Technology


0 download

TRANSCRIPT

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

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

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

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

2

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

自己紹介

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

日々の仕事– Senior Solution Architect and

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

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

好評発売中!

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

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

3

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

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

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

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

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

4

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

Contents

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

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

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

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

OpenStackの機能概要(復習)

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

6

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

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

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

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

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

仮想ルータ

仮想スイッチ

外部ネットワーク

プロジェクト環境

OpenStackユーザ

OS領域

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

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

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

仮想マシンインスタンス

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

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

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

Dockerの概要(復習)

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

9

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

Dockerが提供する基本機能

Dockerfile

① Dockerイメージを自動作成

OSイメージ

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

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

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

Dockerイメージ

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

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

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

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

10

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

フレームワーク

データベース

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

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

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

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

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

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

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

12

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

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

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

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

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

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

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

13

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

OpenStackとDockerの組み合わせ手法

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

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

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

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

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

14

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

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

永続データ領域

イメージ保存領域

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

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

仮想マシン

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

エフェメラルディスク

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

/data

コンテナイメージ

Dockerデーモン

ゲストOS(ホストLinux)

/var/lib/mysql

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

Dockerで管理

OpenStackで管理

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

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

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

16

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

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

イメージ保存領域

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

仮想マシン

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

コンテナ(Railsアプリ)

コンテナイメージ

DockerデーモンDockerで管理

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

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

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

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

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

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

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

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番ポートに転送

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

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

ポートフォワーディング

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

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

複数コンテナの連携例)

Page 21: Red Hat Enterprise Linux OpenStack Platform環境での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のイメージを事前登録

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

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アプリで使用するデータベースを作成

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

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/ポートは環境変数で参照

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

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;

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

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

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

26

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

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

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

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

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

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

OpenStack/仮想化基盤

仮想マシン(ゲストOS)

アプリA

・・・

・・・

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

OpenStack/仮想化基盤

仮想マシン(Dockerホスト)

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

仮想マシン(Dockerホスト)

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

・・・

・・・

仮想マシン(ゲストOS)

アプリB

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

27

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

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

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

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

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

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

OpenStack/仮想化基盤

仮想マシン(Dockerホスト)

仮想マシン(Dockerホスト)

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

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

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

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

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基盤が開発されていきます

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

OpenShift

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

Docker

Kubernetes

実行リソース提供

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

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

etc.

・・・

OpenStack

・・・

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

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

Docker

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

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

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

30

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

まとめ

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

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

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

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

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

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

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

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

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

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

先進企業が取り組む世界

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

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

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

EMPOWER PEOPLE,

EMPOWER ENTERPRISE,

OPEN INNOVATION.