SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
すごく分かる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

Mais conteúdo relacionado

Mais procurados

Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門Hiroyuki Wada
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Kongの概要と導入事例
Kongの概要と導入事例Kongの概要と導入事例
Kongの概要と導入事例briscola-tokyo
 
UEFIベアメタルプログラミング
UEFIベアメタルプログラミングUEFIベアメタルプログラミング
UEFIベアメタルプログラミングYuma Ohgami
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07Toshiaki Maki
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...NTT DATA Technology & Innovation
 
はじめてのCF buildpack
はじめてのCF buildpackはじめてのCF buildpack
はじめてのCF buildpackKazuto Kusama
 
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~Hitachi, Ltd. OSS Solution Center.
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門Takashi Takizawa
 
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】WESEEKWESEEK
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみたzaki4649
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線Motonori Shindo
 
クラウド上のデータ活用デザインパターン
クラウド上のデータ活用デザインパターンクラウド上のデータ活用デザインパターン
クラウド上のデータ活用デザインパターンAmazon Web Services Japan
 
Python で OAuth2 をつかってみよう!
Python で OAuth2 をつかってみよう!Python で OAuth2 をつかってみよう!
Python で OAuth2 をつかってみよう!Project Samurai
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 

Mais procurados (20)

KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
Keycloakのステップアップ認証について
Keycloakのステップアップ認証についてKeycloakのステップアップ認証について
Keycloakのステップアップ認証について
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
Kongの概要と導入事例
Kongの概要と導入事例Kongの概要と導入事例
Kongの概要と導入事例
 
UEFIベアメタルプログラミング
UEFIベアメタルプログラミングUEFIベアメタルプログラミング
UEFIベアメタルプログラミング
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 
はじめてのCF buildpack
はじめてのCF buildpackはじめてのCF buildpack
はじめてのCF buildpack
 
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門
 
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
 
HCL AppScan 10 のご紹介
HCL AppScan 10 のご紹介HCL AppScan 10 のご紹介
HCL AppScan 10 のご紹介
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみた
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
クラウド上のデータ活用デザインパターン
クラウド上のデータ活用デザインパターンクラウド上のデータ活用デザインパターン
クラウド上のデータ活用デザインパターン
 
Python で OAuth2 をつかってみよう!
Python で OAuth2 をつかってみよう!Python で OAuth2 をつかってみよう!
Python で OAuth2 をつかってみよう!
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 

Destaque

Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラーCloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラーnota-ja
 
Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎Hiroaki_UKAJI
 
Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門
Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門
Cloud FoundryでDockerも.NETも。新しいDiegoの仕組み入門Kazuto Kusama
 
DevStackで始めるCloud FoundryとBOSH
DevStackで始めるCloud FoundryとBOSHDevStackで始めるCloud FoundryとBOSH
DevStackで始めるCloud FoundryとBOSHi_yudai
 
BOSHでお手軽CFデプロイon AWS
BOSHでお手軽CFデプロイon AWSBOSHでお手軽CFデプロイon AWS
BOSHでお手軽CFデプロイon AWSi_yudai
 
Autoscaling Cloud Foundry with BOSH
Autoscaling Cloud Foundry with BOSHAutoscaling Cloud Foundry with BOSH
Autoscaling Cloud Foundry with BOSHi_yudai
 
たまにはOpenShiftも触ってみよう
たまにはOpenShiftも触ってみようたまにはOpenShiftも触ってみよう
たまにはOpenShiftも触ってみようKazuto Kusama
 
Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較Kazuto Kusama
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 
Cloud Foundryで学ぶ、PaaSのしくみ講座
Cloud Foundryで学ぶ、PaaSのしくみ講座Cloud Foundryで学ぶ、PaaSのしくみ講座
Cloud Foundryで学ぶ、PaaSのしくみ講座Kazuto Kusama
 
Greenpaper creative industries
Greenpaper creative industriesGreenpaper creative industries
Greenpaper creative industriespesec
 
D2 career development v1
D2 career development v1D2 career development v1
D2 career development v1DS-Egypt
 
Бенчмаркинг День 2013 - программа
Бенчмаркинг День 2013 - программаБенчмаркинг День 2013 - программа
Бенчмаркинг День 2013 - программаYulya Uzhakina
 
Leadership Coaching MasterNous
Leadership Coaching MasterNousLeadership Coaching MasterNous
Leadership Coaching MasterNousSARGIA Partners
 
D2 interview skills v1
D2 interview skills v1D2 interview skills v1
D2 interview skills v1DS-Egypt
 
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)Đoàn Nguyễn Xuân
 
VerXCombo: An interactive data visualization of popular library version combi...
VerXCombo: An interactive data visualization of popular library version combi...VerXCombo: An interactive data visualization of popular library version combi...
VerXCombo: An interactive data visualization of popular library version combi...Au Gai
 
Embedding power point (slideshare)
Embedding power point (slideshare)Embedding power point (slideshare)
Embedding power point (slideshare)DLSbgordon
 

Destaque (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も触ってみよう
 
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)
 
VerXCombo: An interactive data visualization of popular library version combi...
VerXCombo: An interactive data visualization of popular library version combi...VerXCombo: An interactive data visualization of popular library version combi...
VerXCombo: An interactive data visualization of popular library version combi...
 
Embedding power point (slideshare)
Embedding power point (slideshare)Embedding power point (slideshare)
Embedding power point (slideshare)
 

Semelhante a すごく分かるwarden

CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudsamemoon
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Studyirix_jp
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例maebashi
 
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?Kuniyasu Suzaki
 
「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~
「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~
「hbstudy#23 OpenStack祭!!」資料 ~OpenStackプロジェクトの全体像~Masanori Itoh
 
MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209Mitz Amano
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版i_yudai
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1Etsuji Nakai
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ UndertowについてYoshimasa Tanabe
 
OSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUGOSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUGHideki Saito
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineEtsuji Nakai
 
CloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/SwiftCloudStack Ecosystem Day - OpenStack/Swift
CloudStack Ecosystem Day - OpenStack/Swiftirix_jp
 
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 SpringGo Chiba
 
OSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; OverviewOSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; Overviewirix_jp
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)l_b__
 
#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
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Etsuji Nakai
 

Semelhante 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 技術勉強会
 

Mais de i_yudai

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

Mais 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