SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
すごく分かるWarden

岩嵜 雄大
NTT Software Innovation Center
2012-07-26


                 NTT Software Innovation Center
Warden(ウォードン)とは




                    https://github.com/cloudfoundry/warden




             DEA上でアプリケーションを隔離する仕組み



2012-07-26          NTT Software Innovation Center           2
Outline




              なぜWardenが必要なのか



              Wardenの動作原理




2012-07-26            NTT Software Innovation Center   3
なぜWardenが必要なのか




2012-07-26      NTT Software Innovation Center   4
なぜWardenが必要なのか

       ユーザ権限で
         動作
                   App               App                  App




                         DEAホスト(OS)


              Appはユーザが自由に開発する
              – 悪意のあるAppの可能性もある


              現在はUNIX UserによりAppを隔離

2012-07-26               NTT Software Innovation Center         5
Unix Userの問題点


             App         App       App
                                          脆弱性に弱い
                                               – 特権昇格
                   DEAホスト(OS)




                   App
                               A
                               p
                                     A
                                     p
                                          他のAppの影響を受ける
                                               – CPU、メモリ、IO、etc.
                               p     p


                   DEAホスト(OS)




             App         App       App
                                          情報が他Appに伝わる
                                               – PID、CPU、メモリ、etc.
                                               – 気持ち悪い
                   DEAホスト(OS)




2012-07-26                               NTT Software Innovation Center   6
求められるもの




                  App               App                  App    制限



                               DEAホスト

                                                               一方通行
              App環境の隔離
              リソース制限の導入
              操作用API

2012-07-26              NTT Software Innovation Center                7
FAQ
  AppごとにVM建てればいいのでは?
      – パフォーマンス的に難しい


  chroot jailではダメ?
      – マウントポイントしか隠ぺいできない


  LXCではダメ?
      – 初期のWardenはLXCを利用していたが…
      – Linuxでしか動かない
      – 機能過多




2012-07-26       NTT Software Innovation Center   8
Wardenの動作原理




2012-07-26    NTT Software Innovation Center   9
基本方針

              コンテナ
              – 環境の隔離:Namespaces
              – リソース制限:Cgroups
              – /sbin/init起動によるシステムコンテナ


              操作用API
              – Wardenサーバがコンテナを管理
              – Warden Protocl経由でサーバにアクセス




2012-07-26              NTT Software Innovation Center   10
Cgroups

              Linux Kernel 2.6.24から

              プロセスをグループに分離
              – メモリ使用量、CPU・IOの優先度




                                                           書いてあるよ!




2012-07-26                NTT Software Innovation Center             11
Namepaces

              プロセスの名前空間を分離
              – PID、Network, Mount、UTS、IPC、User
              – unshare(1), clone(2)


              マウント状況も分離される
              – 高級版chroot jail


              ネットワークも分離される
              – 仮想NIC(veth)を使用




2012-07-26                NTT Software Innovation Center   12
Wardenの概要
        Warden
       クライアント


                                                                      ②コンテナの起動
                 EMサーバ                        シェル
                  (Ruby)                    スクリプト群
                  Linux
                  クラス                                       clone.c     DEA

             コンテナ
                                                            ①コンテナの生成
             ジョブ
                          sshd
                                       ③ジョブの起動
                   OS


2012-07-26                 NTT Software Innovation Center                        13
サーバ本体

        Warden
       クライアント


                                                                      ②コンテナの起動
                 EMサーバ                        シェル
                  (Ruby)                    スクリプト群
                  Linux
                  クラス                                       clone.c     DEA

             コンテナ
                                                            ①コンテナの生成
             ジョブ
                          sshd
                                       ③ジョブの起動
                   OS


2012-07-26                 NTT Software Innovation Center                        14
サーバ本体

              /lib/warden

              命令を受け取ってコンテナの操作を行う
              – EMがListen
              – OS・環境ごとのクラスに委譲


              Linuxクラス
              – シェルスクリプトに処理を委託




2012-07-26                   NTT Software Innovation Center   15
サーバ本体
  /lib/warden/container/linux.rb

   def do_create
     sh "#{env_command} #{root_path}/create.sh #{handle}", :timeout => nil
     debug "container created"

      write_bind_mount_commands                                 コンテナの生成
      debug "wrote bind mount commands"

     sh "#{container_path}/start.sh", :timeout => nil
     debug "container started"
   end
                                                     コンテナの起動
                                                   (コンテナは常時起動)




2012-07-26                     NTT Software Innovation Center                16
シェルスクリプト部分

        Warden
       クライアント


                                                                      ②コンテナの起動
                 EMサーバ                        シェル
                  (Ruby)                    スクリプト群
                  Linux
                  クラス                                       clone.c     DEA

             コンテナ
                                                            ①コンテナの生成
             ジョブ
                          sshd
                                       ③ジョブの起動
                   OS


2012-07-26                 NTT Software Innovation Center                        17
シェルスクリプト部分

              /root/linux

              コンテナの生成・削除

              Skeleton
               – ファイルがコンテナごとにコピーされる




2012-07-26                   NTT Software Innovation Center   18
シェルスクリプト部分(コンテナ生成)
  /root/linux/create.sh
   # インスタンスごとのディレクトリ
   target="instances/${1}"
   mkdir -p instances
   …
   cp -r skeleton "${target}“
   unshare -m "${target}"/setup.sh

      – スケルトンをコピー
      – マウント名前空間をunshareしてsetup.shを実行


  /root/linux/skeleton/setup.sh
      – 設定を/etc内に書きだす
      – /etc/ssh, /etc/init.d, /etc/hosts, etc.

2012-07-26                NTT Software Innovation Center   19
シェルスクリプト部分(コンテナ起動)
  /root/linux/skeleton/start.sh

   env -i unshare -n ../../../../src/clone/clone


      – network名前空間をunshareしてclone.cを実行




2012-07-26          NTT Software Innovation Center   20
シェルスクリプト部分

        Warden
       クライアント


                                                                      ②コンテナの起動
                 EMサーバ                        シェル
                  (Ruby)                    スクリプト群
                  Linux
                  クラス                                       clone.c     DEA

             コンテナ
                                                            ①コンテナの生成
             ジョブ
                          sshd
                                       ③ジョブの起動
                   OS


2012-07-26                 NTT Software Innovation Center                        21
clone.c

              /src/clone/clone.c

              システムコールによるコンテナ生成
               – clone(2)




2012-07-26                  NTT Software Innovation Center   22
clone.c
  /src/clone/clone.c
   rv = unshare(CLONE_NEWNS);
   …
   # clone前のフック
   # コンテナ用のファイルシステムをマウントする
   rv = run("./hook-parent-before-clone.sh");
   …
   # コンテナ内のinitプロセスを起動する
   rv = parent_clone_child(h);
   …
   # clone後のフック
   rv = run("./hook-parent-after-clone.sh");



2012-07-26          NTT Software Innovation Center   23
clone.c
  /src/clone/clone.c
   rv = unshare(CLONE_NEWNS);
   …
   # clone前のフック
   # コンテナ用のファイルシステムをマウントする
   rv = run("./hook-parent-before-clone.sh");
   …
   # コンテナ内のinitプロセスを起動する
   rv = parent_clone_child(h);
   …
   # clone後のフック
   rv = run("./hook-parent-after-clone.sh");



2012-07-26          NTT Software Innovation Center   24
skeletonに寄り道
  /root/linux/skeleton/hook-parent-before-clone.sh
   setup_fs

  /root/linux/skeleton/common.sh:setup_fs()
   if [ ! -f fs ]; then
       dd if=/dev/null of=fs bs=1M seek=${disk_size_mb}
       …
   fi
     mkdir -p rootfs ${target}
     mount -n -o loop fs rootfs
   …
       mount -n -t overlayfs -o
   rw,upperdir=rootfs,lowerdir=../../base/rootfs none ${target}


      – コンテナごとのファイルをループバックマウント
      – OSが入っているベースにオーバーレイ
         • ベースは書き込み禁止状態で共有
2012-07-26                    NTT Software Innovation Center      25
clone.c
  /src/clone/clone.c
   rv = unshare(CLONE_NEWNS);
   …
   # clone前のフック
   # コンテナ用のファイルシステムをマウントする
   rv = run("./hook-parent-before-clone.sh");
   …
   # コンテナ内のinitプロセスを起動する
   rv = parent_clone_child(h);
   …
   # clone後のフック
   rv = run("./hook-parent-after-clone.sh");



2012-07-26          NTT Software Innovation Center   26
clone.c

   int parent_clone_child(clone_helper_t *h) {
     …
     # 名前空間分離の設定
     /* Setup namespaces */
     flags |= CLONE_NEWIPC;
     flags |= CLONE_NEWNET;
     flags |= CLONE_NEWNS;
     flags |= CLONE_NEWPID;
     flags |= CLONE_NEWUTS;

       # start()から子プロセス起動
       pid = clone(start, stack, flags, h);
       …
   }

2012-07-26            NTT Software Innovation Center   27
clone.c



   int start(void *data) {
   …
     rv = run(hook_before_pivot
   …
     rv = run(hook_after_pivot);
   …
     # /sbin/initをexecvpして起動完了
     char * const argv[] = { "/sbin/init", "--debug", NULL };
     execvp(argv[0], argv);
   …
   }




2012-07-26                 NTT Software Innovation Center       28
clone.c
  /src/clone/clone.c
   rv = unshare(CLONE_NEWNS);
   …
   # clone前のフック
   # コンテナ用のファイルシステムをマウントする
   rv = run("./hook-parent-before-clone.sh");
   …
   # コンテナ内のinitプロセスを起動する
   rv = parent_clone_child(h);
   …
   # clone後のフック
   rv = run("./hook-parent-after-clone.sh");



2012-07-26          NTT Software Innovation Center   29
skeletonに寄り道
  /root/linux/skeleton/hook-parent-after-clone.sh


   # 新しいcgroupを作って
   mkdir -p /dev/cgroup/instance-${id}
   pushd /dev/cgroup/instance-${id} > /dev/null

   # 上限などを決め
   cat ../cpuset.cpus > cpuset.cpus
   cat ../cpuset.mems > cpuset.mems

   # 子プロセスに値をコピーするコールバックを呼ぶ設定
   echo 1 > cgroup.clone_children
   # cgroupsに現在のプロセスを登録
   echo ${PID} > tasks




2012-07-26              NTT Software Innovation Center   30
ジョブの起動

        Warden
       クライアント


                                                                      ②コンテナの起動
                 EMサーバ                        シェル
                  (Ruby)                    スクリプト群
                  Linux
                  クラス                                       clone.c     DEA

             コンテナ
                                                            ①コンテナの生成
             ジョブ
                          sshd
                                       ③ジョブの起動
                   OS


2012-07-26                 NTT Software Innovation Center                        31
ファイルの送受信とコマンドの実行

              DEA用の特別な仕掛けは見当たらない
              – ファイルの送受信(rsync)
              – コマンドの実行(ssh)
                 • ジョブとして入出力を管理




2012-07-26            NTT Software Innovation Center   32
ジョブの起動
  /lib/warden/container/linux.rb
   def create_job(request)
     user = request.privileged ? "root" : "vcap"

       # -T: Never request a TTY
       # -F: Use configuration from <container_path>/ssh/ssh_config
       args = ["-T",
               "-F", File.join(container_path, "ssh", "ssh_config"),
               "#{user}@container"]
       args << { :input => request.script }

       child = DeferredChild.new("ssh", *args)
   …




2012-07-26                   NTT Software Innovation Center            33
ファイルの送受信
  /lib/warden/container/linux.rb
   def do_copy_in(request, response)
     src_path = request.src_path
     dst_path = request.dst_path

     perform_rsync(src_path, "vcap@container:#{dst_path}")

     nil
   end

   def do_copy_out(request, response)
     src_path = request.src_path
     dst_path = request.dst_path

     perform_rsync("vcap@container:#{src_path}", dst_path)

     if request.owner
       sh "chown", "-R", request.owner, dst_path
     end

     nil
   end

   private

   def perform_rsync(src_path, dst_path)
     ssh_config_path = File.join(container_path, "ssh", "ssh_config")

     # Build arguments
     args = ["rsync"]
     args += ["-e", "ssh -T -F #{ssh_config_path}"]
     args += ["-r"] # Recursive copy
     args += ["-p"] # Preserve permissions
     args += ["--links"] # Preserve symlinks
     args += [src_path, dst_path]

     # Add option hash
     args << { :timeout => nil }

     sh *args
   end



2012-07-26                                               NTT Software Innovation Center   34
まとめ



              WardenはApp隔離用のコンテナ

              LinuxではCgroupsとNamespacesを使用

              サーバがコンテナの操作を行う

              ファイルを転送してコマンドを実行する




2012-07-26             NTT Software Innovation Center   35

Más contenido relacionado

La actualidad más candente

WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
You_Kinjoh
 

La actualidad más candente (20)

Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
hbstudy# 28 SELinux HandsOn 公開版
hbstudy# 28 SELinux HandsOn 公開版hbstudy# 28 SELinux HandsOn 公開版
hbstudy# 28 SELinux HandsOn 公開版
 
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
 
Pcapngを読んでみる
Pcapngを読んでみるPcapngを読んでみる
Pcapngを読んでみる
 
OpenID Connect入門
OpenID Connect入門OpenID Connect入門
OpenID Connect入門
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐる
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
React(TypeScript) + Go + Auth0 で実現する管理画面
React(TypeScript) + Go + Auth0 で実現する管理画面React(TypeScript) + Go + Auth0 で実現する管理画面
React(TypeScript) + Go + Auth0 で実現する管理画面
 
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門
 
FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話
 
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdfわたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
 

Destacado

Greenpaper creative industries
Greenpaper creative industriesGreenpaper creative industries
Greenpaper creative industries
pesec
 
Бенчмаркинг День 2013 - программа
Бенчмаркинг День 2013 - программаБенчмаркинг День 2013 - программа
Бенчмаркинг День 2013 - программа
Yulya Uzhakina
 

Destacado (20)

Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラーCloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
 
Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎
 
Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門
Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門
Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門
 
DevStackで始めるCloud FoundryとBOSH
DevStackで始めるCloud FoundryとBOSHDevStackで始めるCloud FoundryとBOSH
DevStackで始めるCloud FoundryとBOSH
 
BOSHでお手軽CFデプロイon AWS
BOSHでお手軽CFデプロイon AWSBOSHでお手軽CFデプロイon AWS
BOSHでお手軽CFデプロイon AWS
 
Autoscaling Cloud Foundry with BOSH
Autoscaling Cloud Foundry with BOSHAutoscaling Cloud Foundry with BOSH
Autoscaling Cloud Foundry with BOSH
 
Cloud Foundry varz
Cloud Foundry varzCloud Foundry varz
Cloud Foundry varz
 
たまにはOpenShiftも触ってみよう
たまにはOpenShiftも触ってみようたまにはOpenShiftも触ってみよう
たまにはOpenShiftも触ってみよう
 
はじめてのCF buildpack
はじめてのCF buildpackはじめてのCF buildpack
はじめてのCF buildpack
 
Cloud Foundry V2を、もうちょっと深掘りしよう
Cloud Foundry V2を、もうちょっと深掘りしようCloud Foundry V2を、もうちょっと深掘りしよう
Cloud Foundry V2を、もうちょっと深掘りしよう
 
Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
Cloud Foundryで学ぶ、PaaSのしくみ講座
Cloud Foundryで学ぶ、PaaSのしくみ講座Cloud Foundryで学ぶ、PaaSのしくみ講座
Cloud Foundryで学ぶ、PaaSのしくみ講座
 
Greenpaper creative industries
Greenpaper creative industriesGreenpaper creative industries
Greenpaper creative industries
 
D2 career development v1
D2 career development v1D2 career development v1
D2 career development v1
 
Бенчмаркинг День 2013 - программа
Бенчмаркинг День 2013 - программаБенчмаркинг День 2013 - программа
Бенчмаркинг День 2013 - программа
 
Leadership Coaching MasterNous
Leadership Coaching MasterNousLeadership Coaching MasterNous
Leadership Coaching MasterNous
 
Alfan P Laksono
Alfan P LaksonoAlfan P Laksono
Alfan P Laksono
 
D2 interview skills v1
D2 interview skills v1D2 interview skills v1
D2 interview skills v1
 
Bản tin Sống độc lập số 42 (Tháng 6 và 7 năm 2013)
Bản tin Sống độc lập số 42 (Tháng 6 và 7 năm 2013)Bản tin Sống độc lập số 42 (Tháng 6 và 7 năm 2013)
Bản tin Sống độc lập số 42 (Tháng 6 và 7 năm 2013)
 

Similar a すごく分かるwarden

JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Study
irix_jp
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
Etsuji Nakai
 
CloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/SwiftCloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/Swift
irix_jp
 
OSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; OverviewOSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; Overview
irix_jp
 
#01-03 solaris11で深化するクラウド
#01-03 solaris11で深化するクラウド#01-03 solaris11で深化するクラウド
#01-03 solaris11で深化するクラウド
SolarisJPNight
 
2012-04-25 ASPLOS2012出張報告(公開版)
2012-04-25 ASPLOS2012出張報告(公開版)2012-04-25 ASPLOS2012出張報告(公開版)
2012-04-25 ASPLOS2012出張報告(公開版)
Takahiro Shinagawa
 

Similar a すごく分かるwarden (20)

CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloud
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Study
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
 
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
 
「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~
「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~
「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~
 
MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
 
OSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUGOSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUG
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
CloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/SwiftCloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/Swift
 
Introduction of Rancher at OSC Tokyo 17 Spring
Introduction of Rancher at OSC Tokyo 17 SpringIntroduction of Rancher at OSC Tokyo 17 Spring
Introduction of Rancher at OSC Tokyo 17 Spring
 
120516openqrm deepdive
120516openqrm deepdive120516openqrm deepdive
120516openqrm deepdive
 
OpenStack概要
OpenStack概要OpenStack概要
OpenStack概要
 
OSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; OverviewOSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; Overview
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 
#01-03 solaris11で深化するクラウド
#01-03 solaris11で深化するクラウド#01-03 solaris11で深化するクラウド
#01-03 solaris11で深化するクラウド
 
2012-04-25 ASPLOS2012出張報告(公開版)
2012-04-25 ASPLOS2012出張報告(公開版)2012-04-25 ASPLOS2012出張報告(公開版)
2012-04-25 ASPLOS2012出張報告(公開版)
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会
 

Más de i_yudai

Nise BOSH in Action
Nise BOSH in ActionNise BOSH in Action
Nise BOSH in Action
i_yudai
 

Más de i_yudai (7)

OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
 
Cloud Foundry Admin UI v2を使ってみた
Cloud Foundry Admin UI v2を使ってみたCloud Foundry Admin UI v2を使ってみた
Cloud Foundry Admin UI v2を使ってみた
 
BOSHで始めるImmutable Infrastructure
BOSHで始めるImmutable InfrastructureBOSHで始めるImmutable Infrastructure
BOSHで始めるImmutable Infrastructure
 
BOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud FoundryBOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud Foundry
 
Nise BOSH in Action
Nise BOSH in ActionNise BOSH in Action
Nise BOSH in Action
 
めんどうくさくないWardenハンズオン
めんどうくさくないWardenハンズオンめんどうくさくないWardenハンズオン
めんどうくさくないWardenハンズオン
 
すごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼうすごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼう
 

すごく分かるwarden

  • 1. すごく分かるWarden 岩嵜 雄大 NTT Software Innovation Center 2012-07-26 NTT Software Innovation Center
  • 2. Warden(ウォードン)とは https://github.com/cloudfoundry/warden DEA上でアプリケーションを隔離する仕組み 2012-07-26 NTT Software Innovation Center 2
  • 3. Outline  なぜWardenが必要なのか  Wardenの動作原理 2012-07-26 NTT Software Innovation Center 3
  • 4. なぜWardenが必要なのか 2012-07-26 NTT Software Innovation Center 4
  • 5. なぜWardenが必要なのか ユーザ権限で 動作 App App App DEAホスト(OS)  Appはユーザが自由に開発する – 悪意のあるAppの可能性もある  現在はUNIX UserによりAppを隔離 2012-07-26 NTT Software Innovation Center 5
  • 6. Unix Userの問題点 App App App  脆弱性に弱い – 特権昇格 DEAホスト(OS) App A p A p  他のAppの影響を受ける – CPU、メモリ、IO、etc. p p DEAホスト(OS) App App App  情報が他Appに伝わる – PID、CPU、メモリ、etc. – 気持ち悪い DEAホスト(OS) 2012-07-26 NTT Software Innovation Center 6
  • 7. 求められるもの App App App 制限 DEAホスト 一方通行  App環境の隔離  リソース制限の導入  操作用API 2012-07-26 NTT Software Innovation Center 7
  • 8. FAQ  AppごとにVM建てればいいのでは? – パフォーマンス的に難しい  chroot jailではダメ? – マウントポイントしか隠ぺいできない  LXCではダメ? – 初期のWardenはLXCを利用していたが… – Linuxでしか動かない – 機能過多 2012-07-26 NTT Software Innovation Center 8
  • 9. Wardenの動作原理 2012-07-26 NTT Software Innovation Center 9
  • 10. 基本方針  コンテナ – 環境の隔離:Namespaces – リソース制限:Cgroups – /sbin/init起動によるシステムコンテナ  操作用API – Wardenサーバがコンテナを管理 – Warden Protocl経由でサーバにアクセス 2012-07-26 NTT Software Innovation Center 10
  • 11. Cgroups  Linux Kernel 2.6.24から  プロセスをグループに分離 – メモリ使用量、CPU・IOの優先度 書いてあるよ! 2012-07-26 NTT Software Innovation Center 11
  • 12. Namepaces  プロセスの名前空間を分離 – PID、Network, Mount、UTS、IPC、User – unshare(1), clone(2)  マウント状況も分離される – 高級版chroot jail  ネットワークも分離される – 仮想NIC(veth)を使用 2012-07-26 NTT Software Innovation Center 12
  • 13. Wardenの概要 Warden クライアント ②コンテナの起動 EMサーバ シェル (Ruby) スクリプト群 Linux クラス clone.c DEA コンテナ ①コンテナの生成 ジョブ sshd ③ジョブの起動 OS 2012-07-26 NTT Software Innovation Center 13
  • 14. サーバ本体 Warden クライアント ②コンテナの起動 EMサーバ シェル (Ruby) スクリプト群 Linux クラス clone.c DEA コンテナ ①コンテナの生成 ジョブ sshd ③ジョブの起動 OS 2012-07-26 NTT Software Innovation Center 14
  • 15. サーバ本体  /lib/warden  命令を受け取ってコンテナの操作を行う – EMがListen – OS・環境ごとのクラスに委譲  Linuxクラス – シェルスクリプトに処理を委託 2012-07-26 NTT Software Innovation Center 15
  • 16. サーバ本体  /lib/warden/container/linux.rb def do_create sh "#{env_command} #{root_path}/create.sh #{handle}", :timeout => nil debug "container created" write_bind_mount_commands コンテナの生成 debug "wrote bind mount commands" sh "#{container_path}/start.sh", :timeout => nil debug "container started" end コンテナの起動 (コンテナは常時起動) 2012-07-26 NTT Software Innovation Center 16
  • 17. シェルスクリプト部分 Warden クライアント ②コンテナの起動 EMサーバ シェル (Ruby) スクリプト群 Linux クラス clone.c DEA コンテナ ①コンテナの生成 ジョブ sshd ③ジョブの起動 OS 2012-07-26 NTT Software Innovation Center 17
  • 18. シェルスクリプト部分  /root/linux  コンテナの生成・削除  Skeleton – ファイルがコンテナごとにコピーされる 2012-07-26 NTT Software Innovation Center 18
  • 19. シェルスクリプト部分(コンテナ生成)  /root/linux/create.sh # インスタンスごとのディレクトリ target="instances/${1}" mkdir -p instances … cp -r skeleton "${target}“ unshare -m "${target}"/setup.sh – スケルトンをコピー – マウント名前空間をunshareしてsetup.shを実行  /root/linux/skeleton/setup.sh – 設定を/etc内に書きだす – /etc/ssh, /etc/init.d, /etc/hosts, etc. 2012-07-26 NTT Software Innovation Center 19
  • 20. シェルスクリプト部分(コンテナ起動)  /root/linux/skeleton/start.sh env -i unshare -n ../../../../src/clone/clone – network名前空間をunshareしてclone.cを実行 2012-07-26 NTT Software Innovation Center 20
  • 21. シェルスクリプト部分 Warden クライアント ②コンテナの起動 EMサーバ シェル (Ruby) スクリプト群 Linux クラス clone.c DEA コンテナ ①コンテナの生成 ジョブ sshd ③ジョブの起動 OS 2012-07-26 NTT Software Innovation Center 21
  • 22. clone.c  /src/clone/clone.c  システムコールによるコンテナ生成 – clone(2) 2012-07-26 NTT Software Innovation Center 22
  • 23. clone.c  /src/clone/clone.c rv = unshare(CLONE_NEWNS); … # clone前のフック # コンテナ用のファイルシステムをマウントする rv = run("./hook-parent-before-clone.sh"); … # コンテナ内のinitプロセスを起動する rv = parent_clone_child(h); … # clone後のフック rv = run("./hook-parent-after-clone.sh"); 2012-07-26 NTT Software Innovation Center 23
  • 24. clone.c  /src/clone/clone.c rv = unshare(CLONE_NEWNS); … # clone前のフック # コンテナ用のファイルシステムをマウントする rv = run("./hook-parent-before-clone.sh"); … # コンテナ内のinitプロセスを起動する rv = parent_clone_child(h); … # clone後のフック rv = run("./hook-parent-after-clone.sh"); 2012-07-26 NTT Software Innovation Center 24
  • 25. skeletonに寄り道  /root/linux/skeleton/hook-parent-before-clone.sh setup_fs  /root/linux/skeleton/common.sh:setup_fs() if [ ! -f fs ]; then dd if=/dev/null of=fs bs=1M seek=${disk_size_mb} … fi mkdir -p rootfs ${target} mount -n -o loop fs rootfs … mount -n -t overlayfs -o rw,upperdir=rootfs,lowerdir=../../base/rootfs none ${target} – コンテナごとのファイルをループバックマウント – OSが入っているベースにオーバーレイ • ベースは書き込み禁止状態で共有 2012-07-26 NTT Software Innovation Center 25
  • 26. clone.c  /src/clone/clone.c rv = unshare(CLONE_NEWNS); … # clone前のフック # コンテナ用のファイルシステムをマウントする rv = run("./hook-parent-before-clone.sh"); … # コンテナ内のinitプロセスを起動する rv = parent_clone_child(h); … # clone後のフック rv = run("./hook-parent-after-clone.sh"); 2012-07-26 NTT Software Innovation Center 26
  • 27. clone.c int parent_clone_child(clone_helper_t *h) { … # 名前空間分離の設定 /* Setup namespaces */ flags |= CLONE_NEWIPC; flags |= CLONE_NEWNET; flags |= CLONE_NEWNS; flags |= CLONE_NEWPID; flags |= CLONE_NEWUTS; # start()から子プロセス起動 pid = clone(start, stack, flags, h); … } 2012-07-26 NTT Software Innovation Center 27
  • 28. clone.c int start(void *data) { … rv = run(hook_before_pivot … rv = run(hook_after_pivot); … # /sbin/initをexecvpして起動完了 char * const argv[] = { "/sbin/init", "--debug", NULL }; execvp(argv[0], argv); … } 2012-07-26 NTT Software Innovation Center 28
  • 29. clone.c  /src/clone/clone.c rv = unshare(CLONE_NEWNS); … # clone前のフック # コンテナ用のファイルシステムをマウントする rv = run("./hook-parent-before-clone.sh"); … # コンテナ内のinitプロセスを起動する rv = parent_clone_child(h); … # clone後のフック rv = run("./hook-parent-after-clone.sh"); 2012-07-26 NTT Software Innovation Center 29
  • 30. skeletonに寄り道  /root/linux/skeleton/hook-parent-after-clone.sh # 新しいcgroupを作って mkdir -p /dev/cgroup/instance-${id} pushd /dev/cgroup/instance-${id} > /dev/null # 上限などを決め cat ../cpuset.cpus > cpuset.cpus cat ../cpuset.mems > cpuset.mems # 子プロセスに値をコピーするコールバックを呼ぶ設定 echo 1 > cgroup.clone_children # cgroupsに現在のプロセスを登録 echo ${PID} > tasks 2012-07-26 NTT Software Innovation Center 30
  • 31. ジョブの起動 Warden クライアント ②コンテナの起動 EMサーバ シェル (Ruby) スクリプト群 Linux クラス clone.c DEA コンテナ ①コンテナの生成 ジョブ sshd ③ジョブの起動 OS 2012-07-26 NTT Software Innovation Center 31
  • 32. ファイルの送受信とコマンドの実行  DEA用の特別な仕掛けは見当たらない – ファイルの送受信(rsync) – コマンドの実行(ssh) • ジョブとして入出力を管理 2012-07-26 NTT Software Innovation Center 32
  • 33. ジョブの起動  /lib/warden/container/linux.rb def create_job(request) user = request.privileged ? "root" : "vcap" # -T: Never request a TTY # -F: Use configuration from <container_path>/ssh/ssh_config args = ["-T", "-F", File.join(container_path, "ssh", "ssh_config"), "#{user}@container"] args << { :input => request.script } child = DeferredChild.new("ssh", *args) … 2012-07-26 NTT Software Innovation Center 33
  • 34. ファイルの送受信  /lib/warden/container/linux.rb def do_copy_in(request, response) src_path = request.src_path dst_path = request.dst_path perform_rsync(src_path, "vcap@container:#{dst_path}") nil end def do_copy_out(request, response) src_path = request.src_path dst_path = request.dst_path perform_rsync("vcap@container:#{src_path}", dst_path) if request.owner sh "chown", "-R", request.owner, dst_path end nil end private def perform_rsync(src_path, dst_path) ssh_config_path = File.join(container_path, "ssh", "ssh_config") # Build arguments args = ["rsync"] args += ["-e", "ssh -T -F #{ssh_config_path}"] args += ["-r"] # Recursive copy args += ["-p"] # Preserve permissions args += ["--links"] # Preserve symlinks args += [src_path, dst_path] # Add option hash args << { :timeout => nil } sh *args end 2012-07-26 NTT Software Innovation Center 34
  • 35. まとめ  WardenはApp隔離用のコンテナ  LinuxではCgroupsとNamespacesを使用  サーバがコンテナの操作を行う  ファイルを転送してコマンドを実行する 2012-07-26 NTT Software Innovation Center 35