ウ 基盤構築演習
Cloud Infrastructure Design and Deployment
4. ー 仮想化技術とコン 概要
2017.v1
Table of contents
ー ー仮想化
o 仮想化 ー ー 分類
o Xen/KVM ーキ
o Linux 仮想ネ ワー 機能
o cgroups ー 制御
o KVM 他 機能
ン 技術
o ン 概要
o LXC Docker 比較
o ン ー ー ン
ー ー仮想化
仮想化 ー ー 分類
仮想化 ー ー 分類
基本的 物理 ン 同等 仮想 ン 複数作 出 技術
物理 ン
OS
物理 ン
非仮想化環境
ー
物理 ン
ー ー
OS
物理 ン
Linux KVM
Xen
ー 仮想化
物理 ン ー 内蔵
OS 仮想ン
OS 仮想ン
OS 仮想ン
OS 仮想ン
物理 ン上 ー 仮想化 導入
OS 仮想ン
OS 仮想ン
OS 仮想ン
OS 仮想ン
仮想化
OS ー 機能 追加
OS 仮想ン
OS 仮想ン
OS 仮想ン
ーネ ー ー
x86 ー 仮想化技術 歴史
仮想化支援機能 持 CPU 仮想 ン OS 実行 特権 ー
提供 セン 命令 制御 HW 行い
初期 ー 仮想化支援機能 前提 い 技術 必要
o VMware Dynamic Binary Translation 採用 セン 命令 上 動 的 書 換え 技術
o Xen 準仮想化 (Static Binary Translation) 提唱 セン 命令 事前
ー ー 書 換え 準仮想化 ーネ 使用
現在 ー ン ち CPU 仮想化支援機能 利用可能
1995 2000 2005 2010
(Virtual PC for Macintosh)
VMware ESX Xen KVM
Intel-VT
2007
2005
2003
2000
1996
ー 仮想化 準仮想化技術 提唱 仮想化機能 統合 Linux ーネ
ン ー ーPC
初 仮想化(?) HW 仮想化機能
CPU 特権 ー と ン ョン
x86 CPU ン 0〜 ン 3 4 種類 特権 ー 提
供
o Linux Windows OS ン 0 ン 3 2種類 ー
使用
o ン 0 CPU 命令 実行 ー Linux ーネ
ー 動作
o ン 3 物理 ー 操作 い ー ー セ
ー ー 動作 ー セ ー
セ 際 ー ーネ ー 呼 出
ン 0: ーネ ー
ン 3: ー セ
ー
物理 ー セ
ン ン
Intel VT-x よる特権 ー 拡張
仮想化支援機能 Intel VT-x 持 Intel CPU VMX root ー
VMX non-root ー 区別 追加 ン
0 〜 ン 3 あ
o 仮想化 ー 使用 い環境 VMX root ー 動作
Xen 場合 ー VMX root / ン 0 動作 各
OS VMX non-root / ン 0 ン 3 動作
o VMX non-root / ン 0 物理 ー セ 発生 VM
Exit 発行 CPU 強制的 VMX root / ン 0 ー 処
理 移行
VMX root / ン 0 VMX root / ン 3
物理 ー /仮想 ー セ
VMX non-root / ン 0 VMX non-root / ン 3
VM Exit VM Entry
OS
ー
ー ー仮想化
Xen/KVM ーキ チ
Xen ーキ チ 概要
Xen ー 介 複数 仮想 ン 作成
独立 OS 稼動
o 特 ン0 呼 特権 ン OS 上
ー 制御 ー 物理 稼動
o ー 制御 ー 一般 ン ンU
作成 OS 起動 行い
o ンU 仮想 Xen ー 介
ン0 経由 物理 セ
Xen ー
物理 ン
ン0 / OS ンU / OS
仮想
仮想化管理 ー
ンU / OS 仮想
仮想化管理 ー 物理
ー 制御 ー
KVM おける特権 ー 利用方法
KVM 仮想 ン
Linux 上 1 セ 実行
o OS VMX non-root ー
動作 セ
セン 命令 発行
KVM ー 処理 移行
o KVM ー 指示
VMXroot ー 動作 qemu
ー 物理
セ
qemu-kvm セ
物理CPU
仮想 ー
ーネ
KVM ー
VMX root ー
VMX non-root ー
Linux
ーネ
ー
セ ー
セ
qemu
ー
一般
セ
一般
セ
EPT よる セ 高速化
非仮想化環境 ー セ 認識 仮想 物理 変換
CPU 搭載 MMU(Memory Management Unit) ー 処理
一方 仮想 ン環境 2 段階 変換 必要
o ー セ 仮想 ⇒ OS 仮想 物理 がにPなひき ⇒ 物理
(MPFN)
o EPT (Extended Page Tables) 利用 2段階 変換 ー 処 理
Xeon 5500番台(Nehalem)以降 CPU EPT 対応 い EPT未対応 CPU ー ー 処理 必要
PFN
MMU 変換
搭載物理
qemu-kvm セ
搭載物理
PFN GPFN
非仮想化環境 Xen/KVM 仮想化環境
論理 セ A空間 論理 セ B空間 EPT対応
MMU 変換
論理 セ A空間
ウペー ー 利用
EPT未対応 CPU Xen/KVM 使用 場合 ー 管理
ー ー 利用 変換 行い
o OS セ ー ー 論理 GPFN 対応表 更新
検知 ー 論理 PFN 直接変換
ー ー 更新
o ー MMU セ A ー ー く 対応
ー ー 参照 変換 行う う 操作
ー 余分 処理 発生 EPT対応CPU 比
セ ー 大 く
論理 GPFN
XXX YYY
・・・ ・・・
OS上 セ A ー ー
論理 PFN
XXX ZZZ
・・・ ・・・
ー 管理 ー ー
搭載物理
PFN GPFN
XXX YYY
ZZZ
EPT 未対応CPU Xen/KVM 仮想化環境
論理 セ A空間
MMU ー
ー 参照 変換
virtio よるI/O 高速化
virtio KVM 仮想化環境 最適化 /NIC ー
ン形式
o QEMU 用意 I/O 領域 virtio 直接 セ 仮想化
ー 削減
o Xen け 準仮想化 同等 仕組
Linux Linux
QEMU セ
ン
物理I/O
QEMU セ
物理I/O
virtio 使用 場合
一般 使用 場合
入出力 ー
入出力 ー
入出力 ー 入出力 ー
ン
OS空間 OS空間
I/O処理 QEMU経由 IO 実施
IO IO
virtio 共有 上
使用 OS QEMU間 ー
ー 発生 い
仮想化API libvirt
libvirt 複数 ー 統一的 操作 API
o C言語 Python 使用 標準 提供 現在 Xen/KVM/LXC Linux ン 対応 い
o OS 起動・停止 操作以外 仮想ネ ワー 構成 ー 管理 API 提供
o 図 Python用 使用 KVM 仮想 ン 起動/停止 例
RHEL6 次 う ー libvirt 利用 い
o virsh ン ン管理 ー o virt-manager GUI管理 ー
o virt-install ン ン OS ン ー ー
OpenStack 基盤 内部的 libvirt経由 仮想化 ー 操作
場合 あ
#!/usr/bin/python import libvirt, time
Conn = libvirt.open( "qemu:///system" ) for name in Conn.listDefinedDomains():
vm = Conn.lookupByName( name ) print "Starting " + vm.name() vm.create()
time.sleep( 1 )
仮想 ン 起動
#!/usr/bin/python import libvirt, time
Conn = libvirt.open( "qemu:///system" ) for id in Conn.listDomainsID():
vm = Conn.lookupByID( id ) print "Stopping " + vm.name() vm.shutdown()
time.sleep( 1 )
仮想 ン 停止
virt-manager よる仮想化環境 管理
virt-manager RHEL 標準 提供 仮想化環境 管理 ー
次 う 操作 GUI 行う
o 仮想 ン 構成 OS ン ー
o 仮想 ン ン ー 表示 起動 停止
o 仮想ネ ワー 構成 仮想 用 ー 管理
ネ ワー 経由 複数 仮想化 管理
マ ー ョン 仕組み
ー ン 稼動中
OS 稼動状態 保 異 物理
ー 上 移動 技術
o ー 共有 装置 利用
ー 間 共有
o 稼動中 OS ー ネ ワー
経由 転送 ー 転送後
仮想CPU 状態 転送 ー
ン 完了
o 外部 ン 見 厳密
10~100msec 程度 停止 発生
TCP/IP 再送機能 通常 ネ ワー
切断 問題 発生 せ
共有 使用 い ー ・
ー ン 可能
o 稼働中 OS い ー 加
え 仮想 ー 内容 ネ ワー
経由 転送
ー ン
ー ・ ー ン
OS ー
ネ ワー 転送
OS ー
ネ ワー 転送
OS ー
ネ ワー 転送
ー ー
ー
ーOS 共有
ー ー仮想化
Linux 仮想ネッ ワー 機能
KVM 仮想ネッ ワー
KVM Linux TAP 経由 仮想 ン 仮想NIC 交換
TAP 仮想 接続 仮想 ン間 ー ネ ワー 構
成
o TAP ー セ 仮想的 ネ ワー 通信 行うLinux 機能
o 仮想 Linux上 仮想的 ネ ワー 構成 機能
外部ネ ワー 接続 方法 2種類あ
o Linux 物理NIC 仮想 接続
o iptables NAT/ ー 仮想 外部ネ ワー 転送
Linux ン0 読 替え Xen 同 仕組
Linux
仮想 仮想NIC
vnet0 eth0
仮想 ン
TAP
仮想NIC
vnet1 eth0
仮想 ン
TAP
virbr0 / br0
eth0 接続
NAT/ ー
外部ネ ワー
仮想ネッ ワー 構成 ターン
複数 仮想 使用 複数 仮想ネ ワー 構成 仮想
ネ ワー 構成 ーン 次 う あ
o 物理NIC 接続 外部ネ ワー 同一 ネ 接続
o NAT/ ー 利用 外部ネ ワー 独立 ネ 接続
ー 利用場合 外部ネ ワー 仮想ネ ワー 向け 接続 せ
外部ネ ワー 相互通信 場合 外部 IP 内部 IP DNAT/SNAT 1対1 付け 必要 あ
o 外部ネ ワー 接続 い ン内部 ー ネ ワー 構成
仮想 IP 設定 Linux(Xen 場合 ン0 仮想 ン 通信
可能
vnet0 eth0
仮想 ン
vnet1 eth0
仮想 ン
仮想 vnet0
eth0
仮想 ン
仮想 eth0
仮想 ン 外部 通信 い
vnet0 eth0
仮想 ン
仮想 eth0
転送
Linux Linux Linux
仮想 ン 外部
ネ ワー 同
ネ 属
仮想 ン 外部
ネ ワー 異
ネ 属
仮想 IP 設定
Linux 仮想 ン 通信可能
dnsmasq よるDHCP/DNS機能 提供
物理NIC 接続 い 仮想ネ ワー libvirt API virsh/virt-
manager 構成
o 物理NIC 接続 行う場合 手動 設定 構成 必要 あ
o 仮想 任意 名称 設定 通常 br0 使用
libvirt 構成 仮想ネ ワー 簡易的 DHCP/DNS機能 提供
o 機能 Linux dnsmasq ー ン 提供 不要 場合 無効化
DNS ー Linux /etc /hosts 内容 /etc /resolv.conf 指定 外部DNS 参照
o libvirt 構成 仮想 名称 virbrX
vnet0 eth0
仮想 ン
vnet1 eth0
仮想 ン
eth0
転送
仮想 (virbr0)
Linux
DHCP ー DNS ー
VLAN 組み合わせ
Linux VLAN 構成 仮想 ン 透過的 VLAN 接続
o VLAN 処理 Linux上 行わ OS VLAN 意識 設定 必要あ
せ
仮想NIC
仮想 ン
仮想NIC
仮想 ン
Linux
仮想 TAP
eth0
VLAN101 VLAN102 VLAN vnet0
TAP
br101 br102
eth0.101 eth0.102
eth0 eth0
vnet1
VLAN 無
付
Linux Bridge とOpen vSwitch 比較 (1)
OpenStack ン 選択 仮想ネ ワー 実
装方式 入 替え
LinuxBridge ン 仮想 使用 Open
vSwitch ン Open vSwitch 使用 下図 仮想
作成 際 実装 違い 示
vm01 vm02 vm03 vm04
外部ネ ワー
仮想 ー A
仮想
projectA
仮想 ー B
仮想
projectB
Linux Bridge とOpen vSwitch 比較 (2)
下図 LinuxBridge ン 構成例
o 仮想 仮想 VLAN 割 当
brqxxxx
eth1.101 eth1.102
brqyyy
eth1
vm01
eth0
IPVLAN101
VLAN102
vm04
eth0
IPvm02
eth0
IPvm03
eth0
IPprojectA projectB
仮想
VLAN 分割
ー ネ ワー 用
L2
Linux Bridge とOpen vSwitch 比較 (3)
下図 LinuxBridge ン 構成例
o 仮想 Open vSwitch 内部 内部VLAN 外部VLAN 割 当
o 内部VLAN ン 自動的 連番 ID ン 外部VLAN 仮
想ネ ワー 定義 際 管理者 指定 ID 使用
br-priv
vm01
eth0
br-int
eth1 IP
phy-br-priv int-br-priv
qvoXXX
vm02
eth0 IP
qvoYYY ー VLAN tag:1
qvoZZZ qvoWWW ー VLAN tag:2
vm04
eth0 IP
VLAN101
VLAN102
Open vSwitch
vm03
eth0 IP
仮想 異
内部VLAN 割 当
内部VLAN 外部VLAN 相互変換
・内部VばAひさ⇔外部VLAN101
・内部VばAひざ⇔外部VLAN102
ー ー仮想化
cgroups よる ソー 制御
Control Groups (cgroups) と
Linux セ 単位 ー 制御機能 持 い
い cgroups 機能 セ ー 単位
適用 ン ー ー
o cgroups 自体 ー 制御機能 提供 わけ あ せ
cgroups ン ー ー 利用 ー 制御機能
呼
説明
cpuset ・ ー 内 セ 使用 CPU 指定
cpu ・ ー 内 セ 使用 CPU時間割合 上限 設定
・複数 ー セ 同一 CPU 実行 場合 優先順位
CPU時間配分 割合 設定
memory ・使用可能 上限 実 実 + ワ 指定
blkio ・物理I/O 優先順位 帯域 制御
devices ・/dev以下 セ 制御
RHEL6.4 利用 主要 機能
cgroups ー 管理
/cgroup ン 特殊 形式 ー 管理
ー構造 ー ー構造 対応
o cgconfig ー 起動 /cgroup 特殊 ン
o ー 対応 mkdir ン 作成 新 い
ー 定義
ー構造 ー 管理 対応 い 場合 上図 subgroupXX 以下
作成 せ
o ー 対応 下 あ 擬似 設定 行い
o tasks PID echo出力 セ 該当 ー 入
以降 セ 作成 子 セ 同 ー 入
o cgroup.procs cat 表示 ー 含 セ PID 表示
o セ ー 設定 際 対応 擬似 数値 echo出力
/cgroup/<サブシステム名>/group01/subgroup01/subsubgroup01
| |
| /subgroup02 /group02
ー 親
ー ー
主要 ータ(1)
cpuset : ー 内 セ 実行 CPU 指定
cpu : CPU 実行時間配分 指定
ー 説明
cpuset.cpu セ 実行 CPU 指定 0-2,7 0,1,2,7 いう意味
cpuseet.cpu_exclusiv e
1 セ ー 指定 CPU 他 ー 指定
い 0
cpuset.mems NUMA ー い セ 利用 位置 指定 ( 値
セ い 新 い ー 作成 最初 ー ー 同 値
セ く
ー 説明
cpu.shares CPU 占有率 2〜262144 数値 指定
複数 ー セ 同一 CPU 使用 場合 値 比例 CPU
使用時間 割 当 値 1024
cpu.cfs_period_us cpu.cfs_quota_us
CPU使用時間割合 上限 設定 cpu.cfs_period_us (μイ)中 cpu.cfs_quota_us (μイ) ー セ CPU 使用
環境 cpu.cfs_quota_us cpu.cfs_period_us 越え 設定可 能 4 環境 cpu.cfs_period_us=250000, cpu.cfs_quota_us=500000
場合 ー 最大2 分 CPU性能 得
主要 ータ(2)
memory : 使用量 上限 指定
blkio : I/O 優先順位 指定
ー 説明
memory.limit_in_bytes 該当 ー 利用可能 物理 上限 単位 指定
memory.memsw.limit_in_bytes 該当 ー 利用可能 物理 + ワ 領域 上限 単位 指定
memory.use_hierarchy 1 セ ー 使用量 ー セ
使用量 加え 0
ー 説明
blkio.weight 全 共通 優先順位 100〜1000 値 指定
値 比例 I/O処理時間 割 当
blkio.weight_device 特定 対 優先順位 Major:Minor 指定値 形式 指定
例 8:0 500 ※ ー ン単位 指定 い
blkio.throttle.read_bps_device blkio.throttle.write_bps_device
特定 対 セ 速度 上限 Bytes/Sec単位 指定 0
指定 制限 解除
例 8:0 1048576 ※ ー ン単位 指定 い
blkio.throttle.read_iops_device blkio.throttle.write_iops_device
特定 対 セ 速度 上限 IOPS単位 指定 0 指定
制限 解除
例 8:0 2048 ※ ー ン単位 指定 い
仮想マ ン 対するcgroups 操作
libvirt API virt-manager/virsh ン 仮想
ン 起動 該当 仮想 ン 対 cgroups 設
定 行う 自動的 作成
o 具体的 /cgroup/< >/libvirt/qemu/<VM 名
>
o 内 ー 値 設定 該当
仮想 ン 対 設定 可能
# ls -lF /cgroup/cpu/libvirt/qemu 合計 0
drwxr-xr-x 5 root root 0 9月 25 15:57 2015 VM1-1/ drwxr-xr-x 5 root root 0 9月 25 15:57 2015 VM2-1/
--w--w--w- 1 root root 0 9月 24 15:55 2015 cgroup.event_control -rw-r--r-- 1 root root 0 9月 24 15:55 2015 cgroup.procs
-rw-r--r-- 1 root root 0 9月 24 15:55 2015 cpu.cfs_period_us -rw-r--r-- 1 root root 0 9月 24 15:55 2015 cpu.cfs_quota_us -rw-r--r-- 1 root root 0 9月 24 15:55 2015 cpu.rt_period_us -rw-r--r-- 1 root root 0 9月 24 15:55 2015 cpu.rt_runtime_us -rw-r--r-- 1 root root 0 9月 24 15:55 2015 cpu.shares
-r--r--r-- 1 root root 0 9月 24 15:55 2015 cpu.stat
-rw-r--r-- 1 root root 0 9月 24 15:55 2015 notify_on_release -rw-r--r-- 1 root root 0 9月 24 15:55 2015 tasks
cgroups よる ソー 制御 例
2個 仮想 ン I/O 帯域 10MB/Sec 50MB/Sec 制限 各仮想
ン I/O負荷 け 例
2個 仮想 ン CPU使用時間 0.5 2.0 制限 各仮想 ン CPU
負荷 け 例
# echo "8:0 50000000" > /cgroup/blkio/libvirt/qemu/RHEL61vm01/blkio.throttle.write_bps_device
# echo "8:0 10000000" > /cgroup/blkio/libvirt/qemu/RHEL61vm02/blkio.throttle.write_bps_device
# virt-top -3 -d 1
virt-top 16:18:06 - x86_64 4/4CPU 3101MHz 7751MB
22 domains, 3 active, 3 running, 0 sleeping, 0 paused, 19 inactive D:0 O:0 X:0 CPU: 2.4% Mem: 4096 MB (ゲストによる 4096 MB)
14 R 0 48M 0 96 RHEL61vm01 vda 15 R 0 10M 0 22 RHEL61vm02 vda ID S RDBY WRBY RDRQ WRRQ DOMAIN DEVICE
# echo "500000" > /cgroup/cpu/libvirt/qemu/RHEL61vm01/cpu.cfs_period_us
# echo "250000" > /cgroup/cpu/libvirt/qemu/RHEL61vm01/cpu.cfs_quota_us
# echo "500000" > /cgroup/cpu/libvirt/qemu/RHEL61vm02/cpu.cfs_period_us
# echo "1000000" > /cgroup/cpu/libvirt/qemu/RHEL61vm02/cpu.cfs_quota_us
# top
top - 16:30:36 up 19 days, 4:35, 5 users, load average: 3.45, 3.57, 5.48 Tasks: 297 total, 6 running, 291 sleeping, 0 stopped, 0 zombie
Cpu(s): 65.5%us, 1.9%sy, 0.0%ni, 32.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 7937076k total, 6186888k used, 1750188k free, 381924k buffers Swap: 2097144k total, 3260k used, 2093884k free, 2410048k cached
780 qemu 20 0 1377m 1.0g 3696 R 192.7 13.2 9:51.11 qemu-kvm 741 qemu 20 0 1376m 1.0g 3692 R 50.8 13.4 10:36.94 qemu-kvm PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
libcgroup よるcgroups 管理
libcgroup ー 提供 ン 群 cgroups 管理
o 次 cg* ン 管理 例
o cgred ー 利用 セ 起動 ー / ー 自動
的 ー 割 当 /etc/cgroups.conf 設定 記載
# cgcreate -g cpuset:group00
# cgset -r cpuset.cpus=0 group00
# cgset -r cpuset.mems=0 group00
# cgcreate -g cpuset:group01
# cgset -r cpuset.cpus=1 group01
# cgset -r cpuset.mems=0 group01
# cgget -r cpuset.cpus -r cpuset.mems group00 group01 group00:
cpuset.cpus: 0 cpuset.mems: 0 group01: cpuset.cpus: 1 cpuset.mems: 0
# cgexec -g cpuset:group00 ./loop.sh & [1] 2930
# cgclassify -g cpuset:group01 2930
cpuset ー group00 作成
ー 設定 cpuset.mems 必須
cpuset ー group01 作成
ー 設定 cpuset.mems 必須 設定値 確認
ー 指定 ン 実行
実行中 セ ー 変更
ー ー仮想化
KVM そ 他 機能
仮想CPU 選択
物理CPU 持 命令セ
古い世代 互換CPU OS 見せ 機能
o 物理CPU 持 い い 見え う
あ せ
o 設定 少 古い世代 CPU 相当
Copy host CPU configuration 押 物理
CPU 同 選択
o 暗号化や画像処理 CPU固有 機能 利用
ー ン 物理CPU 同 方
ー ン 向上 場合 あ
物理CPU 第2世代Core i5
# cat /proc/cpuinfo | grep flags | head -1
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc
aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 x2apic popcnt aes xsave avx lahf_lm ida arat epb xsaveopt pln pts tpr_shadow vnmi flexpriority ept vpid
# cat /proc/cpuinfo | grep flags | head -1
flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm rep_good unfair_spinlock pni cx16 hypervisor lahf_lm
OS 設定
sVirt よるセキュ 保護
RHEL6 SELinux targeted ー 適用 sVirt 仮想 ン
間 セ 保護 行わ
o RHEL6 targeted ー 適用 特別 設定 不要
QEMU/KVM 実装 未知 セキ 脆弱性 あ 場合 あ OS 他
OS セ や他 OS セ 操作 行わ 可能性 あ
sVirt 仮想 ン セ 異 権限(MCS
設定 う 問題 防止
仮想 仮想
QEMU/KVM QEMU/KVM
OS OS
上 同 ー 権限
SELinux 攻撃 予防
マ ー ョン 必要 構成
ー ン 行う場合 共有 装置 使用
o NFS 共有 ン 方法 簡単 I/O 性能 必要 場合 FC
ー ネ 接続やiSCSI接続 共有 装置 使用
o 共有 装置上 仮想 ー 配置 場合 GFS2
共有 必要
o 共有LUN上 LVM論理 ー 使用 場合 CLVM LVM 必
要
ー ン時 ネ ワー 転送 ー 通信 影響 与え
い ー ネ ワー 別 ー ン用ネ
ワー 用意 勧
ー ン 同一 物理CPU 使用
o 異 世代 物理CPU 使用 場合 仮想CPU 機能 一致 う
仮想CPU 調整
o Intel CPU AMD CPU 間 ー ン 失敗 可能性 あ
マ ー ョン 構成例
eth2
eth1
eth0
iSCSI ー
br0
仮想 ン
仮想 ン
eth2
eth1
eth0
br0
仮想 ン
仮想 ン
Linux Linux
ー 用ネ ワー
ー ン用
/ 管理用ネ ワー
ネ ー 用 ワー
コン 技術
Linux コン 概要
OS 内部 物理 ー 管理 ーネ 空間 ー セ
ー ン 実行 ー 空間 分 ン 型
仮想化 ーネ 機能 複数 ー 空間 作 出
ー セ 見え ー 分割
o セ ネー OS ー ネ ワー
ン ー
⇒ ン 異 内容 見え
o CPU /dev/*
⇒ 物理 ン全体 情報 見え cgroups ン 利用範囲 制限
ーセ
・・・
物理 ン 物理 ン
OS
ン 型仮想化
非仮想化環境
ーセ ーセ ー 空間
ーネ 空間
ーセ ーセ
ー 空間
ーセ ーセ
ー 空間
・・・
ーネ 空間
Namespace よる ソー 分離
ン 様々 ー 分離 ネー ー
組合せ 実現 い
o 分離 → Mount namespace
o ネー 分離 → UTS namespace
o IPC 分離 → IPC namespace
o UID/GID 分離 → User namespace
o セ ー 分離 → PID namespace
o ネ ワー 分離 → Network namespace
o ー 配分 分離 → Control groups
o 参考資料
Namespaces in operation, part 1: namespaces overview
http://lwn.net/Articles/531114/
Using Kubernetes on Google Container Engine
https://www.slideshare.net/enakai/using-kubernetes-on-google-container-engine
o 技術 一定 ー 定 組合せ利用 う 技術 ン
呼 い
o 単独 ン いう技術 あ わけ あ せ
コン 関連する技術 歴史
1979年 chroot(2) ー Version 7 Unix 導入
1983年 chroot(2) ー 4.2BSD 導入
2000年 FreeBSD jail FreeBSD 4.0 導入
o セ 空間 分離
2005年 Solaris Containers 登場
o セ 分離 資源配分 ン ー 可能 ン Solaris用語 ーン 管理
備え
2006年 Linux Kernel 2.6.19 UTC, IPC namespace
2007年 Linux Kernel 2.6.23 User namespace
2008年 Linux Kernel 2.6.24 Network namespace
2008年 LXC ー
2010年 Docker 1.0 ー
o ン ー 管理 Docker Hub 提供
参考資料
o http://docs.oracle.com/cd/E19253-01/819-0385/zones.intro-1/index.html o https://kernelnewbies.org/LinuxVersions
o http://gihyo.jp/admin/serial/01/linux_containers o http://d.hatena.ne.jp/defiant/20141218/1418860851
Docker 概要
ン 管理 必要
各種機能 備え ン ネ ン
o ー 作成 起動 破棄
o ー 公開
o 永続 ー 管理
o ー 管理 等
Docker Image
言語処理系 言語依存
Operation System
依存 ー RPM/DEB
Docker Hub ー
開発者 ン
V1.0 V1.1
V1.2
コン と ー
docker 操作 docker ン ン run や start け 実
行
参考
o Docker け ン
o http://d.hatena.ne.jp/enakai00/20140628/1403933390
保存 ー
セ
保存 ー
run start
stop
commit
rm
rmi
run
ン 起動時
作成 ン 停止 ー 残 セ い 停止
Dockerfile
build
ー 作成 手順
記載 Dockerfile
ー 作成
ー 複製
保存 ー 登録
Source Image
pull
コン と ネッ ワー 通信
外部ネ ワー 通信 Linux NAT 行わ
o ン 外部 IP ー 行わ
o 外部 ン ン 起動時 ー ワー ン
設定 行い
ン eth0
vethXXX
docker0
eth0
172.17.42.1 Linux
TCP80
TCP8000
ワー ーン
# docker run -p 8000:80 xxxx
ン 起動時 ー ワー ン 設定
外部ネ ワー
ン Linux
ー 8000 接続
Docker 基本操作
Docker 公開 ー Docker hub httpd ー 取得 ー
8888 公開 例
# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 944 [OK]
centos/httpd 12 [OK]
lolhens/httpd Apache httpd 2 Server 2 [OK]
nfqsolutions/httpd Image of Apache HTTPD 2.4 1 [OK]
ー 検索
# docker pull httpd
ー ン ー
# docker run -d --name webserver -p 8080:80 httpd:latest
f2140317ae3567596fada9898b41a93f0cdd52b4475dd642f217012af2021309
ー ワー 設定 ン 起動
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2140317ae35 httpd:latest "httpd-foreground" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp webserver
起動 ン 確認
# echo '<h1>Hello, World!</h1>' > /tmp/index.html
# docker cp /tmp/index.html webserver:/usr/local/apache2/htdocs/index.html
# curl localhost:8080
<h1>Hello, World!</h1>
ン 転送
Docker 基本操作
ン 内 bash 起動 内部 状態 確認 例
# docker exec -it webserver /bin/bash
root@f2140317ae35:/usr/local/apache2# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:03 ? 00:00:00 httpd -DFOREGROUND daemon 6 1 0 01:03 ? 00:00:00 httpd -DFOREGROUND daemon 7 1 0 01:03 ? 00:00:00 httpd -DFOREGROUND daemon 8 1 0 01:03 ? 00:00:00 httpd -DFOREGROUND root 90 0 0 01:27 ? 00:00:00 /bin/bash
root 94 90 0 01:27 ? 00:00:00 ps -ef root@f2140317ae35:/usr/local/apache2# ip a
~省略~
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever root@f2140317ae35:/usr/local/apache2# df -h Filesystem Size Used Avail Use% Mounted on none 60G 4.1G 52G 8% /
tmpfs 1000M 0 1000M 0% /dev
tmpfs 1000M 0 1000M 0% /sys/fs/cgroup /dev/sda2 60G 4.1G 52G 8% /etc/hosts shm 64M 0 64M 0% /dev/shm tmpfs 1000M 0 1000M 0% /sys/firmware
コン ー 入手方法
公開 い 入手
o ー 検索 例 docker.io 検索
# docker search centos
o 検索先 指定 例 ー ー/キーワー 指定
# docker search docker.io/centos
# docker search registry.access.redhat.com/rhel
自分 ー 作成
o 手動 作成
o Dockerfile 作成
# docker search jenkins
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
jenkins Official Jenkins Docker image 2763 [OK]
stephenreed/jenkins-java8-maven-git Automated build that provides a continuous... 56 [OK] killercentury/jenkins-dind Generic Jenkins CI with Docker Engine and ... 25 [OK] aespinosa/jenkins Sets up a container with jenkins installed... 22 [OK] cloudbees/jenkins-enterprise CloudBees Jenkins Enterprise (Rolling rele... 22 [OK] blacklabelops/jenkins Docker Jenkins Swarm-Ready with HTTPS and ... 9 [OK] appcontainers/jenkins Centos/Debian/Ubuntu Based Customizable Je... 8 [OK] killercentury/jenkins-slave-dind Generic Jenkins Slave with Docker Engine a... 8 [OK] tianon/jenkins-slave SSHd, Java, and Docker-in-Docker specifica... 6 [OK]
bitnami/jenkins Bitnami Docker Image for Jenkins 5 [OK]
publicisworldwide/jenkins-slave Jenkins Slave based on Oracle Linux 4 [OK] blacklabelops/jenkins-swarm Jenkins Swarm Slave Dockerized and Paramet... 4 [OK]
Dockerfile 例
ー 作 手順 キ Dockerfile 記述
元 ー 作成 可能
毎回確実 同 手順 ー 作成 人為的
排除
FROM centos:7
RUN yum clean all && yum update -y && \ yum install -y epel-release && \
yum install -y gcc git vim jq openssh-server openssh-clients python-devel && \ yum install -y supervisor && \
yum install -y python-pip
RUN pip install --upgrade pip setuptools && \ pip install jupyter
RUN mkdir -p /jupyter && \
cd /root && jupyter notebook --generate-config && \
echo "c.NotebookApp.notebook_dir = u'/jupyter'" >> /root/.jupyter/jupyter_notebook_config.py
ADD supervisord.d/jupyter.ini /etc/supervisord.d ADD supervisord.d/sshd.ini /etc/supervisord.d EXPOSE 22 8888
CMD supervisord -n