第2回 東京SoftLayer勉強会に参加してきました

第2回 東京SoftLayer勉強会に参加してきました

第2回 東京SoftLayer勉強会に参加してきました。前回は5月だったので、2ヵ月ぶりの開催ですね。

前回の勉強会メモと同様に、今回も勉強会メモをまとめてみました。

サムライスタートアップアイランドご紹介

はじめに勉強会の会場であるサムライスタートアップアイランドの紹介がありました。

2011年11月1日にオープンしたサムライスタートアップアイランド(SSI=Samurai Startup Island)は、スタートアップ企業とその支援者が集まる場所を提供しているとのことです。
(SSIの紹介ページからの受け売りです……)
会計士さんも常駐しており、スタートアップ企業におけるファイナンス関係のお悩みごともフォローできますとのことです。

現在50社ほど入居しており、コワーキングスペースとしても活用されています。羽田空港が近いことから、外国からの訪問者への対応も考えられており、海外展開を考える企業にもオススメのようです。

SoftLayerのストレージと使い分けについて

発表者は日本IBMの新島さん。SoftLayerのビギナーズガイドを書いておられるとのことです。

SoftLayerはサーバに組み込まれたストレージだけでも複数種類あり、ストレージの観点から利用可能なサービスの一望と目的別の使い分け方の解説という内容での発表でした。

SoftLayerのストレージ

  • BM(Mare Metal Server)とVS(Virtual Server)で構成が異なる
  • BMのディスク

    • SATA,SAS,SSDから選んで指定できる
    • BMのモデルによって搭載できるディスクの台数が異なる
    • 生のディスク(物理的なディスク)なので、必ずミラーリングRAID構成にすること
      • BMのディスクは本当のサーバー(手元に物理サーバを構築する場合)と同じに考えた方がよい
  • VSのディスク

    • ローカルドライブとSAN storageのを選んで指定できる
    • ローカルドライブは2台で400Gまで

    • SAN storage(iSCSI)は以下の構成から選択できる

      • 5台まで、25,100Gまで、2台以降は100-2000GBまで)の2つ
    • 仮装サーバのローカルドライブ→故障すると少し時間かかる

      • (SoftLayerの中の人が故障ドライブをせっせと交換する)
    • SANストレージの場合はバックアップ構成がくめる
      • ただしネットワークも障害点となる可能性が出てくる
  • portable diskとしての利用

    • virtual serverの2nd diskを切り離し、portable diskとして利用できる
    • 切り離したportable diskは、別のvirtual serverに取り付けることもできる

SoftLayerで利用できるストレージ

  • NAS,iSCSI,オブジェクトストレージが利用できる
  • NAS
    • CIFS,FTPでアクセス可能
    • プライベートLANに接続されている
      • (SoftLayerのサーバルーム写真における、青色のケーブルですね)
    • 現時点では未対応のため、NFSは利用できない
  • iSCSI
    • iSCSIもプライベートLANに接続されている
    • スナップショットが取得可能
    • データセンター間でレプリケーション可能
  • オブジェクトストレージ
    • OpenStackのswift互換
    • ポータルやREST APIからアクセスできる
    • CloudFuseでインスタンスにmountして使うこともできる
    • CDNを使ってファイルを配信することもできる
  • eVault(イーボルト)というバックアップツールがある

iSCSIのスナップショット

  • 30分毎にレプリケーションが実行される
  • 切り戻しは時間がかかる
  • レプリカのカスケードはできないので、マスター復帰時には必ず切り戻しが行われる
    • 切り戻しは時間がかかる!とのこと

各ストレージの使い分け

  • サーバのストレージとして

    • 大容量ならBMでSATA Drive
    • 高速IOならBMでSSDSAS Drive
    • サーバ生涯時の切り替えならVSでSAN Drive
    • 少用量で安さならVSでlocal drive
  • データ用、バックアップ用として

    • Snapshot使いたいならiSCSI
    • 複数サーバで共有したいなら
      • NASもしくは
      • VSかBMでファイルサーバを構成、
    • archive用ならobject storage

その他

  • 近日中にiSCSIの弱点を克服したソリューションが出てくるかも?

Why Riak & Why SoftLayer?

発表者はBashoジャパンの上西さん。Riakの紹介とSoftLayer上でRiakを動かすと何が嬉しいかについての発表でした。

スライドはWhy Riak? Why SoftLayer?にて公開されています。

スライドが公開されているので、自分のメモは不要かとも思ったのですが、前回のSoftLayer勉強会でのRiakのLTはただ聞くだけになっていたので、今一度自分なりにRiakについてがーっとまとめてみました。

Riakについて

  • システムの運用において可用性は大事
  • しかし、可用性に対する脅威は数多く存在する
    • ハードウェア故障
    • ネットワーク故障
      • スプリットブレインシンドロームによるデータ破壊
    • ソフトウェアのアップデートやメンテナンス
    • システムの過負荷

Riak

  • RiakはErlangで記述されたNoSQLデータベース
  • QuorumレプリケーションによりN個のノードにデータを複製することでノードがひとりくらい壊れていてもデータの書き込みが可能
  • 各ノードが管理するパーティションConsistent Hashingと呼ばれる160bitのキー空間を等分したリング状のハッシュテーブルになっている
    • レプリカはN個(=3)のノードにコピーされる

ノードが一時故障した場合

  • リング上の次のパーティションに書き込むことで、レプリカがN個ある状態を担保しておく
  • 一時故障ノードが復旧した時にレプリカを返す

ネットワーク故障の場合

  • Riakでは分断された各ノードでの書き込みを許容する
  • 復旧したら書き戻す
  • そのため、復旧時にデータの不整合(暗黙的な上書き)が発生する場合がある
    • 以下の手法で不整合を回避する
    • 不整合のパターンはいくつか存在する
      • write-write conflick →比較的対応しやすい
      • write-delete conflick →少しややこしい対応手順になる

Riakのバックアップ機能

なぜクラウドでRiakか

  • DBなどのミドルウェアが優れていてもHWがこけたら意味がない
  • なので、SoftlayerのBM上でRiakを使えると嬉しい
  • なぜBMか?VSではダメなのか?
    • 分散システムで大事なことは「故障の単位」
    • VSが動いているBMがこけると、Riakからは多重故障にみえてしまう
      • するとRiakの分散ノードがまるごと落ちるという事態が発生する
      • そのため、RiakはBMでの運用を推奨している

その他

参考リンク

QuantaStor概説/QuantaStor使ってみた

発表者はアファーム・ビジネスパートナーズ株式会社の西脇さんと日本情報通信の常田さん。

QuantaStoreアーキテクチャユースケース、使ってみた感想についての発表でした。

  • OSNEXUSについて

  • QuantaStor

    • QuantaStorはSAN(iSCSI/FC)とNAS(NFS)を兼ね備えたストレージアプライアンス
    • 64bit Intel/AMDの汎用サーバで稼働するUbuntu Server(Linux)上にインストールし、ソフトウェアベースのストレージとして利用する
    • QuantaStorはBMのみで利用可能
      • また、RAID構成を組む必要があるため、ディスクは4本以上必要
      • (SoftLayerのBMのドライブ数は2,4,6,12,24,36から選択できる)
  • 来月のSoftwareDedisnからSoftLayerの記事が連載されるとのこと

参考リンク

Object Storageを使ってみた

発表者は日本IBM高良さんSoftLayer探検隊の隊長さんとのことです。

Raspberry PiとSoftLayerのObjectStorageの連携に関する発表でした。

発表スライドは第二回SoftLayerユーザ会 ラズベリーパイとオブジェクトストレージを繋いでみたにて公開されています。詳細な手順はSoftLayer探検隊 第16回 Raspberry Pi で撮影した画像をSoftLayerのオブジェクト・ストレージに保存するにて公開されています。

発表の中で「組み込み機器とクラウドがつながる時代になった」という説明が印象的でした。最近IoT(Internet of Things:モノのインターネット)という言葉(バズワード?)をよく聞きますが、Raspberry PiとSoftLayerの組み合わせによる具体的な事例を見るのは初めてだったので、とても感銘をうけました。

SoftLayerでDockerを使ってみた

発表者はCUPA(一般社団法人クラウド利用促進機構)荒井さん

Dockerを利用したシステムポータビリティとDR(Disaster Recovery)対応について、SoftLayerを使用しての解説でした。

Dockerは個人的に試してみたいと常々思っていたので、SoftLayerの話は一旦どっかに置いておき(Dockerだけに)、別途ブログ記事を分けてみました。

まとめ

第2回東京SoftLayer勉強会に参加してみました。何となくSoftLayerがどんなものが見えてきた気がします。とはいえ、実はまだSoftLayerを使ってみたことが無いので、そろそろ触ってみようかなと思います。

CentOS 7.0でDockerを動かしてみた

CentOS 7.0でDockerを動かしてみた

先日開催された第2回東京SoftLayer勉強会で『SoftLayerでDockerを使ってみた』という発表があり、Dockerのインストールから使い方までの手順が解説されていました。

個人的にDockerを試してみたいということもあり、さっそく解説されていた手順を参考にDockerを動かしてみました。勉強会ではCentOS 6系向けの手順となっていましたが、私の方ではCentOS 7系で試してみました。

CentOS 7.0のセットアップ

GUI等は使用しないので、minimalインストールの状態からDocker環境を構築していきます。以下はインストール後にsshログインが行えるようになるまでの手順です。

SELinuxの無効化

/etc/selinux/configを以下のように修正し、SELinuxを無効化します。

--- config.orig 2014-07-29 11:24:02.949653548 +0900
+++ config      2014-07-29 11:24:09.957653412 +0900
@@ -4,7 +4,7 @@
 #     enforcing - SELinux security policy is enforced.
 #     permissive - SELinux prints warnings instead of enforcing.
 #     disabled - No SELinux policy is loaded.
-SELINUX=enforcing
+SELINUX=disabled
 # SELINUXTYPE= can take one of these two values:
 #     targeted - Targeted processes are protected,
 #     minimum - Modification of targeted policy. Only selected processes are protected.

grub.cfgの設定

起動時のコンソールログを見えるようにしておきたいので、/boot/grub2/grub.cfgを以下のように修正します。ついでにLANGもen_US.UTF-8に変更しておきます。

--- grub.cfg.orig       2014-07-29 11:24:18.721653243 +0900
+++ grub.cfg    2014-07-29 11:24:38.572652858 +0900
@@ -81,7 +81,7 @@
        else
          search --no-floppy --fs-uuid --set=root dd4521d9-ca1c-462b-b353-2ba57bf4fc61
        fi
-       linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=ja_JP.UTF-8
+       linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 LANG=en_US.UTF-8
        initrd16 /boot/initramfs-3.10.0-123.el7.x86_64.img
 }
 menuentry 'CentOS Linux, with Linux 0-rescue-6764668114ff4741a8994286ae140fdd' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-6764668114ff4741a8994286ae140fdd-advanced-dd4521d9-ca1c-462b-b353-2ba57bf4fc61' {
@@ -95,7 +95,7 @@
        else
          search --no-floppy --fs-uuid --set=root dd4521d9-ca1c-462b-b353-2ba57bf4fc61
        fi
-       linux16 /boot/vmlinuz-0-rescue-6764668114ff4741a8994286ae140fdd root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet
+       linux16 /boot/vmlinuz-0-rescue-6764668114ff4741a8994286ae140fdd root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16
        initrd16 /boot/initramfs-0-rescue-6764668114ff4741a8994286ae140fdd.img
 }
 if [ "x$default" = 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' ]; then default='Advanced options for CentOS Linux>CentOS Linux, with Linux 3.10.0-123.el7.x86_64'; fi;

ホスト名の設定

以下の手順でホスト名を設定します。

# echo dockertest.furandon.net > /etc/hostname

固定IPアドレスの設定

DHCPよりも固定IPアドレスの方が作業しやすいため、Arch Wikiの『固定IPアドレス』を参考にしながら設定します。

/etc/conf.d/network@enp0s3にIPアドレス等を記述します。/etc/conf.dディレクトリは存在しないので予め作成しておきます。

# mkdir /etc/conf.d
# touch /etc/conf.d/enp0s3

/etc/conf.d/network@enp0s3の中身は以下の通りです。

address=192.168.0.232
netmask=24
broadcast=192.168.0.255
gateway=192.168.0.1

/etc/systemd/system/network@.serviceにsystemdのユニットファイルを作成します。
(Arch Wikiの内容を参考に作成しています)
Arch Wikiの/etc/systemd/system/network@.service中でipコマンドが/usr/bin/ipでフルパス指定されていますが、CentOS-7では/sbin/ipとパスが異なるので注意してください。

[Unit]
Description=Network connectivity (%i)
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/network@%i

ExecStart=/sbin/ip link set dev %i up
ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev %i
ExecStart=/bin/sh -c 'test -n ${gateway} && /sbin/ip route add default via ${gateway}'

ExecStop=/sbin/ip addr flush dev %i
ExecStop=/sbin/ip link set dev %i down

[Install]
WantedBy=multi-user.target

サービスを有効化します。

# systemctl enable network@enp0s3.service

/etc/resolv.confの設定

インストール時にrpmパッケージのインストール等でネットワーク設定が行われており、/etc/resolv.confには(DHCPでのIPアドレス取得による)nameserver設定が入っています。固定IPアドレスでも同じnameserver設定を利用するため、この段階での設定変更は不要です。

LANGの設定

/etc/locale.confでLANGをen_US.UTF-8に設定します。
(日本語のままでいいよ、という場合はこの手順をスキップしてください)

--- locale.conf.orig    2014-07-29 11:24:55.014652540 +0900
+++ locale.conf 2014-07-29 11:25:01.258652419 +0900
@@ -1 +1 @@
-LANG="ja_JP.UTF-8"
+LANG="en_US.UTF-8"

不要なサービスの停止

Dockerを試す用途では不要と思われるサービスを停止します。

$ sudo systemctl disable avahi-daemon.service
$ sudo systemctl disable dbus-org.fedoraproject.FirewallD1.service
$ sudo systemctl disable dbus-org.freedesktop.Avahi.service
$ sudo systemctl disable dbus-org.freedesktop.NetworkManager.service
$ sudo systemctl disable dbus-org.freedesktop.nm-dispatcher.service
$ sudo systemctl disable NetworkManager-dispatcher.service
$ sudo systemctl disable NetworkManager.service
$ sudo systemctl disable postfix.service
$ sudo systemctl disable tuned.service
$ sudo systemctl disable avahi-daemon.socket

ユーザの追加

作業用のユーザを追加します。

$ sudo useradd -g users -G wheel -m -s /bin/bash fpig
$ sudo passwd fpig

再起動

ここで一旦再起動します。再起動後、固定IPアドレスが付与されているか等の確認をおこないます。

$ sudo shutdown -r now

ここまでで最低限の設定は完了し、sshでログインできる状態になっています。
以降はsshログインした状態での作業となります。

Dockerを試してみる

dockerのインストール

docker.x86_64というパッケージが提供されているので、これをインストールします。

$ yum search docker
...
docker-registry.noarch : Registry server for Docker
docker.x86_64 : Automates deployment of containerized applications
$ sudo yum install docker

勉強会で例示されていたCentOS 6系の環境では、EPELからDockerをインストールしていましたが、CentOS 7系の環境ではベースリポジトリにDockerパッケージが含まれていました。

$ rpm -qa | grep docker
docker-0.11.1-22.el7.centos.x86_64
$ yum provides docker
...
docker-0.11.1-19.el7.centos.x86_64 : Automates deployment of containerized
                                   : applications
Repo        : extras
$ grep -A5 '^\[extras' /etc/yum.repos.d/CentOS-Base.repo
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Dockerサービスを有効化します。DockerパッケージにSystemdのユニットファイルが同梱されているので、これを利用します。

$ rpm -ql docker-0.11.1-22.el7.centos.x86_64 | grep systemd
/usr/lib/systemd/system/docker.service
$ sudo systemctl enable docker.service
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'
$ systemctl list-unit-files | grep docker
docker.service                            enabled

上記設定は再起動してから有効になるので、ここでは手動でdocker.serviceを起動します。

$ sudo systemctl start docker.service

さっそくdockerコマンドを使ってみます。

$ sudo docker version
Client version: 0.11.1-dev
Client API version: 1.12
Go version (client): go1.2
Git commit (client): 02d20af/0.11.1
Server version: 0.11.1-dev
Server API version: 1.12
Go version (server): go1.2
Git commit (server): 02d20af/0.11.1

Dockerイメージのダウンロード

手元でDockerイメージを作るところまで試してみたかったのですが、まだ使い始めたばかりということもあり、既存のDockerイメージファイルを使ってみることにしました。

$ sudo docker pull ubuntu

しばらく待つとUbuntuのイメージファイルが手元にダウンロードされます。使用可能なイメージはdocker imageで確認できます。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               ba5877dc9bec        7 days ago          192.7 MB
ubuntu              trusty              ba5877dc9bec        7 days ago          192.7 MB
ubuntu              latest              ba5877dc9bec        7 days ago          192.7 MB
ubuntu              precise             b9e56c8f2cf5        7 days ago          103.8 MB
ubuntu              12.04               b9e56c8f2cf5        7 days ago          103.8 MB
ubuntu              14.10               6ef6f1a66de1        7 days ago          194.1 MB
ubuntu              utopic              6ef6f1a66de1        7 days ago          194.1 MB
ubuntu              12.10               c5881f11ded9        5 weeks ago         172.1 MB
ubuntu              quantal             c5881f11ded9        5 weeks ago         172.1 MB
ubuntu              13.04               463ff6be4238        5 weeks ago         169.4 MB
ubuntu              raring              463ff6be4238        5 weeks ago         169.4 MB
ubuntu              13.10               195eb90b5349        5 weeks ago         184.6 MB
ubuntu              saucy               195eb90b5349        5 weeks ago         184.6 MB
ubuntu              10.04               3db9c44f4520        3 months ago        183 MB
ubuntu              lucid               3db9c44f4520        3 months ago        183 MB

Dockerコンテナの起動

さっそくDockerでUbuntuを起動してみます。

$ sudo docker run -i -t ubuntu:14.10 /bin/bash

サクッとUbuntuが起動しました!
/etc/lsb-releaseを見ると、確かにUbuntuです。

root@9cf71dd83894:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.10
DISTRIB_CODENAME=utopic
DISTRIB_DESCRIPTION="Ubuntu Utopic Unicorn (development branch)"

Dockerコンテナのデタッチ・アタッチ

起動したDockerコンテナ上でexitするとコンテナは停止してしまいます。練習もかねてDockerコンテナのデタッチ→アタッチ→exitによるコンテナ停止という手順を試してみます。

Dockerコンテナを終了せずに抜ける(デタッチする)には、Ctrl+p Ctrl+qを入力します。

root@9cf71dd83894:/# (ここでCtrl+p Ctrl+qを入力)$
$

docker psコマンドで稼働しているコンテナを確認できます。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9cf71dd83894        ubuntu:14.10        /bin/bash           9 minutes ago       Up 9 minutes                            backstabbing_rosalind0

コンテナにアタッチしてみます。

$ sudo docker attach 9cf71dd83894
root@9cf71dd83894:/#

無事にアタッチでできました。後はexitでコンテナを終了します。

root@9cf71dd83894:/# exit
exit
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$

export/import

私の手元ではまだ試していませんが、イメージファイルのexport/importも可能です。
以下の手順でexport/importを行います。

$ docker export <コンテナID>
$ docker export 14773ff9e93c > myweb.tar    # コマンド例
$ docker import [リポジトリTAG]
$ docker import < - myweb:rel1 < myweb.tar  # コマンド例

ローカルストレージのアタッチ

こちらも私の手元では試していませんが、Runコマンドの"-v"オプションでホストのディレクトリをアタッチ可能です。

$ docker run -t -i -v <local_dir>:<container dir>:<rw|ro> centos /bin/bash
$ docker run -d -p 5000:5000 -v /home/hoge/data:/tmp/data centos  # コマンド例

/home/data/dataは、共有ストレージ(NFS)やディスクミラー(DRBD)、分散ストレージ(Ceph-fs)等を利用して自分でミラーリングします。

まとめ

参加した勉強会でDockerの一連の使用手順が解説されていました。Dockerを覚えてみたいと思っていたので、さっそく覚えた手順を自分の環境で試してみました。

思っていたよりも簡単にコンテナの実行が行え、ついに我が家にもDockerの技術が伝来したという感じです。
(種子島に火縄銃が伝来した……という気分です)

まだ試してはいないものの、イメージのexport/importやプライベートリポジトリといった機能もあるようなので、勉強会用のイメージ提供に活用できればと思います。