Dockerを䜿甚したルヌティングサヌビスのトラブルシュヌティング

Dockerを䜿甚した方法は、サブビスのトラブルシュヌテング


「あなたを砎るのは困難ではなく、あなたがそれらに耐える方法です」-ルヌ・ホルツ

Emmet O'GradyNimbleCIずDocker Ninjaの創蚭者の共著


フランツ・カフカの本「トランスフォヌメヌション」「倉身」で、ある朝目芚めた人は、圌が巚倧な昆虫のような生き物に倉わったこずを発芋したす。 DevOps゚ンゞニアずしお、私たちは人生で同じ超珟実的な瞬間を経隓しおいたす。 ゚キゟチックな゚ラヌを「敷物の䞋に」最もアクセスできない堎所に隠されおいる芋぀けたり、ワヌムやその他の危険な゚ンティティに攻撃されたりしたす。 これを十分長く行うず、遅かれ早かれ、ひどい物語、あるいは2぀私たちず共有しおくださいになりたす。 そのような瞬間、危機が来るのを埅぀こずはできたせん。迅速に行動しなければなりたせん。 これをできるだけ早く修正するには、新しい゚ンティティを展開し、サヌビスの新しいバヌゞョンをリリヌスしお問題を修正する必芁がありたす。
別の超珟実的な瞬間はどうでしょうか。アプリケヌションは、メディア、混雑したSlackチャンネルチャット、たたは瀟内掲瀺板で人気を博しおいたす。 ナヌザヌはあなたのサむトに玠早く来お、あなたのサむトにはすぐに来たす、あなたのサヌビスはそれらでいっぱいです、ナヌザヌの数は制限に達し、さらにそれを超えたす。 ゚ラヌ502を修正しようずする必死のレヌスでは、サヌバヌを芋぀けお新しい゚ンティティを起動し、ネットワヌクずロヌドバランサヌを再構成する必芁がありたす。 あなたは必死にすべおのピヌスをたずめようずしたす。 ナむフでスプヌンで戊おうずしおいるように感じたす。 倢のようにあなたは思う「それは自動化されるべきだ」、倚分それから私はリラックスしお叀兞を読むためにもっず時間があるでしょう。


このような感情をこれ以䞊経隓しないでください Docker 1.12が圹立ちたす。 このリリヌスには、次の条件を提䟛する倚数の新機胜が付属しおいたす。



そしお、Dockerが提䟛するものを孊ぶず、䜿いやすくなりたす。


ルヌティンググリッド


Docker 1.12は、新しい定矩の完党なセットを提䟛したす。 その1぀が「ルヌティンググリッド」ず呌ばれる新機胜です。 コンピュヌタネットワヌクのゞオメトリずそのルヌティングアルゎリズムは新しいものではありたせん。Docker゚ンゞニアリングチヌムの倩才は、このアプロヌチを䜿甚しお、マむクロサヌビスアヌキテクチャでの゜フトりェア倉曎ずディスカバリサヌビスの配信を簡玠化するこずでした。 「グリッド」は、Dockerのコンテナヌ1.12でトラフィックをルヌティングおよびバランシングする新しい方法です。 新しいルヌティング戊略により、ノヌドにサヌビスがデプロむされおいない堎合でも、Swarmのすべおのノヌドの同じポヌトにサヌビスが到達できたす。 ルヌティンググリッドは、Swarmで利甚可胜なすべおのサヌビスにリク゚ストを透過的に分散し、障害のあるノヌドを特定したす。


今日のネットワヌクは同じように芋えたすか


新しいアプロヌチにより、サヌビスの負荷分散を非垞に簡単に構成できたす。Swarmで実行される7぀の異なるサヌビスを持぀3぀のSwarmホストを想像しおください。 倖郚から、任意のノヌドにリク゚ストを送信しお、ランダムサヌビスに自動的に送信ルヌティングするか、垞に1぀のノヌドにリク゚ストを送信しお、Dockerがサヌビス間のバランスを内郚的に分散したす。 したがっお、私たちは自分でサヌビスの負荷分散を取埗したす。


ルヌティンググリッドを䜿甚するず、アプリケヌションが提䟛するコンテナの数を心配せず、クラスタヌがネットワヌク党䜓を凊理し、負荷分散を実行するずいう意味で、コンテナを真に透過的な方法で凊理できたす。 その前に、ロヌドバランサヌずしお機胜するはずのサヌビスの前にリバヌスプロキシサヌバヌを接続しなければならなかった堎合、Dockerに負荷分散を実行させるこずができたす。 Dockerがすべおの汚い仕事をしおくれるので、1぀のコンテナず100のコンテナがある状況の違いは今では些现なものになりたした。 スケヌリングできるコンピュヌタヌコンピュヌティングリ゜ヌスを増やし、スケヌリングを匷化するために1぀のコマンドを実行するだけの理由です。 Dockerはこれをすべお行うため、スケヌリングの前にアヌキテクチャ分析に぀いお考える必芁がなくなりたした。 スケヌリングを開始するず、100個だけでなく1぀のコンテナヌに察しおDockerが透過的に実行するこずを知っおいるため、リラックスできたす。


「コンテナ」ではなく「サヌビス」ずいう甚語を䜿甚する理由を疑問に思うかもしれたせん。 これはDocker 1.12の新しい機胜です。


サヌビスずタスク


Docker 1.12では、新しい抜象化「サヌビス」が導入されおいたす。 サヌビスは、クラスタヌ内のコンテナヌの望たしい状態を決定したす。 内郚的には、カヌネルはこの新しい抂念を䜿甚しお、コンテナが実行されおいるこずを確認し、゚ラヌを凊理し、トラフィックをコンテナにルヌティングしたす。


少し深く掘り䞋げお、新しい抂念の抂念に぀いお説明したしょう。 サヌビスは、起動されるコンテナの1぀の゚ンティティを衚すタスクで構成されたす。 Swarmは、ノヌド間でこれらのタスクをスケゞュヌルしたす。 サヌビスの倧郚分は、垞に実行する必芁がある実行䞭のコンテナタスク゚ンティティ、その動䜜方法各コンテナの構成ずフラグ、および曎新方法フロヌティング曎新などを定矩したす。 これらはすべおサヌビスの望たしい状態を衚し、Dockerカヌネルはクラスタヌの珟圚の状態を垞に監芖し、目的の状態ず䞀臎するように倉曎を加えたす。


redisサヌビスの小さなプレビュヌを次に瀺したす。これに぀いおは、この蚘事の埌半で説明したす。 実行するには、次のようなコマンドを実行する必芁がありたす。


$ docker service create --name redisdb --replicas=3 redis:alpine 

動䜜䞭のルヌティンググリッド


十分な理論、それがすべお動䜜しおいるのを芋おみたしょう。 たず、ルヌティンググリッドの内郚動䜜を瀺す小さなnodejsサヌビスから始めたす。 GitHubのコヌドはこちらにありたす 。 最も重芁なwebapp.jsファむルを芋おみたしょう。


 //  -,    ,  , IP    var http = require('http'); var os = require(“os”); var redis = require('redis'); var server = http.createServer(function (request, response) { //      “OK” response.writeHead(200, {“Content-Type”: “text/plain”}); //     log ,        var version = “2.0”; var log = {}; log.header = 'webapp'; log.name = os.hostname(); log.version = version; //        IPv4 var interfaces = os.networkInterfaces(); var addresses = []; for (var k in interfaces) { for (var k2 in interfaces[k]) { var address = interfaces[k][k2]; if (address.family === 'IPv4' && !address.internal) { addresses.push(address.address); } } } log.nics = addresses; //    redis- (redisdb)   var client = redis.createClient('6379', 'redisdb'); client.on('connect', function(err,reply) { if (err) return next(err); console.log('Connected to Redis server'); client.incr('counter', function(err, reply) { if(err) return next(err); console.log('This page has been viewed ' + reply + ' times!'); console.log(JSON.stringify(log)); response.end(“ Hello, I'm version “+ log.version +”.My hostname is “+ log.name +”, this page has been viewed “+ reply +”\n and my ip addresses are “ + log.nics + “\n” ); }); // client.incr }); // client.on }); // http.createHttpServer //   http-   8000 server.listen(8000); 

このサヌビスは、ホスト名、それを起動したコンテナヌのIPアドレス、および蚪問数のカりンタヌのみを返したす。


それがすべお私たちのアプリです。 それに飛び蟌む前に、Docker 1.12に切り替えたこずを確認する必芁がありたす。


 $ docker version Client: Version: 1.12.0 API version: 1.24 Go version: go1.6.3 Git commit: 8eab29e Built: Thu Jul 28 21:04:48 2016 OS/Arch: darwin/amd64 Experimental: true Server: Version: 1.12.0 API version: 1.24 Go version: go1.6.3 Git commit: 8eab29e Built: Thu Jul 28 21:04:48 2016 OS/Arch: linux/amd64 Experimental: true 

Dockerマシンを䜿甚しお3぀のノヌドのクラスタヌを䜜成するこずから始めたす。


 $ docker-machine create --driver virtualbox swarm-1 Running pre-create checks
 Creating machine
 
 Setting Docker configuration on the remote daemon
 Checking connection to Docker
 Docker is up and running! 
 $ docker-machine create --driver virtualbox swarm-2 
 Docker is up and running! $ docker-machine create --driver virtualbox swarm-3 
 Docker is up and running! $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS swarm-1 — virtualbox Running tcp://192.168.99.106:2376 v1.12.0 swarm-2 — virtualbox Running tcp://192.168.99.107:2376 v1.12.0 swarm-3 — virtualbox Running tcp://192.168.99.108:2376 v1.12.0 

明確にするために、䞀郚のコマンドの出力を枛らしおいたす。 次に、Swarmを構成したす。 Docker 1.12はこれを非垞に簡単にしたす。


 $ eval $(docker-machine env swarm-1) $ docker swarm init --advertise-addr $(docker-machine ip swarm-1) Swarm initialized: current node (bihyblm2kawbzd3keonc3bz0l) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1–1n7gtfmvvrlwo91pv4r59vsdf73bwuwodj3saq0162vcsny89l-5zige8u81ug5adk3o4bsx32fi \ 192.168.99.106:2377 
 

ここで、「worker」ノヌドの前のコマンドの出力であったコマンドをコピヌしお、他の2぀のノヌドに貌り付けたす


 $ eval $(docker-machine env swarm-2) $ docker swarm join \ --token SWMTKN-1–1n7gtfmvvrlwo91pv4r59vsdf73bwuwodj3saq0162vcsny89l-5zige8u81ug5adk3o4bsx32fi \ 192.168.99.106:2377 This node joined a swarm as a worker. $ eval $(docker-machine env swarm-3) $ docker swarm join \ --token SWMTKN-1–1n7gtfmvvrlwo91pv4r59vsdf73bwuwodj3saq0162vcsny89l-5zige8u81ug5adk3o4bsx32fi \ 192.168.99.106:2377 
 This node joined a swarm as a worker. 

新しいSwarmを初期化するずき、コマンドは他のノヌドをSwarmにアタッチするために䜿甚できる2぀の新しいコマンドを衚瀺するこずに泚意しおください。 これらのチヌムの「損倱」を心配しないでください。 「docker swarm join-token worker | manager」を実行するこずで、い぀でも再床取埗できたす。


続行する前に、矀れクラスタヌが機胜しおいるこずを確認したしょう。 コントロヌルノヌドにDockerクラむアントを指定し、そのステヌタスを確認したす。


 $ eval $(docker-machine env swarm-1) $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 5jqsuf8hsemi7bfbwzfdxfcg5 swarm-2 Ready Active 93f0ghkpsh5ru7newtqm82330 swarm-3 Ready Active b2womami9n2t8tti1acvz6v5j * swarm-1 Ready Active Leader $ docker info 
 Swarm: active NodeID: b2womami9n2t8tti1acvz6v5j Is Manager: true ClusterID: bimg9n2ti2tnsprkdjqg07tdm Managers: 1 Nodes: 3 Orchestration: Task History Retention Limit: 5 Raft: Snapshot interval: 10000 Heartbeat tick: 1 Election tick: 3 Dispatcher: Heartbeat period: 5 seconds CA configuration: Expiry duration: 3 months Node Address: 192.168.99.106 

䟋に䜿甚する新しいネットワヌクの䜜成を始めたしょう。


 $ docker network create --driver overlay webnet a9j4al25hzhk2m7rdfv5bqt54 

したがっお、Swarmの新しいサヌビスを開始する準備ができたした。 たず、redisデヌタベヌスず「lherrera / webapp」コンテナを起動したす。これにより、蚪問ペヌゞがredisに保存され、コンテナのホスト名やIPアドレスなど、その他の興味深い詳现が衚瀺されたす。


Webアプリケヌションをデプロむするず、Redisの「redisdb」サヌビスを䜿甚しおredisデヌタベヌスに接続できるようになりたす。 Swarmには内郚DNSがあり、各サヌビスにDNSレコヌドを自動的に割り圓おるため、IPアドレスを䜿甚する必芁はありたせん。 すべおが非垞に簡単です


コントロヌルノヌドからのみサヌビスを展開できたす。 Dockerクラむアントがただコントロヌルノヌドを指しおいる間に、コマンドラむンで「docker service create」ず入力するだけです。


 $ docker service create --name webapp --replicas=3 --network webnet --publish 80:8000 lherrera/webapp:1.0 avq41soybmtw2jamdus0m3pg $ docker service create --name redisdb --network webnet --replicas 1 redis:alpine bmotumdr8bcewcfj6zqkws97x $ docker service ls ID NAME REPLICAS IMAGE COMMAND avq41soybmtw webapp 3/3 lherrera/webapp:1.0 bmotumdr8bce redisdb 1/1 redis:alpine 

サヌビス䜜成チヌムでは、少なくずも画像この堎合はlherrera / webappを指定する必芁がありたす。 慣䟋により、webappずいう名前も提䟛しおいたす。 たた、むメヌゞの接続埌にのみコンテナ内で起動するためのコマンドを発行する必芁がありたす。 前のコマンドでは、珟圚の任意の時点でコンテナヌの3぀のレプリカを実行するこずも瀺しおいたす。 「-replicas」フラグを䜿甚するず、どのノヌドに移動するかを心配する必芁がなくなりたす。ノヌドごずに1぀のサヌビスが必芁な堎合は、代わりに「-mode = global」コマンドを䜿甚できたす。


前に䜜成した「webnet」ネットワヌクを䜿甚しおいるこずがわかりたす。 Swarmの倖郚からサヌビスを䜜成できるようにするには、SwarmがWeb芁求をリッスンするポヌトを蚭定する必芁がありたす。 この䟋では、サヌビス内のポヌト8000​​をすべおのノヌドのポヌト80に「蚭定」したす。 ルヌティングラティスのおかげで、すべおのルヌティングノヌドでポヌト80を予玄し、Docker Engineはコンテナのすべおのレプリカのポヌト8000​​の間でトラフィックのバランスを取りたす。


Swarmは、このサヌビスの説明をアプリケヌションの望たしい状態ずしお䜿甚し、ノヌドにアプリケヌションのデプロむを開始しお、この望たしい状態を達成および維持したす。 サヌビスの远加パラメヌタヌを指定しお、リロヌドルヌル、メモリずCPUの制限、ホストコンテナヌなどの説明を完了するこずができたす。 䜿甚可胜なすべおのフラグの完党なリストに぀いおは、「docker service create」コマンドを䜿甚できたすこちらを参照。


この段階で、りェブアプリケヌションがりェブネットネットワヌクに正しく接続されおいるこずを確認できたす。


 $ docker network ls NETWORK ID NAME DRIVER SCOPE df19a5c87d90 bridge bridge local 7c5762c8c6ff docker_gwbridge bridge local eb0bd5a4920b host host local bqqh4te5f5tf ingress overlay swarm 3e06a1616b7b none null local a9j4al25hzhk webnet overlay swarm $ docker service inspect webapp 
 “VirtualIPs”: [ { “NetworkID”: “7i9t9uhtr7x0hybsvnsheh92u”, “Addr”: “10.255.0.6/16” }, { “NetworkID”: “a9j4al25hzhk2m7rdfv5bqt54”, “Addr”: “10.0.0.4/24” } ] }, 
 

次に、䟋に戻り、サヌビスが皌働しおいるこずを確認したす。


 $ docker service ps webapp ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR bb8n4iagxcjv4rn2oc3dj6cvy webapp.1 lherrera/webapp:1.0 swarm-1 Running Preparing about a minute ago chndeorlvglj45alr4vhy50vg webapp.2 lherrera/webapp:1.0 swarm-3 Running Preparing about a minute ago 4txay0gj6p18iuiknacdoa91x webapp.3 lherrera/webapp:1.0 swarm-2 Running Preparing about a minute ago 

留意すべき質問が1぀ありたす。Dockerサヌビスはidですばやく返されるコマンドを䜜成したすが、サヌビスの実際のスケヌリングには、特にむメヌゞがノヌド䞊にある必芁がある堎合、時間がかかる堎合がありたす。 この堎合、すべおのレプリカがサヌビスに提䟛されるたで、「docker service ps webapp」コマンドを数回実行するだけです。


サヌビスが開始されるずこれには数分かかる堎合がありたすが、この間コヌヒヌを補充したす、リク゚ストに応じおサヌビスが受け取るものを確認できたす。
最初に、最初のホストのIPを取埗する必芁がありたす。


 $ NODE1=$(docker-machine ip swarm-1) 

次に、Swarmのポヌト80でサヌビスを公開したため、そのIPアドレスにポヌト80を蚭定したす。 以䞋の䟋ではcurlを䜿甚しおいたすが、ブラりザヌでIPを蚭定しお同じ結果を埗るこずができたす。



これで、新しいサヌビスをテストする準備ができたした。


 $ curl $NODE1 Hello, I'm version 1.0.My hostname is 5a557d3ed474, this page has been viewed 1 and my ip addresses are 10.255.0.9,10.255.0.6,172.18.0.3,10.0.0.7,10.0.0.4 $ curl $NODE1 Hello, I'm version 1.0.My hostname is 4e128c8af4ae, this page has been viewed 2 and my ip addresses are 10.255.0.7,10.255.0.6,172.18.0.3,10.0.0.5,10.0.0.4 $ curl $NODE1 Hello, I'm version 1.0.My hostname is eaa73f01996c, this page has been viewed 3 and my ip addresses are 10.255.0.8,10.255.0.6,172.18.0.4,10.0.0.6,10.0.0.4 

最初のリク゚ストがコンテナ「5a557d3ed474」に送信されたこずがわかりたす。 「曎新」を数回クリックするか、コマンドラむンから再床「curl」を呌び出すず、䜜成した3぀のコンテナレプリカすべおに送信されたリク゚ストが衚瀺されたす。


ルヌティンググリッドの他の偎面を瀺すために、ポヌト80を他の2぀のDockerノヌドのIPに「割り圓お」おみおください。 前ず同じものが衚瀺されたす。これから、どのノヌドを芁求したかは関係ありたせん。 リク゚ストは垞に3぀のコンテナ間で内郚的にバランスが取られたす。


フロヌティング曎新ロヌリング曎新


サヌビスの説明の䞀郚ずしお、サヌビスを曎新するための戊略を蚭定できたす。 たずえば、 — update-delayフラグを䜿甚しお、サヌビスタスクコンテナたたはタスクセットの曎新間の遅延を蚭定できたす。 たたは、フラグ— update-parallelismを䜿甚しお、デフォルトの動䜜を倉曎できたす。䞀床に1぀のコンテナヌを曎新したす。 次の䟋に瀺すように、これらのフラグはすべお、サヌビス䜜成プロセス䞭たたは「docker service update」コマンドを䜿甚しお埌で蚭定できたす。 updateコマンドにはdocker service createコマンドずほが同じパラメヌタヌが必芁ですが、䞀郚のフラグはupdateコマンドずは異なる名前を持っおいたす。 createコマンドで蚭定できるものはすべお、updateコマンドで倉曎できるため、い぀でもサヌビス蚘述の䞀郚を自由に倉曎できたす。


ロヌリング曎新を手動で適甚ダりンヒュルを実際に移動し、自分が制埡できないこずを認識したす


webappサヌビスを曎新しお、ロヌリング曎新メカニズムの動䜜を確認したしょう。 開発チヌムはwebappの改善に䞀生懞呜取り組み、「2.0」ずいう新しいタグをリリヌスしたした。 次に、この新しい方法で新しいサヌビスを曎新したす。


 $ docker service update --update-parallelism 1 --update-delay 5s --image lherrera/webapp:2.0 webapp 

曎新は䞀床に1぀ず぀行い、各曎新の間隔を5秒に蚭定するこずも瀺しおいるこずに泚意しおください。 このアプロヌチは、ダりンタむムがないこずを意味したす


曎新が行われおいる間、数秒ごずに「docker service ps webapp」を実行しお、リアルタむムで曎新を監芖したす。 叀い画像が1぀ず぀オフになり、新しい画像に眮き換えられたす。


 $ docker service ps webapp ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 7bdpfbbjok78zt32xd9e2mqlt webapp.1 lherrera/webapp:2.0 swarm-3 Running Running 43 seconds ago bb8n4iagxcjv4rn2oc3dj6cvy \_ webapp.1 lherrera/webapp:1.0 swarm-1 Shutdown Shutdown 44 seconds ago af2rlu0laqhrj3uz8brym0f8r webapp.2 lherrera/webapp:2.0 swarm-2 Running Running 30 seconds ago chndeorlvglj45alr4vhy50vg \_ webapp.2 lherrera/webapp:1.0 swarm-3 Shutdown Shutdown 30 seconds ago 0xjt6gib1hql10iqj6866q4pe webapp.3 lherrera/webapp:2.0 swarm-1 Running Running 57 seconds ago 4txay0gj6p18iuiknacdoa91x \_ webapp.3 lherrera/webapp:1.0 swarm-2 Shutdown Shutdown 57 seconds ago 

それは信じられないほど玠晎らしいものです


アプリケヌションがむメヌゞのバヌゞョンも印刷する堎合、曎新をリアルタむムで確認する別の方法は、曎新䞭にサヌビスの繰り返し゚ンドポむントをクリックするこずです。 サヌビスが曎新されるず、曎新が完了しおすべおのサヌビスがバヌゞョン2.0を返すたで、「バヌゞョン2.0」を返すリク゚ストが埐々に増えたす。


 $ curl $NODE1 Hello, I'm version 1.0.My hostname is 5a557d3ed474, this page has been viewed 4 and my ip addresses are 10.255.0.9,10.255.0.6,172.18.0.3,10.0.0.7,10.0.0.4 $ curl $NODE1 Hello, I'm version 2.0.My hostname is e0899324d9df, this page has been viewed 5 and my ip addresses are 10.255.0.10,10.255.0.6,172.18.0.4,10.0.0.8,10.0.0.4 $ curl $NODE1 ... 

RedisはRedisサヌビスを倉曎せず、webappむメヌゞのみを倉曎したため、継続は無効であるず芋なしおいるこずに泚意しおくださいRadisサヌビスのグラフは倉曎されおいたせん。


成長゜リュヌション


ミツバチの矀れは初倏によく芋られたす。 ミツバチは、本物のコロニヌがたくさんある堎合、矀れで結合するこずにより、本胜的に生存を利甚したす。 そしお、これをコンテナヌクラスタヌで行いたす。


矀れで団結しよう...


ノヌドが電力の限界に達し、クラスタヌにノヌドを远加する必芁があるずしたしょう。 ずおもシンプルで、たった4぀のコマンドで実行できたす わかりやすくするために、さらにいく぀かを䜿甚しお、発生しおいるこずを十分に理解できるようにしたす。


 $ docker-machine create -d virtualbox swarm-4 
 Docker is up and running! Join the node the swarm as a worker as before: $ eval $(docker-machine env swarm-4) $ docker swarm join \ --token SWMTKN-1–1n7gtfmvvrlwo91pv4r59vsdf73bwuwodj3saq0162vcsny89l-5zige8u81ug5adk3o4bsx32fi \ 192.168.99.106:2377 This node joined a swarm as a worker. 

新しいノヌドずwebappサヌビスの䞡方が実行されおいるこずを確認したす。


 $ eval $(docker-machine env swarm-1) $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 93f0ghkpsh5ru7newtqm82330 swarm-3 Ready Active e9rxhj0w1ga3gz89g927qvntd swarm-4 Ready Active 5jqsuf8hsemi7bfbwzfdxfcg5 swarm-2 Ready Active b2womami9n2t8tti1acvz6v5j * swarm-1 Ready Active Leader $ docker service ps webapp ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 7bdpfbbjok78zt32xd9e2mqlt webapp.1 lherrera/webapp:2.0 swarm-3 Running Running 5 minutes ago bb8n4iagxcjv4rn2oc3dj6cvy \_ webapp.1 lherrera/webapp:1.0 swarm-1 Shutdown Shutdown 5 minutes ago af2rlu0laqhrj3uz8brym0f8r webapp.2 lherrera/webapp:2.0 swarm-2 Running Running 5 minutes ago chndeorlvglj45alr4vhy50vg \_ webapp.2 lherrera/webapp:1.0 swarm-3 Shutdown Shutdown 5 minutes ago 0xjt6gib1hql10iqj6866q4pe webapp.3 lherrera/webapp:2.0 swarm-1 Running Running 6 minutes ago 4txay0gj6p18iuiknacdoa91x \_ webapp.3 lherrera/webapp:1.0 swarm-2 Shutdown Shutdown 6 minutes ago luis@aurelio [13:14:27] [~/webapp] [2.0] 

次に、4぀のレプリカに察しおwebappサヌビスをアクティブ化したす。


 $ docker service update --replicas=4 webapp 

むメヌゞが新しいノヌドから起動するたで数分埅぀必芁がありたす。


 $ docker service ps webapp ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 7bdpfbbjok78zt32xd9e2mqlt webapp.1 lherrera/webapp:2.0 swarm-3 Running Running 10 minutes ago bb8n4iagxcjv4rn2oc3dj6cvy \_ webapp.1 lherrera/webapp:1.0 swarm-1 Shutdown Shutdown 10 minutes ago af2rlu0laqhrj3uz8brym0f8r webapp.2 lherrera/webapp:2.0 swarm-2 Running Running 10 minutes ago chndeorlvglj45alr4vhy50vg \_ webapp.2 lherrera/webapp:1.0 swarm-3 Shutdown Shutdown 10 minutes ago 0xjt6gib1hql10iqj6866q4pe webapp.3 lherrera/webapp:2.0 swarm-1 Running Running 10 minutes ago 4txay0gj6p18iuiknacdoa91x \_ webapp.3 lherrera/webapp:1.0 swarm-2 Shutdown Shutdown 10 minutes ago 81xbk0j61tqg76wcdi35k1bxv webapp.4 lherrera/webapp:2.0 swarm-4 Running Running 20 seconds ago 

ただ 矀れにいる蜂はい぀も気分が良いです


グロヌバルサヌビスの堎合䟋で芋たように、レプリケヌションずは察照的に、Swarmは新しい利甚可胜なノヌドでサヌビスの新しいタスクを自動的に開始したす。


ルヌティングの埩元力


䜕かが十分に起こらない堎合、クラスタヌはこれらのサヌビスの状態を管理したずえば、レプリカの実行、サヌビスを目的の状態に埩元できない堎合に備えたす。 このシナリオでは、新しいコンテナずIPアドレスが衚瀺されたり消えたりしたす。 幞いなこずに、新しいビルトむンサヌビスディスカバリメカニズムは、これらの状況やコンテナの障害にサヌビスを適応させるのに圹立ち、今でも完党なノヌド障害は気付かれるこずはありたせん。


埓来のフェルオヌバヌ環境HA環境でのネトトワヌクルヌティング


これを実際に芋るために、匕き続き䟋を芋お、小さな障害が発生したクラスタヌのノヌドをシミュレヌトしたす。


クラスタヌでwebappがただ実行されおいるこずを確認したしょう


 $ docker service ps webapp ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 7bdpfbbjok78zt32xd9e2mqlt webapp.1 lherrera/webapp:2.0 swarm-3 Running Running 10 minutes ago bb8n4iagxcjv4rn2oc3dj6cvy \_ webapp.1 lherrera/webapp:1.0 swarm-1 Shutdown Shutdown 10 minutes ago af2rlu0laqhrj3uz8brym0f8r webapp.2 lherrera/webapp:2.0 swarm-2 Running Running 10 minutes ago chndeorlvglj45alr4vhy50vg \_ webapp.2 lherrera/webapp:1.0 swarm-3 Shutdown Shutdown 10 minutes ago 0xjt6gib1hql10iqj6866q4pe webapp.3 lherrera/webapp:2.0 swarm-1 Running Running 10 minutes ago 4txay0gj6p18iuiknacdoa91x \_ webapp.3 lherrera/webapp:1.0 swarm-2 Shutdown Shutdown 10 minutes ago 81xbk0j61tqg76wcdi35k1bxv webapp.4 lherrera/webapp:2.0 swarm-4 Running Running 20 seconds ago 

ノヌド


 $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 21z5m0vik76msi90icrf8prvf swarm-3 Ready Active 7zyckxuwsruehcfosgymwiucm swarm-4 Ready Active 9aso727d8c4vc59cxu0e8g778 swarm-2 Ready Active bihyblm2kawbzd3keonc3bz0l * swarm-1 Ready Active Leader 

これが楜しい郚分の始たりです-誰が䜜業ノヌドをオフにしお䜕が起こるかを知りたくないのですか


 $ docker-machine stop swarm-2 

サヌビスがどのように応答したかを芋おみたしょう。


 $ docker service ps webapp ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 7bdpfbbjok78zt32xd9e2mqlt webapp.1 lherrera/webapp:2.0 swarm-3 Running Running 11 minutes ago bb8n4iagxcjv4rn2oc3dj6cvy \_ webapp.1 lherrera/webapp:1.0 swarm-1 Shutdown Shutdown 11 minutes ago af2rlu0laqhrj3uz8brym0f8r webapp.2 lherrera/webapp:2.0 swarm-4 Running Running 11 minutes ago chndeorlvglj45alr4vhy50vg \_ webapp.2 lherrera/webapp:1.0 swarm-3 Shutdown Shutdown 11 minutes ago 0xjt6gib1hql10iqj6866q4pe webapp.3 lherrera/webapp:2.0 swarm-1 Running Running 11 minutes ago 4txay0gj6p18iuiknacdoa91x \_ webapp.3 lherrera/webapp:1.0 swarm-4 Shutdown Shutdown 11 minutes ago 15pxa5ccp9fqfbhdh76q78aza webapp.4 lherrera/webapp:2.0 swarm-3 Running Running 4 seconds ago 81xbk0j61tqg76wcdi35k1bxv \_ webapp.4 lherrera/webapp:2.0 swarm-2 Shutdown Running about a minute ago 

わあ Dockerは、swarm-2ノヌドを「殺した」埌、swarm-3ノヌドに新しいコンテナをデプロむしたした。 ご芧のずおり、3぀のレプリカが実行されおいたす「swarm-3」ノヌドに2぀...


 $ curl $NODE1 Hello, I'm version 2.0.My hostname is 0d49c828b675, this page has been viewed 7 and my ip addresses are 10.0.0.7,10.0.0.4,172.18.0.4,10.255.0.10,10.255.0.6 $ curl $NODE1 Hello, I'm version 2.0.My hostname is d60e1881ac86, this page has been viewed 8 and my ip addresses are 10.0.0.7,10.0.0.4,172.18.0.4,10.255.0.10,10.255.0.6 

そしお、トラフィックは新しく䜜成されたコンテナに自動的にリダむレクトされたす


Swarmの成長ず開発


゜フトりェアは急速に倉化しおいたす。 倱敗は起こりたす。そしお、あなたがそれを最も期埅しないずき、それらは必然的に起こりたす。 「サヌビス」の新しい抜象化がDocker 1.12で導入され、曎新が簡玠化され、ダりンタむムずサヌビス障害が防止されたした。 さらに、この新しいアプロヌチにより、Webサヌバヌなどの長時間実行されるサヌビスの蚈画ず保守がはるかに簡単になりたす。 少数のコマンドを䜿甚しお、Docker EngineのSwarmに耇補、分散、負荷分散されたサヌビスをデプロむできるようになりたした。 クラスタヌは、サヌビスの状態を管理し、ノヌドたたはコンテナヌに障害が発生した堎合にサヌビスを目的の状態にするこずもできたす。


゜ロモン・ハむクスは、開発者の生掻を楜にするこずをどのように望んでいるかをよく説明しおいたす。基盀ずなるむンフラストラクチャに関係なく」


Docker 1.12のリリヌスにより、確かに玄束どおりに機胜するず思いたす。 Dockerによっお物事がより簡単になりたす。これが、冒頭で述べたこれらの超珟実的な瞬間が消え始めた瞬間です。 DevOpsで他の超珟実的な瞬間はありたすか 共有しおください


詳现ずDocker 1.12ぞのリンク




Source: https://habr.com/ru/post/J310390/


All Articles