åæ
ãã°ããåã«ããããªãã¹ããªãŒãã³ã°ããããã®ã·ã¹ãã ãèšèšããã³å±éãããšãã課é¡ã«çŽé¢ããŸããã äžçªäžã®è¡ã¯ããããªã¹ããªãŒã ãåæ§ç¯ãããå€ãã®ã¡ãã£ã¢cdnãããã€ããŒïŒyoutubeãlivestreamãustreamãªã©ïŒããã³ç¬èªã®rtmpããã³tså®å
ãã€ã³ãã«ã¹ããªãŒãã³ã°ãããã€ã³ã¹ã¿ã³ã¹ã®äžæ¬éå§/åæ¢ã§ããã åã€ã³ã¹ã¿ã³ã¹ã¯ãéå§ããåã«èšå®ãå¿
èŠã§ãã åã¯ã©ã€ã¢ã³ãã«åºæã®æ
å ±ãå«ãŸããŠããŸããã ãŸããã·ã¹ãã ãå€æ°ã®ãªãŒãžã§ã³ã§åäœããããšãæããã§ããïŒå°ãªããšãAmazonãååšãããã¹ãŠã®ãã€ã³ãã§ãæ倧ã§-ãµãŒããŒãã¬ã³ã¿ã«ã§ããå Žæã§ããã°ã©ãã§ãïŒã ãŸããäž»ãªèŠä»¶ã¯ãæ倧ã§1ã2ç§ä»¥å
ã«ã€ã³ã¹ã¿ã³ã¹ãèµ·åããããšã§ããããã«ããããŠãŒã¶ãŒã«å¯ŸããŠééçã«ãªããŸãã
2015幎ã®åãã«ãDockerãããã«ç¬èªã®ã¯ã©ã¹ã¿ãªã³ã°ã·ã¹ãã ããªãªãŒã¹ãããšãã話ãæ¢ã«ãããŸããã ãããŠã2015幎2æ26æ¥ã«åœŒå¥³ã¯åºãŠããŸããã ããã¯ç§ãã¡ã«ãšã£ãŠç¹å¹è¬ã§ãããSwarmããããžã§ã¯ãã«çæ³çã«é©åããããšãããã«æããã«ãªããŸããã ãã®ãããžã§ã¯ãã¯2015幎5æã«éå§ãããŸããã
11ãæåŸã2çªç®ã®ããè€éãªãããžã§ã¯ããéå§ããŸããããã®ãããžã§ã¯ãã§ã¯ããµãŒãããŒãã£ã¡ãŒã«ãŒã®æ©åšã®éçãšã³ããªãã€ã³ãïŒipïŒããŒãïŒãæŽçããå¿
èŠããããŸããã
èšèšããã»ã¹ãšãã®åŸã®éçºã§ã¯ãéæšæºã®Docker swarmã䜿çšããŸããã ãããŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãåçã«ç®¡çããã³èª¿æŽããæ¹æ³ã®ã¢ã€ãã¢ãçãŸããŸããã ãŸãããã®æ
ã®äžç°ãšããŠGobetweenãããžã§ã¯ããç»å ŽããŸãããããã¯ãå°æ¥ã€ã³ãã©ãæè»ã«ç®¡çããç°¡åã«è€è£œã§ããããã«ããããã®ãã®ã§ãã
ææŠãã
ãã®èšäºã§ã¯ãåæ£ã·ã¹ãã æ§ç¯ã®èãæ¹ãšåºæ¬çãªå®è£
ãå
±æããããšæããŸãã
ã»ãã¥ãªãã£ã®åŽé¢ã¯ç¹ã«çç¥ããŸã-ããã§ã¯ã誰ãã©ã®ããã«/äœãæ§ç¯ããã®ãè¯ããã決å®ããŸãã äžéšã¯ãã¹ã¯ãŒã/蚌ææžãªã©ã§éããããäžéšã¯ãããªãã¯ãããã¯ãŒã¯ãšçŽæ¥äº€å·®ããªããããã¯ãŒã¯ã®ç®¡çéšåãåãåºããŸãïŒvpcå
ã«ååšãããã³ãã«ãä»ããŠæ¥ç¶ãããŸãïŒã
Standalone Swarmã®dockerã¯ã©ã¹ã¿ãŒã®æŠç¥å³ã
åºæ¬çã«ã·ã¹ãã ãèæ
®ããŠãã ãã-å€æ°ã®é åãšããŠã1ã€ã®ã³ã¢ïŒuropavlyayuscheyïŒãšããŠã

ãã®å Žåã1ã€ã®ãã¹ã¿ãŒãšãconsulã¯ã©ã¹ã¿ãŒå
ã§ã¢ããŠã³ã¹ããå€æ°ã®dockerãã¹ããæã€ã·ã¹ãã ãæ€èšããŸãã ãªããã ã¯ããå®éã«ã¯ãManageã¯ããèªäœã§ã¯å€ãè¡šããªãããã倱ãããšãæãŸãªãããŒã¿ã¯å«ãŸããŠããŸããã å®éã«ã¯èšå®ããããŸãããConsulã¯ã©ã¹ã¿ãŒããååŸããdockerããŒãã®ãªã¹ãã®ã¿ã¹ã¯ã¹ã±ãžã¥ãŒã©ã§ãã ããã«ããã®ãããªã€ã³ã¹ã¿ã³ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãããã€ã§ãäœæã§ããŸãããæå³ã¯ãããŸããããã®çç±ã以äžã§èª¬æããŸãã
ãã®ã·ã¹ãã ã®æ倧ã®å©ç¹ã¯ããã¹ãŠãééçã§ç®¡çãããããã¹ã±ãŒã©ãã«ã§ããããšã§ãã ããã§ã¯ãã¯ã©ã¹ã¿ã³ã³ãœãŒã«ãèšå®ããããšããå§ããŸãããã
Consul Clusterã®ã€ã³ã¹ããŒã«ãšæ§æ
åºåã§ã¯ããã®ãããªã¯ã©ã¹ã¿ãŒæ§é ãååŸããŸãã
èªåãŠã£ã¶ãŒãéžæã«ããRAFTã®3ã€ã®ããŒãã
sever1.consul.example.com 10.0.0.11 bootstrap consul server, consul agent sever2.consul.example.com 10.0.0.12 consul server, consul agent sever3.consul.example.com 10.0.0.13 consul server, consul agent
ãŸãããµãŒããŒïŒNïŒ.consul.example.comã®Consulãåé€ããŸãã
https://consul.ioããé äºãããŠã³ããŒãããŸã
ã³ã³ãããªããUPSTARTã®äžã®é äºã
$wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip $unzip *.zip $mv consul /usr/sbin/consul
Consulãæ©èœããŠããããšã確èªããŸãã
$consul --version Consul v0.6.4 Consul Protocol: 3 (Understands back to: 1)
3ã€ã®ãµãŒããŒãã¹ãŠã«ã€ã³ã¹ããŒã«ããåŸãåæããŒãçšã«ã¯ã©ã¹ã¿ãŒãæºåããŸãã
ã¯ã©ã¹ã¿ããŒã¯ã³ãçæããŸãã
$consul keygen ozgffIYeX6owI0215KWR5Q==
Consulãèµ·åãããŠãŒã¶ãŒãäœæããŸãã
$adduser consul
3ã€ã®ãµãŒããŒãã¹ãŠã«å¿
èŠãªãã£ã¬ã¯ããªãäœæããŸãã
$mkdir -p /etc/consul.d/{bootstrap,server,client}
ConsulããŒã¿ãä¿åãããã£ã¬ã¯ããªãäœæããŸãã
$mkdir /var/consul $chown consul:consul /var/consul
ã¯ã©ã¹ã¿ãŒã®åæèµ·åã«äœ¿çšããããŒãïŒsever1.consul.example.comïŒã§ãããŒãã¹ãã©ããæ§æãäœæããå¿
èŠããããŸãã
$vim /etc/consul.d/bootstrap/config.json
{ "bootstrap": true, "server": true, "datacenter": "production", "data_dir": "/var/consul", "encrypt": "", "log_level": "INFO", "encrypt":ozgffIYeX6owI0215KWR5Q==, "enable_syslog": true }
3ã€ã®ãµãŒããŒãã¹ãŠã§ ããµãŒããŒæ§æ/etc/consul.d/server/config.jsonãäœæããå¿
èŠããããŸãã
ãµãŒããŒ1ïŒ
{ "bootstrap": false, "server": true, "datacenter": "production", "data_dir": "/var/consul", "encrypt": "ozgffIYeX6owI0215KWR5Q==", "log_level": "INFO", "enable_syslog": true, "start_join": ["10.0.0.12", "10.0.0.13"] }
Server2
{ "bootstrap": false, "server": true, "datacenter": "production", "data_dir": "/var/consul", "encrypt": "ozgffIYeX6owI0215KWR5Q==", "log_level": "INFO", "enable_syslog": true, "start_join": ["10.0.0.11", "10.0.0.13"] }
Server3ïŒ
{ "bootstrap": false, "server": true, "datacenter": "production", "data_dir": "/var/consul", "encrypt": "ozgffIYeX6owI0215KWR5Q==", "log_level": "INFO", "enable_syslog": true, "start_join": ["10.0.0.11", "10.0.0.12"] }
次ã«ããã¹ãŠã®ãµãŒããŒã§Consulã®UPSTARTã¹ã¯ãªãããäœæããŸãïŒ/etc/init/consul.confïŒ
description "Consul server process" start on (local-filesystems and net-device-up IFACE=eth0) stop on runlevel [!12345] respawn setuid consul setgid consul exec consul agent -config-dir /etc/consul.d/server
åæã¯ã©ã¹ã¿ãŒèµ·å
ã¯ã©ã¹ã¿ãŒãåæåããŸãïŒåæèµ·åïŒïŒsever1.consul.example.comã§ïŒ
ãµãŒãã¹ãéå§ããã端æ«ããã£ããã£ãããŸãã ããŒãã¹ãã©ããã¢ãŒãã§ã¯ããµãŒããŒèªäœããã¹ã¿ãŒãšããŠèªèº«ãæå®ããå¿
èŠãªãã¹ãŠã®ããŒã¿æ§é ãåæåããŸãã
ä»ã®2å°ã®ãµãŒããŒïŒsever2.consul.example.comãsever3.consul.example.comïŒã¯ãåã«ãµãŒããŒã¢ãŒãã§consulãå®è¡ããŸãã
ãããã®ãµãŒããŒã¯ãããŒãã¹ãã©ãããµãŒããŒã«æ¥ç¶ããŸãã çŸæç¹ã§ã¯ã3å°ã®ãµãŒããŒã®ã¯ã©ã¹ã¿ãŒãããããã®ãã¡2å°ã¯éåžžã®ãµãŒããŒã¢ãŒãã§åäœãããã1å°ã¯åæåã¢ãŒãã§åäœããŸããã€ãŸããä»ã®ãµãŒããŒã«åãåãããããšãªãããŒã¿é
ä¿¡ã決å®ããŸãã
ããã§ãããŒãã¹ãã©ãããµãŒããŒãåæ¢ããæšæºãµãŒããŒã¢ãŒãã§ã³ã³ãœãŒã«ãåèµ·åã§ããŸãã
ããŒãã¹ãã©ãããµãŒããŒã§ã次ãã¯ãªãã¯ããŸãã
CTRL-C
é äºã¯åæ¢ããæšæºãµãŒããŒã¢ãŒãã§åèµ·åããŸãã
sever1.consul.example.comïŒ
次ã®ã³ãã³ãã䜿çšããŠããã¹ãŠãããŸããã£ãããšã確èªããŸãã
çµè«ã¯æ¬¡ã®ãšããã§ãã
Node Address Status Type Build Protocol DC server1.consul.example.com 10.0.0.11:8301 alive server 0.6.4 2 production server2.consul.example.com 10.0.0.12:8301 alive server 0.6.4 2 production server3.consul.example.com 10.0.0.13:8301 alive server 0.6.4 2 production
ããã§ãæ¢è£œã®å¹ççãªé äºã¯ã©ã¹ã¿ãŒãã§ããŸããã
ããã³ããšã³ãã¯ã©ã¹ã¿é äºãšããŠã®ããŒããã©ã³ãµãŒ
ãã®å ŽåãããŒããã©ã³ãµãŒã䜿çšããconsulã¯ã©ã¹ã¿ãŒãžã®ãã¹ãŠã®ãªã¯ãšã¹ãã¯ããŒããã©ã³ãµãŒãééããŸãã Amazonã®å ŽåããªãŒãžã§ã³ã¯èšããŸã§ããªããç°ãªãVPCããã®consulãšãŒãžã§ã³ãã®äœ¿çšã«ã¯ãå€ãã®æªè§£æ±ºã®åé¡ããããŸãïŒèµ·åæã«æå®ãããå€éšIPã®ä»£ããã«å
éšIPãçºè¡šããŸããåæãæ§æãã-ãã®æ®µéã§ã®ç§ã®èŠ³ç¹ããã¯ãåççã§ã¯ãããŸããã
Consul Agentãã€ã³ã¹ããŒã«ãã
åæ§ã«ããã©ã³ãµãŒã§ããConsulãé
眮ããããµãŒããŒã«ããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã
次ã«ããšãŒãžã§ã³ãæ§æãäœæããŸãã
$vim /etc/consul.d/server/config.json
{ "server": false, "datacenter": "production", "data_dir": "/var/consul", "ui_dir": "/home/consul/dist", "encrypt": "ozgffIYeX6owI0215KWR5Q==", "log_level": "INFO", "enable_syslog": true, "start_join": ["10.0.0.11", "10.0.0.12", "10.0.0.13"] }
ãšãŒãžã§ã³ãã®æ°èäŒæ¥ãäœæããŸãã
description "Consul server process" start on (local-filesystems and net-device-up IFACE=eth0) stop on runlevel [!12345] respawn setuid consul setgid consul exec consul agent -config-dir /etc/consul.d/agent
ãšãŒãžã§ã³ããéå§ããŸãã
$start consul
äœãèµ·ãã£ããã確èªããŠãã ããïŒ
$consul members -rpc-addr=10.0.0.11:8400
éå§åŸãåºåã¯æ¬¡ã®ããã«ãªããŸãã
Node Address Status Type Build Protocol DC server1.consul.example.com 10.0.0.11:8301 alive server 0.6.4 2 production server2.consul.example.com 10.0.0.12:8301 alive server 0.6.4 2 production server3.consul.example.com 10.0.0.13:8301 alive server 0.6.4 2 production lb.consul.example.com 10.0.0.1:8301 alive client 0.6.4 2 production
Gobetweenããã©ã³ãµãŒãšããŠæ§æããŸãã
åã®èšäºã§ãLBã®æ©èœã®äžéšã«ã€ããŠèª¬æããŸããã
ãã®å ŽåãããŒã«ã«ã«ã€ã³ã¹ããŒã«ãããConsulãšãŒãžã§ã³ããšäžç·ã«EXECãã£ã¹ã«ããªãŒã䜿çšããã®ãæãç°¡åã§ã-ããã«ãããå
éšããconsulã¯ã©ã¹ã¿ãŒã確èªã§ããŸãïŒçµå±ãå°æ¥çã«ããŒãã®äžéšãè¿œå /åé€ããé¡ãåæ§æããå¿
èŠããªãããšãå€æããå¯èœæ§ããããŸãïŒã
ææ°ã®ãªãªãŒã¹ãããŠã³ããŒãããŸãïŒããŒãžã§ã³ã¯åŸã§å€æŽãããå¯èœæ§ããããŸãã®ã§ããã°ãããåŸ
ã¡ãã ããïŒïŒ
$wget https://github.com/yyyar/gobetween/releases/download/0.3.0/gobetween_0.3.0_linux_amd64.tar.gz $tar -xvf gobetween_0.3.0_linux_amd64.tar.gz $cp gobetween_0.3.0_linux_amd64/gobetween /usr/sbin
ããã§ã¯ãå©çšå¯èœãªconsulããã¯ãšã³ããµãŒããŒã®ãªã¹ãã決å®ããã¹ã¯ãªãããäœæããŸããããããã¯ã確èªæžã¿ã§ãconsulã«ç»é²ãããCONSULãµãŒãã¹ã«ãã£ãŠããŒã¯ããããµãŒããŒã®ãªã¹ããè¿ããŸãã
æ§æããã³ã¹ã¯ãªããå埩çšã®ãã£ã¬ã¯ããªãäœæããŸã
$mkdir /etc/gobetween/
æ€åºã¹ã¯ãªãããäœæããŸãã
$vim /etc/gobetween/consul_node_discovery.sh
ãã®ãããªã³ã³ãã³ãïŒ
ã¹ã¯ãªããåºåãæåã§å®è¡ããå Žåã次ã®ããã«ãªããŸãã
10.0.0.11:8500 10.0.0.12:8500 10.0.0.13:8500
皌åäžã®ãµãŒããŒã®ãªã¹ããååŸãããã®ã¿ã€ãã§ã¯ãhelchecksã䜿çšããŸãã-ãããã¯ã©ã¹ã¿ãŒèªäœã®é äºã«ä»»ããŸãã Gobetweenèªäœãæ§æããŸãã
$vim /etc/gobetween/gobetween.toml
[logging] level = "info" output = "stdout" [api] enabled = true bind = ":8888" [api.basic_auth] login = "admin" password = "admin" [defaults] max_connections = 0 client_idle_timeout = "0" backend_idle_timeout = "0" backend_connection_timeout = "0" [servers.consul] bind = "10.0.0.1:8500" protocol = "tcp" balance = "iphash" max_connections = 0 client_idle_timeout = "10m" backend_idle_timeout = "10m" backend_connection_timeout = "5s" [servers.consul.access] default = "deny" rules = [ "allow 99.99.99.1/24", # region1 docker nodes ip`s pool "allow 199.199.199.1/24", # region 2 docker nodes pool "allow 200.200.200.200/32", #mage node "allow 99.99.98.1/32 " #region-1 load balancer ] [servers.consul.discovery] failpolicy = "keeplast" interval = "10s" timeout = "5s" kind = "exec" exec_command = ["/etc/gobetween/consul_node_discovery.sh"]
upstartã¹ã¯ãªãã/etc/init/gbetween.confãäœæããŸãã
$vim /etc/init/gbetween.conf
# gobetween service description "gobetween" env DAEMON=/usr/sbin/gobetween env NAME=gobetween env CONFIG_PATH=/etc/gobetween/gobetween.toml export GOMAXPROCS=`nproc` start on runlevel [2345] stop on runlevel [!2345] kill signal INT respawn respawn limit 10 5 umask 022 expect stop respawn script exec $DAEMON -c $CONFIG_PATH 2>&1 end script post-stop script pid=`pidof gobetween` kill -9 $pid end script
ãããŠãã©ã³ãµãŒãå®è¡ããŸãïŒ
$start gobetween
ããã§ã¯ã©ã¹ã¿ãŒãã§ããŸãããhttpïŒ// lb_ipïŒ8888 / servers / consulã«ç§»åããconsulãµãŒããŒã®ãªã¹ããæ£åžžã«æ±ºå®ãããããšã確èªã§ããŸãã
DockerããŒãã®ã€ã³ã¹ããŒã«ïŒDockerãåãããµãŒããŒïŒ
ããŒãã¯2ã€ã®ãµããããã«ååšããŸãã
99.99.99.1/24 - region 1 199.199.199.1/24 -region 2
Amazonã®å€éšELASTIC IP-50.50.50.50
Docker
ãã®ããããµãŒããŒã«dockerãã€ã³ã¹ããŒã«ããæé ãç¹°ãè¿ãå¿
èŠã¯ãããŸããã ããã§èªãããšãã§ããŸã ã ç¹å®ã®åé¡ã«ã®ã¿çŠç¹ãåœãŠãŸãã ãŸãããã®ã¬ã€ãã¯Ubuntuã®12ãã©ã³ããš14ãã©ã³ãã§æ©èœããŸããUbuntu16ã§ãåãdockerããŒã¢ã³ã®èšå®ãå¿
èŠã§ããããããã®èšå®ã¯å°ãç°ãªããŸãã
ãŸããDockerããŒã¢ã³ãæ§æããŠèµ·åããŸãã
dockerããŒã¢ã³ã®åæåè¡ãç·šéããŸãã
vim /etc/default/docker
ã³ã¡ã³ãããããã«ã以äžã®è¡ãæ®ãã®è¡ãè¿œå ããå¿
èŠããããŸãã
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --label region=region1 "
次ã«ãDockerãåèµ·åããŸãã
$service docker restart
ãã®åŸãå¿
èŠãªèšå®ã§dockerããŒã¢ã³ãèµ·åããããšã確èªããå¿
èŠããããŸãã
$ps ax |grep docker
次ã®ãããªãã®ã衚瀺ãããã¯ãã§ãã
10174 ? Ssl 264:59 /usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --label region=region
Swarm join
Dockerãæ¢ã«ã€ã³ã¹ããŒã«ãããŠãããµãŒããŒã«Docker Swarmãã€ã³ã¹ããŒã«ããŸãã ç§ã¯Docker Swarmãã³ã³ããã§äœ¿çšããŸããããã¹ãŠãéæã§ãå¿
èŠã«å¿ããŠæ£ç¢ºã«åæåããŠãã·ã³ãã«ãªã¢ããã¹ã¿ãŒãã䜿çšããŠå¶åŸ¡ã§ãããšãã奜ãã§ãã
ãããã£ãŠãswormã§ãã€ããªãã¡ã€ã«ãååŸããæãç°¡åãªæ¹æ³ã¯ããã®ã€ã¡ãŒãžãããŒã«ã«ãã·ã³ã«ããŠã³ããŒãããã€ã¡ãŒãžã解åããŠãå¯èœãªéã解åããããšã§ãã ç§ã¯èªåã§ãããåéããããšã奜ã¿ãŸãã èªè
ã«ä»»ããæé«ã®æ¹æ³ã決ããŠãã ããã
æ¢ã«Docker Swarmã®ãã€ããªãããããããdockerã§ã«ã¹ã¿ã ãµãŒããŒã«ã³ããŒãããšæ³åããŠãã ããã 次ã¯ãupstartã¹ã¯ãªãããèšè¿°ããŠSwarmãæ§æããã ãã§ãã
$vim /etc/init/swarm.conf ```upstart description "Consul server process" start on (local-filesystems and net-device-up IFACE=eth0) stop on runlevel [!12345] respawn setuid root setgid root exec bash -c 'swarm join --ttl 20s --heartbeat 4s --advertise=SERVER_IP:2375 consul://50.50.50.50:8500/swarmcluster/ '
SERVER_IPã¯ãèªåã§ç°¡åã«æœåºã§ããŸããAnsibleã䜿çšããŠAmazonã§ãµãŒããŒãäœæãããšãã«Elastic IPã«çœ®ãæããŠæ¿å
¥ãããŸãã ããã¯ãŸãã«ãSWARM Manageããã®Dockerãã¹ãã«æ¥ç¶ããIPã§ãã
次ã«ã矀ãçµåãéå§ããŸãã
start swarm
次ã®ãããªãªã¯ãšã¹ãã§ç¢ºèªããããšãå¯èœã§ã
$curl -Ss http://50.50.50.50:8500/v1/kv/swarmcluster/docker/swarm/nodes/?keys&seperator=/&dc=production
ãããŠçããåŸãå¿
èŠããããŸãïŒ
$ ["swarmcluster/docker/swarm/nodes/SERVER_IP:2375"]
ãŸããã¯ã©ã¹ã¿ãŒãä»»æã®æ°ã®ãªãŒãžã§ã³ã«ã¹ã±ãŒãªã³ã°ããŸãã åå°åã®ããã«ãŒããŒã¢ã³ã©ãã«ïŒã©ãã«ïŒã®èšå®ââãå€æŽããŸãã åãµãŒããŒã«è€æ°ã®ã©ãã«ãè¿œå ããããšãã§ããŸãïŒãµãŒããŒããªãŒãžã§ã³ã«åå²ãããšäŸ¿å©ã§ããããšãã°ãããã»ããµã®ããã©ãŒãã³ã¹ãã¡ã¢ãªãµã€ãºããã£ã¹ã¯ã®çš®é¡ãªã©ïŒã
Swarm Manageãã€ã³ã¹ããŒã«ãã
ããã§ããã£ãŒããããŒãžã£ãŒã®ã€ã³ã¹ããŒã«ã«çŽæ¥é²ã¿ãŸãã å®éãSwarm Joinãã€ã³ã¹ããŒã«ããããšãšå€§å·®ãããŸããã
ããäžåºŠãæé ãç¹°ãè¿ããŠãã€ããªããµãŒããŒã«ã³ããŒããŠãããUPSTARTã¹ã¯ãªãããäœæããŸãã
$vim /etc/init/swarm.conf
description "Consul server process" start on (local-filesystems and net-device-up IFACE=eth0) stop on runlevel [!12345] respawn setuid root setgid root exec bash -c 'swarm manage -H tcp://$0.0.0.0:2377 -strategy "binpack" consul://50.50.50.50:8500/swarmcluster/'
SWARM_MANAGE_IPã¯ã管çã®IPã§ãã ãã®äŸã§ã¯ã200.200.200.200ã§ãã -strategyã詳ããèŠãŠã¿ãŸãããããã®ãªãã·ã§ã³ã¯ããµã³ãã«ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããããŒãã«ããã³ã³ãããŒã®ååžã決å®ããŸãã binpackæŠç¥ã§ã¯ãæåã®ããŒããæåã«ã³ã³ããã§æºãããã次ã«2çªç®ã®ããŒãã ããæºããããŸãã 1æéã«äœçŸãã®ã³ã³ããã®èµ·å/åæ¢ãããå Žåãããã«ããæçåãåé¿ãããã¯ã©ã¹ã¿ãŒããäžèŠãªããŒããåé€ã§ããŸãã
ã³ã³ããé
åžæŠç¥ã«ã¯3ã€ã®ã¿ã€ãããããŸãã
spread-æå°è² è·ããŒããžã®é
åž
binpack-æãé«å¯åºŠã®ã³ã³ããå
è£
ã©ã³ãã -äœãèšãããšã¯ãããŸãã-ãã¹ãŠãæ確ã§ã:)ããã¯ãããã°ã®ããã«ã®ã¿äœ¿çšãããŸãã
æåŸã«swarm manageãå®è¡ããŸãïŒ
$service swarm start
ãããŠäœãèµ·ãã£ãã®ãã確èªããŠãã ããïŒ
$docker -H 0.0.0.0:2377 info
次ã®ãããªãã®ãååŸããŸãïŒ
Containers: 1 Images: 3 Server Version: swarm/1.2.4 Role: primary Strategy: binpack Filters: health, port, dependency, affinity, constraint Nodes: 3 host1: 99.99.99.1:2375 â Status: Healthy â Containers: 0 â Reserved CPUs: 0 / 8 â Reserved Memory: 0 B / 16.46 GiB â Labels: executiondriver=, kernelversion=3.13.0-86-generic, operatingsystem=Ubuntu 14.04.4 LTS, region=region-1, storagedriver=devicemapper â Error: (none) â UpdatedAt: 2016-08-21T14:40:03Z host3: 99.99.99.2:2375 â Status: Healthy â Containers: 0 â Reserved CPUs: 0 / 2 â Reserved Memory: 0 B / 3.86 GiB â Labels: executiondriver=native-0.2, kernelversion=3.13.0-74-generic, operatingsystem=Ubuntu 14.04.3 LTS, region=region-1, storagedriver=devicemapper â Error: (none) â UpdatedAt: 2016-08-21T14:40:42Z host3: 199.199.199.1:2375 â Status: Healthy â Containers: 1 â Reserved CPUs: 0 / 2 â Reserved Memory: 512 MiB / 3.86 GiB â Labels: executiondriver=native-0.2, kernelversion=3.13.0-74-generic, operatingsystem=Ubuntu 14.04.3 LTS, region=region-2, storagedriver=devicemapper â Error: (none) â UpdatedAt: 2016-08-21T14:40:55Z Kernel Version: 3.13.0-44-generic Operating System: linux CPUs: 12 Total Memory: 24.18 GiB Name: lb.ourcoolcluster.com
å®éãæ¢ã«ã³ã³ãããå®è¡ã§ããŸãïŒ
$docker tcp://0.0.0.0:2377 run -d -P -e constraint:region==region-1 hello-world
ãã£ã«ã¿ãŒãšããªã·ãŒã®è©³çŽ°ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã
ãã®ãããå°åããã®ä»ã®ããŒã¿ã«å¿ããŠã³ã³ãããå®è¡ã§ããã¯ã©ã¹ã¿ãŒããããŸãã 次ã¯ïŒ -åå°åã®ãšã³ããªãã€ã³ããæŽçããŠãã ããã
å°åããšã«ãšã³ã¿ãŒãã€ã³ããäœæãã
次ã«ãSandalone Swarmã®å
éšã¡ã«ããºã ã®ã¿ã§ãã£ã¹ã«ããªãµãŒãã¹ãæ§ç¯ããŠã¿ãŸãããã ã³ã³ãããèµ·åãããšãã«ã©ãã«ã䜿çšããŸãã æäœæ¥ã§è¡ãããå¿
èŠãªã³ã³ãããèµ·åãããšåæã«ç¬èªã®ãšã³ãžã³ãèšè¿°ããŠãæ®ãã®APIã䜿çšããŠBalancerãæäœã§ããŸãã ãã®ã¹ããŒã ã§ã¯ãLBã¯ä»¥åã«ååšããŠããªãã£ãå°åã§æ°ãããµãŒãã¹ã®éå§æã«äžåºŠèšå®ãããŸãã ãã®åŸãè² è·ã®å¢å ã«å¿ããŠãµãŒãã¹ã¬ããªã«ãå®å
šã«éå§ããã³ã³ãããèœã¡ããšãã«åæ¢ããããšãã§ããŸãããã©ã³ãµã¯ãµãŒãã¹ãæäŸããããŒãã®ãªã¹ãã®æ€åºãè¡ããŸãã
ãŸããå¿
èŠã«å¿ããŠãå°åã®é äºã®ã¬ããªã«ãšSwarm管çã®ã¬ããªã«ãç°¡åã«ä¿æã§ããŸãã ããããæãåçŽãªã¹ããŒã ãæ€èšããŸãã
ãã¹ãŠãã©ã®ããã«æ©èœãããã®äžè¬çãªã¹ããŒã ïŒ

Gobetweenã®ã€ã³ã¹ããŒã«ã¯çç¥ãã èµ·åæã«äœ¿çšããæ§æã®ã¿ãæå®ããŸãã
[logging] level = "info" output = "stdout" [api] enabled = true bind = ":8888" [api.basic_auth] login = "admin" password = "admin" [defaults] max_connections = 0 client_idle_timeout = "0" backend_idle_timeout = "0" backend_connection_timeout = "0"
ããã¯ããã©ã³ãµãŒãéå§ããã®ã«ååã§ãã æ®ãã®APIã䜿çšããŠåŸç¶ã®ãã¹ãŠã®æé ãå®è¡ããŸã-éåžžãç¹å¥ãªãµãŒãã¹ãããã«é¢äžããŸãã ãŸãããã¹ããç°¡çŽ åããããã«ãåDockerãµãŒããŒã§ãã¡ã€ã«/ tmp / testãäœæããããã§åãµãŒããŒã«åºæã®æ
å ±ãæžãçããŸãã ããšãã°ããhost1ãããã³ãhost2ã
ããšãã°ãã³ã³ãããå®è¡ããŸãã
$docker run -l service=region-1.nginx -d -p 22001:80 -e constraint:region==region-1 -v /tmp/test:/usr/share/nginx/html:ro nginx $docker run -l service=region-1.nginx -d -p 22001:80 -e constraint:region==region-1 -v /tmp/test:/usr/share/nginx/html:ro nginx
ãªãŒãžã§ã³region-1ã«2ã€ä»¥äžã®ããŒããããå Žåãã³ã³ãããŒãèµ·åããŸãïŒDocker Swarmã¯ãããã³ã°çšã®ããŒãã®å¯çšæ§ããã§ãã¯ããŸãïŒã ãªãŒãžã§ã³å
ã®1ã€ã®ããã«ãŒããŒãã®å Žåã次ã®æ¹æ³ã§2ã€ã®ã³ã³ãããŒãå®è¡ã§ããŸãã
$docker run -l service=region-1.nginx -d -p 22002:80 -e constraint:region==region-1 -v /tmp/test:/usr/share/nginx/html:ro nginx $docker run -l service=region-1.nginx -d -p 22001:80 -e constraint:region==region-1 -v /tmp/test:/usr/share/nginx/html:ro nginx
ã³ã³ããã¯é©åãªå°åã§éå§ãããæ©èœããŠããŸãã 次ã«ããã©ã³ãµãŒãã»ããã¢ããããŸãã
$curl --user admin:admin -XPOST "http://50.50.50.50:8888/servers/r1nginx" --data ' { "bind":"LB_IP:LB_PORT", "protocol": "tcp", "balance": "weight", "max_connections": "0", "client_idle_timeout": "10m", "backend_idle_timeout": "10m", "backend_connection_timeout": "1m" "healthcheck": { "kind": "ping", "interval": "2s", "timeout": "1s" }, "discovery": { "kind": "docker", "docker_endpoint" : "http://50.50.50.50:2377", "docker_container_private_port" : "80", "docker_container_label":"service=region-1.nginx" } } '
ã©ãã§ïŒ
LB_IP-ãã©ã³ãµãŒãå®è¡ãããŠãããµãŒããŒäžã®æ€èšŒè
ã«åãã£ãŠããIPã¢ãã¬ã¹ã
LB_PORT-ãã©ã³ãµãŒãå®è¡ãããŠãããµãŒããŒäžã®ãµãŒããŒã«åãã£ãŠããLB_IPã®TCPããŒãã
ããã§ãäœãèµ·ãã£ããã確èªã§ããŸãã
$curl -sS http://LB_IP:LB_PORT host1 $curl -sS http://LB_IP:LB_PORT host2
ãã®ãããDocker Swarmã¹ã¿ã³ãã¢ãã³ã§å°ççã«åæ£ããã¯ã©ã¹ã¿ãŒãæ§ç¯ãããæãåçŽã§ãããšåæã«éåžžã«æ©èœçãªæ¹æ³ã®1ã€ãæ€èšããŸããã ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãšåæ§ã«ãã€ã³ã¹ããŒã«ã¯éåžžã«ã·ã³ãã«ã§ééçã§ãã ãã®èšäºãèªãã§ããã®ã¿ã€ãã®ã·ã¹ãã ã®æ§ç¯ãšéçšã®å€ãã®åŽé¢ãã«ããŒã§ããªãããšã«æ°ã¥ããèªè
ã«åé¡ãå¥ã®è§åºŠãã匷å¶ãããšããç®æšãè¿œæ±ããŸãã-å¿
èŠãªå
足床ãšçŠæ¬²äž»çŸ©ãç°¡åã«è¡ãã®ã¯é£ããããç°¡åã§èª¿åã®ãšããé£ããã
ã»ãã¥ãªãã£ãšHAã®åé¡ã¯èªè
ã®è£éã«ä»»ããŸãããããããèå³ããããªãããããã以éã®èšäºã§ã«ããŒããããšæããŸãã