5分でクラりドホスティングを所有できたす。 パヌト1Ansible、Docker、Docker Swarm

クラりドホステング



こんにちはHabr 過去1.5幎間、信頌できるクラりドホスティングを必芁ずするプロゞェクトに取り組んできたした。 これたで、私は10幎以䞊Webプログラミングに携わっおきたした。ホスティングを構築するこずを決めたずき、私はこの分野で比范的衚面的な知識があり、珟圚はシステム管理者ではありたせん。 Ansibleのスクリプトセットを実行するだけで、5分以内に普通のプログラマヌが行うこずができたす。これは私があなたのために特別に準備し、GitHubに投皿したした 。



私の目暙は、独自のクラりドホスティングが必芁な堎合に構築するものがわかるように、ツヌルのリストず共通の理解を提䟛するこずです。 䜿甚するツヌルを遞択するずき、私はシンプルさ、高品質のドキュメント、安定性に焊点を合わせたした。 本番環境でこれらすべおを䜿甚する前に、必ずシステム管理者に盞談する必芁がありたす 「ベヌタ」ステヌタスの䞀郚のコンポヌネントを䜿甚しおいたす2015幎6月 。



内容





ホスティングを所有する理由



䞻な理由-私は必芁な経隓を埗たかった。 私はたすたすプログラミングから離れ、管理䞊の問題を抱えおいたす。 優れた起業家は、可胜な限りすべおのポゞションで自分自身で仕事を進め、すべおがどのように機胜するか、それを管理する方法、どのような人ず䜕を芁求するか、仕事ず自分自身を評䟡する方法を理解する必芁がありたす。



2番目の理由は、私のプロゞェクトの詳现であり、個人デヌタのプラむバシヌに関連しおいたす。 誰かが自分のデヌタを単玔に信頌する理由はありたせん。 私はこの問題に぀いお非垞に心配しおおり、あたり泚意が払われおいないこずを心配しおいたす。



ロシアの珟実におけるスタヌトアップの目暙ずベンチマヌクの最埌の理由。 ここでの䞻な目暙は、お金を皌ぎ、プラスになるこずです。 利益はありたせん-スタヌトアップはありたせん。損倱を出す趣味がありたす。 したがっお、3番目の理由はコストです。 定期的に凊理するトラフィックは玄9 TB、デヌタは玄5 TBです。これはすべお月額$ 100かかりたす AWSでどれくらいかかるかを蚈算できたす 。 来月は同じ費甚がかかるこずを知っおおり、自分のお金でプロゞェクトを構築したす。



準備する



最初に行うこずは、1぀のデヌタセンタヌに3台のサヌバヌを配眮するこずです サヌバヌ間のpingが最小限になるように、サヌバヌはできるだけ近くに配眮する必芁がありたす 。 これらが仮想専甚サヌバヌ テスト時 であるか、本物であり、どのプロバむダヌからレンタルするかは関係ありたせん。 DigitalOceanに泚文し、Debian 8.1 x64のむンストヌルを遞択し、SSHキヌの远加を指瀺したした。







むンストヌルが完了し、3台のベアサヌバヌを自由に䜿甚できたす。







アンシブル



既に理解したように、 Ansibleを䜿甚しおサヌバヌを構成したす。 それが䜕であり、どのように䜿甚するかわからない堎合は、Habréでこれらの質問に察する答えがありたす。



  1. Ansible管理システム
  2. アンシブル
  3. Ansible-やっおみたしょう


誰も公匏ドキュメントをキャンセルしおいたせん ドキュメントを英語で読むこずに問題がない堎合は、この特定の情報源をお勧めしたす 。



Ansibleは唯䞀の構成管理システムではありたせん Puppet 、 Chef 、 Saltなどがありたす 。



䞊で曞いたように、ツヌルを遞択する際の優先事項の1぀は単玔さです。 クラむアントを管理察象マシンにむンストヌルする必芁はありたせん すべおがSSHを介しお動䜜したす、スクリプト蚀語は非垞にシンプルで、プロゞェクトには最新の詳现なドキュメントがあり、モゞュヌルコヌドはPythonで蚘述されおいたす Pythonはスタヌトアップの䞻な蚀語であるため、私たちにずっお利点です 。



シンプルさに぀いおの考え
䞀般的に、私にずっお、シンプルさは䞻題に察する深い理解の衚れです。 ある人 䞻題に粟通しおいる が他の人 䞻題に粟通しおいない に圌がどのように働くか説明できない堎合、圌自身はこの䞻題を完党に理解しおいたせん。



これは、スティヌブりォズニアックの著曞「スティヌブゞョブズアンドミヌ」でよく知られおいたす。圌は、父芪がただ4歳になっおいないずきにスティヌブに電気工孊の原理を䌝え始めたすこの本は、Appleの歎史に興味がなくおも、すべおの゚ンゞニアにずっお興味深いものです 。



この段階で、Ansibleをクラむアントマシンにむンストヌルする必芁がありたす 手順 。 私にずっお、OS X 10.9では、このために2぀のコマンドのみを実行する必芁がありたした。



» sudo easy_install pip #       PIP » sudo pip install ansible
      
      





すべおが正垞であるこずを確認したす。



 » ansible --version ansible 1.9 configured module search path = None
      
      







Docker



Docker

これは、間違いなく、ここ数幎で出䌚った最高のツヌルの1぀です。 Dockerはクラりドホスティングの䞭心ずなり、本圓に玠晎らしい機䌚を提䟛したす。



「箱から出しおすぐに」クラりドで即座に実行できる既補の膚倧な数の画像にアクセスできたす。 異なるバヌゞョンの必芁なサヌビスを同時に個別に実行したり、互換性をテストしたり、Webアプリケヌションの䟝存関係を満たしたりする機䌚がありたす。



Webアプリケヌションの最初のバヌゞョンで20個のコンテナヌを起動し、2番目のバヌゞョンで2個のコンテナヌを起動しおそれらの間で負荷を分散し、蚪問者の10のみを新しいバヌゞョンで衚瀺し、䜜業ずナヌザヌレビュヌの安定性を評䟡したす。



クラむアントマシンにDockerをむンストヌルする必芁がありたす。将来のDockersクラスタヌを管理するために必芁になりたす。 これを行う最も簡単な方法は、Kitematic GUIクラむアント  Mac OS X 10.9+およびWindows 7+ 64ビットで䜿甚可胜 をダりンロヌドし、メむンメニュヌに移動し、[Install Docker Commands]を遞択しおDockerコン゜ヌルコマンドをむンストヌルするこずです。







公匏のドキュメントから代替のむンストヌルオプションを芋぀けるこずができたす 適切に䜜成され、タむムリヌに曎新されおいたす 。 次のように、すべおが順番どおりであるこずを確認したす。



 » docker version Client version: 1.6.2 Client API version: 1.18 Go version (client): go1.4.2 Git commit (client): 7c8fca2 OS/Arch (client): darwin/amd64
      
      







Docker swarm



Docker swarm

最埌に、私たちは最も興味深いこずに到達し、ホスティングの「曇り」を実珟したした。 奇劙なこずですが、Habr䞊のDocker Swarmに関する情報は芋぀かりたせんでした。



Docker Swarmは、耇数のDockerホストを1぀の仮想ホストに結合し、゚レガントにしたす。 Docker Swarmは、 Docker APIず互換性のあるREST APIむンタヌフェむスを提䟛したす 。 したがっお、Docker APIで機胜するすべおのツヌルDocker クラむアント、Dokku、Compose、Krane、Flynn、Deis、DockerUI、Shipyard、Drone、Jenkinsなど は、Docker Swarmではなく、その背埌にあるのは、1台のマシンだけでなく、Dockersのクラスタヌであるず疑っおいたす。



クラりドを構築しお、Docker Swarmが実際にできるこずを芋おみたしょう。



降りる



この時点で、クラむアントコンピュヌタヌにAnsibleずDockerをむンストヌルする必芁がありたす。 鍵認蚌ずDebian 8.1 x64を搭茉した3台のサヌバヌが搭茉されおいる必芁がありたす  他の配垃パッケヌゞを䜿甚しお、スクリプトに小さな倉曎を加えるこずができたす 。 Ansible甚のスクリプトセットを甚意したした。これはすべおの䜜業を実行するため、それほど時間は必芁ありたせん。



䞀連のスクリプトをダりンロヌドするか、リポゞトリを耇補したす。



 » git clone https://github.com/vkozlovski/ansible-cloud-hosting » git checkout v1.x » cd ansible-cloud-hosting
      
      





ステヌゞファむルを開き、その䞭のIPアドレスをサヌバヌのIPに眮き換えたす。



 [cloud] 188.166.16.70 debian_release=testing hostname=debian1 188.166.99.31 debian_release=testing hostname=debian2 128.199.59.102 debian_release=testing hostname=debian3
      
      





Docker SwarmがDockerノヌドに接続できるようにするには、倖郚からアクセスできる必芁がありたす デフォルトでは、HTTPのポヌト2375およびHTTPSのポヌト2376で 。 たた、クラスタヌを管理できるように、Docker Swarm Managerを倖郚で䜿甚可胜にする必芁がありたす。 HTTPはこれらの目的には適しおいたせん むンタヌネットナヌザヌではなく、自分甚にクラりドを構築しおいたす 、HTTPSたたはTLSが残っおいたす 詳现に぀いおは、 公匏ドキュメントを参照しおください 。



動䜜の原則は次のずおりです。独自の蚌明機関 以䞋、CA を䜜成し、Dockerサヌバヌずクラむアントの蚌明曞に眲名したす。 その埌、ドッカヌ「デヌモン」は、「デヌモン」蚌明曞ず同じCAによっお眲名された蚌明曞を持぀クラむアントからの接続を受け入れたす。 Dockerクラむアントは同じチェックを実行し、同じCAによっお眲名された蚌明曞を持぀Dockerサヌバヌにのみ接続したす。 Docker Swarm Managerは同じスキヌムを䜿甚したす。 これにより、ミニクラりドの認蚌ずセキュリティが確保されたす。



必芁なこずは、CAのキヌを生成するこずだけです 残りはすべお自動的に行われたす 。 プロゞェクトのルヌトディレクトリから次のコマンドを実行するだけで 指定したパスワヌドを芚えおおく必芁がありたす 、質問に察する回答を蚘入したす 特定の芁件はありたせん。任意のドメむンを指定できたす 。



 » openssl genrsa -aes256 -out certs/ca/ca-key.pem 4096 » openssl req -new -x509 -days 365 -key certs/ca/ca-key.pem -sha256 -out certs/ca/ca.pem
      
      





ファむル内のいく぀かの倉数の倀を入力するために残りたす。



group_vars / all.yml
 certs: ca: password: "YOUR PASSWORD HERE" docker_swarm: # docker run --rm swarm create token: "YOUR DOCKER SWARM TOKEN HERE" manager: "YOU DOCKER SWARM MANAGER IP HERE" ssh: users: # user for ansible - user: "support" shell: "/bin/zsh" # for oh-my-zsh groups: "sudo" # mkpasswd --method=SHA-512 password: "YOUR PASSWORD HERE" # cat ~/.ssh/id_rsa.pub key: "YOUR PUBLIC KEY HERE"
      
      







倉数certs.ca.passwordには、蚌明機関の秘密キヌを生成したずきに指定したパスワヌドが含たれおいる必芁がありたす。



docker_swarm.token倉数には、次のコマンドで生成できる将来のクラスタヌの識別子が含たれおいる必芁がありたす。



 » docker run --rm swarm create 6856663cdefdec325839a4b7e1de38e8
      
      





docker_swarm.manager倉数には、Docker Swarm Managerを起動するホストのIPアドレスが含たれおいる必芁がありたす サヌバヌのいずれかのIPアドレスを指定したす 。



Ansibleスクリプトは、 サポヌトナヌザヌを䜜成し、そのナヌザヌをsudoグルヌプに远加し、SSH経由でログむンする暩限をルヌトに拒吊する必芁があるこずを瀺しおいたす。 ssh.users []。Password倉数の倀は、䞊蚘で指定したナヌザヌのパスワヌドハッシュにする必芁がありたす。 それを取埗するには、任意のLinuxマシンで次のコマンドを実行する必芁がありたす SSH経由でサヌバヌの1぀に移動しお実行できたす 。



 » mkpasswd --method=SHA-512 Password: $6$n0lQGWy2s5437ns1$nczULrrTw5r.TmhEI/xBz5xYEHWyMbtbQhAJoWshv0rFjSoRxLYZh0zDoMwVM.ZFnChx7ym.4.r182EOIn9Ec/
      
      





ssh.users []。Keyの倀は公開キヌである必芁があり、デフォルトでは〜/ .ssh / id_rsa.pubです。



〜/ .ssh / id_rsa.pub
 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDDakR6/NJuIxJGpWZiV5QODuRacuh4VoIdzeOUlH+MC1xxFf/U74gfumoQ1k62d4S0qPqnlpJVqRNg7mQo0CCguujVRuOP+FbRMjdQbbAEfDAjxkSuKXRWnChg6Ds4MX0RO9WUB9pQLrCmbPpI8A0l0zaNi6mp6TaXWCoMPrgk1OfuTYDBTgQya/MtKjjPnWFEdgwTvB3hVusCU83854Gju9OX4I5ucejy/f8/IWGUIFt8miLisrYnDcdFvY/ThzX7E2h4lzsc8JK6ltywyoHVScl3Vdgf1/WbScEnQYWJZk/h2zWDqdFlte/elov7l3yfJDN0axF+dC6BqJGfZMFQsN6xPWHoG8OCPaH2HmTY3XNpQNRLJR5GFWwVriIBDe+GyVjtjzb1/BLdu0WJatv6/PYMsEfArYBgnQ/bHYgfFLF0GPq6nBGJbngytv7C5crBljZAvnC86HQN5sGPbZWfkKdvoG5MbbJYwqFvaD2BEjlXMurbCX4ERrRUHC9875XufaCvdpCiSWaU4S5PM8nr2QCF3co0EtL0bkiciyv95eU0HoQ3cYhPNGwUMxntPp/3z0KRqeSBHPnvV5pmXOwP/xUHxEIvDbqCXtTc3y96iDKZ1T8+jPH1aif6ooVUwmogTHDd1DcW+APtMkqRHdZ7r33wKAYJfNopd+0P8rYF2w==
      
      







完成した構成ファむルの䟋を以䞋に衚瀺できたす。



group_vars / all.yml
 certs: ca: password: "12345" docker_swarm: # docker run --rm swarm create token: "6856663cdefdec325839a4b7e1de38e8" manager: "188.166.16.70" ssh: users: # user for ansible - user: "support" shell: "/bin/zsh" # for oh-my-zsh groups: "sudo" # mkpasswd --method=SHA-512 password: "$6$n0lQGWy2s5437ns1$nczULrrTw5r.TmhEI/xBz5xYEHWyMbtbQhAJoWshv0rFjSoRxLYZh0zDoMwVM.ZFnChx7ym.4.r182EOIn9Ec/" # cat ~/.ssh/id_rsa.pub key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDDakR6/NJuIxJGpWZiV5QODuRacuh4VoIdzeOUlH+MC1xxFf/U74gfumoQ1k62d4S0qPqnlpJVqRNg7mQo0CCguujVRuOP+FbRMjdQbbAEfDAjxkSuKXRWnChg6Ds4MX0RO9WUB9pQLrCmbPpI8A0l0zaNi6mp6TaXWCoMPrgk1OfuTYDBTgQya/MtKjjPnWFEdgwTvB3hVusCU83854Gju9OX4I5ucejy/f8/IWGUIFt8miLisrYnDcdFvY/ThzX7E2h4lzsc8JK6ltywyoHVScl3Vdgf1/WbScEnQYWJZk/h2zWDqdFlte/elov7l3yfJDN0axF+dC6BqJGfZMFQsN6xPWHoG8OCPaH2HmTY3XNpQNRLJR5GFWwVriIBDe+GyVjtjzb1/BLdu0WJatv6/PYMsEfArYBgnQ/bHYgfFLF0GPq6nBGJbngytv7C5crBljZAvnC86HQN5sGPbZWfkKdvoG5MbbJYwqFvaD2BEjlXMurbCX4ERrRUHC9875XufaCvdpCiSWaU4S5PM8nr2QCF3co0EtL0bkiciyv95eU0HoQ3cYhPNGwUMxntPp/3z0KRqeSBHPnvV5pmXOwP/xUHxEIvDbqCXtTc3y96iDKZ1T8+jPH1aif6ooVUwmogTHDd1DcW+APtMkqRHdZ7r33wKAYJfNopd+0P8rYF2w=="
      
      







これで、埅望のクラりドの構築を開始する準備ができたした。



 » ansible-playbook -i stage site.yml -u root
      
      





ルヌト認蚌機胜をオフにし、 サポヌトナヌザヌも远加したため  これはAnsibleスクリプトで説明されおいたす、以降のすべおの起動は-s  sudo および-Kフラグ sudoのパスワヌドを芁求する で実行する必芁がありたす



 » ansible-playbook -i stage site.yml -u support -s -K
      
      







怜蚌ず䜿甚



新しく䜜成したクラりドをテストする準備ができたした。



 » docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem info Containers: 4 Images: 3 Storage Driver: Role: primary Strategy: spread Filters: affinity, health, constraint, port, dependency Nodes: 3 debian1: 188.166.16.70:2376 └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 519.2 MiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux stretch/sid, storagedriver=aufs debian2: 188.166.99.31:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 519.2 MiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux stretch/sid, storagedriver=aufs debian3: 128.199.59.102:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 519.2 MiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux stretch/sid, storagedriver=aufs Execution Driver: Kernel Version: Operating System: CPUs: 3 Total Memory: 1.521 GiB Name: ID: Http Proxy: Https Proxy: No Proxy:
      
      





やった 私はこの倧きな蚘事をほが終了し、クラりドの構築を正垞に完了したした。



必芁な堎合は、Dockerホストのいずれかに個別に接続できたす。



䟋
 » docker -H tcp://128.199.59.102:2376 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem info Containers: 2 Images: 7 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 11 Dirperm1 Supported: true Execution Driver: native-0.2 Kernel Version: 3.16.0-4-amd64 Operating System: Debian GNU/Linux stretch/sid CPUs: 1 Total Memory: 494.5 MiB Name: debian1 ID: 5XPE:2VWX:QCSA:J3PJ:WMN7:EDXX:3TSS:7K7K:XU4R:Z3AX:TRVX:VTUQ WARNING: No memory limit support WARNING: No swap limit support
      
      







しかし、私たちはこれたでずっず行きたせんでしたね クラりドでNginxのいく぀かのむンスタンスを実行しおみたしょう。



 » docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem run -d -p 80:80 --name nginx1 nginx bb49018b697fca975d10a5ec31ad2fed65ed12b3ad8fbd61e64474187d8bc6ed » docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem run -d -p 80:80 --name nginx2 nginx 2bd86ff97c35d431e9db7f0571d65e17893aefd1d18b1b52194c100a22a49937
      
      







私たちはチェックしたす

Nginx



Nginxのむンスタンスをさらに2぀実行しおみたしょう。



 » docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem run -d -p 80:80 --name nginx3 nginx 622b4e199c700cae663bf2e2f326918f94a0cd016c27dc9ff39f4ec4abf7bdb1 » docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem run -d -p 80:80 --name nginx4 nginx FATA[0001] Error response from daemon: unable to find a node with port 80 available
      
      





3番目のむンスタンスは開始されたしたが、4番目のむンスタンスは開始されたせんでした。FATA[0001]デヌモンからの゚ラヌ応答ポヌト80が䜿甚可胜なノヌドが芋぀かりたせん 。 Docker Swarm Schedulerは、空き80番目のポヌトを持぀ホストがないこずを確認したす。



クラスタで珟圚実行されおいるコンテナを確認し、Nginxの各コピヌが異なるマシンで実行されおいるこずを確認できたす。



 » docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem ps 1 ↵ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 622b4e199c70 nginx:latest "nginx -g 'daemon of 5 minutes ago Up 5 minutes 128.199.59.102:80->80/tcp, 443/tcp debian3/nginx3 2bd86ff97c35 nginx:latest "nginx -g 'daemon of 16 minutes ago Up 16 minutes 188.166.16.70:80->80/tcp, 443/tcp debian1/nginx2 bb49018b697f nginx:latest "nginx -g 'daemon of 17 minutes ago Up 17 minutes 188.166.99.31:80->80/tcp, 443/tcp debian2/nginx1 148eef0bbe02 library/swarm:latest "/swarm manage --tls 2 hours ago Up 2 hours 188.166.16.70:8000->2375/tcp debian1/docker-swarm-manager 3545322d27b7 library/swarm:latest "/swarm join --addr= 2 hours ago Up 2 hours 2375/tcp debian2/docker-swarm faaa78cbedba library/swarm:latest "/swarm join --addr= 2 hours ago Up 2 hours 2375/tcp debian3/docker-swarm 0fee12f6a473 library/swarm:latest "/swarm join --addr= 2 hours ago Up 2 hours 2375/tcp debian1/docker-swarm
      
      





Docker Swarmの可胜性はそこで終わりではなく、始たるだけです これはここずここで読むこずができたす 。



蚘事の冒頭で曞いたように、私の目暙は、ツヌルのリストず共通理解を提䟛しお、䜕を基に構築するかを理解し、それが達成されるこずを願っおいたす。



次のパヌトでは、Service Discoveryずは䜕か、クラりドで負荷を分散する方法、およびそのためのツヌルに぀いお説明したす。



以䞊です。 ご枅聎ありがずうございたした。 あなたの雲ず幞運に安定



Twitterで私をフォロヌしおください。私はスタヌトアップでの仕事、私の間違いず正しい決断、Python、そしおWeb開発に関連するすべおに぀いお話しおいたす。



PS 䌚瀟で開発者を探しおいたす 。詳现は私のプロフィヌルにありたす 。



All Articles