Swarm、Kubernetes、NomadでDocker投祚を実行する方法

TL DR

この蚘事では、HashicorpのSwarm、Kubernetes、およびNomadに投祚するDockerアプリケヌションをデプロむしたす。 このすべおを詊しおみたのず同じくらい、この蚘事を読んで楜しんでください。



テクノロゞヌを䜿甚する堎合は、奜奇心が必芁です。 これは、珟堎で䜕が起こっおいるかを垞に孊び、最新の状態に保぀ために必芁です。 すべおが非垞に速く倉化したす。



コンテナオヌケストレヌションは議論の察象ずしお非垞にホットなトピックであるため、お気に入りの楜噚があったずしおも、他の楜噚がどのように機胜し、それらに぀いお新しいこずを孊ぶのは興味深いこずです。



投祚アプリ



以前の蚘事で投祚アプリを䜿甚したした。 アプリケヌションはマむクロサヌビスアヌキテクチャで実行され、5぀のサヌビスで構成されおいたす。 画像





githubリポゞトリにあるように、アプリケヌションにはいく぀かの構成ファむルがありたす https : //github.com/dockersamples/example-voting-app



Docker-stack.yml-アプリケヌションの本番プレれンテヌションで䜿甚する準備ができたした。 ファむル自䜓は次のずおりです。



version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager] vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: [node.role == manager] visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: frontend: backend: volumes: db-data:
      
      





通垞、このファむルには6぀のサヌビスがあり、アプリケヌションアヌキテクチャには5぀のサヌビスしかありたせん远加のサヌビスは、サヌビスが展開されおいる堎所を瀺すむンタヌフェむスを提䟛する優れたツヌルであるビゞュアラむザヌです。



Docker swarm



Docker Swarmは、Dockerコンテナヌのクラスタヌを管理および䜜成するためのツヌルです。 管理者ず開発者は、Swarmを䜿甚しお、ノヌドのクラスタヌを単䞀の仮想システムずしお䜜成および管理できたす。



Swarmコンポヌネント



Swarmクラスタヌはいく぀かのノヌドで構成され、䞀郚はマネヌゞャヌずしお機胜し、他ぱグれキュヌタヌずしお機胜したす。





画像



マネヌゞャヌは、内郚分散ストレヌゞを共有しお、䞀貫したクラスタヌ状態を維持したす。 これは、Raftログによっお確認されたす。



Swarmでは、サヌビスはアプリケヌションのデプロむ方法ずコンテナ内での動䜜方法を定矩したす。



Dockerをむンストヌルする



Dockerがただむンストヌルされおいない堎合は、OS甚のDocker CECommunity Editionをダりンロヌドできたす 。



Swarmを䜜成する



Dockerをむンストヌルするず、1぀のチヌムだけがSwarmの実行から私たちを分離したす



$ docker swarm init







Swarmクラスタヌに必芁なのはこれだけです。 これは単䞀ノヌドのクラスタヌですが、関連するすべおのプロセスを持぀クラスタヌのたたです。



アプリケヌションの展開



githubのアプリケヌションリポゞトリで利甚可胜な構成ファむルのうち、Swarmを介しおアプリケヌションをデプロむするにはdocker-stack.ymlが必芁です。



 $ docker stack deploy -c docker-stack.yml app Creating network app_backend Creating network app_default Creating network app_frontend Creating service app_visualizer Creating service app_redis Creating service app_db Creating service app_vote Creating service app_result Creating service app_worker
      
      





スタックはポピヌのドッカヌで実行されおいるため、ロヌカルマシンからすぐにアプリケヌションにアクセスできたす。 投祚むンタヌフェヌスポヌト5000を䜿甚しお猫たたは犬を遞択し、ポヌト5001で結果を確認できたす。



画像画像



ここでは詳现に立ち入らず、Swarmを䜿甚しおアプリケヌションを簡単にデプロむできるこずを瀺したかっただけです。



耇数のノヌドを䜿甚しおSwarmを介しおアプリケヌションをデプロむする方法の詳现な説明が必芁な堎合は、 この蚘事を読むこずができたす。



クベルネテス



Kubernetesは、コンテナ化されたアプリケヌションの展開、スケヌリング、および管理を自動化するためのオヌプン゜ヌスプラットフォヌムです。



Kubernetes Concept



Kubernetesクラスタヌは、1぀以䞊のマスタヌずノヌドで構成されたす。





画像



コマンドを入力するには、kubectl CLIを䜿甚したす。 以䞋では、いく぀かの䜿甚䟋を怜蚎したす。



アプリケヌションのデプロむ方法を理解するには、いく぀かの高レベルのKubernetesオブゞェクトに぀いお知る必芁がありたす。





このパヌトでは、アプリケヌションサヌビスごずに展開ずサヌビスを䜿甚したす。



kubectlをむンストヌルする



Kubectlは、Kubernetesでアプリケヌションを展開および管理するためのコマンドラむンです。





むンストヌルには、公匏ドキュメントhttps://kubernetes.io/docs/tasks/tools/install-kubectl/を䜿甚したす。 たずえば、Macにむンストヌルするには、次のコマンドを入力したす。



$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl

$ chmod +x ./kubectl

$ sudo mv ./kubectl /usr/local/bin/kubectl








ミニキュヌブのむンストヌル



MinicubeはKubenetesの包括的な蚭定です。 ロヌカルVMを䜜成し、すべおのKubernetesプロセスが実行されおいるノヌドクラスタヌを起動したす。 間違いなく、これは運甚クラスタをむンストヌルするために䜿甚すべきツヌルではありたせんが、開発ずテストに䜿甚するず本圓に䟿利です。



Minicubeをむンストヌルするず、1぀のノヌドでクラスタヌをむンストヌルするために必芁なコマンドは1぀だけです。



$ minikube start

Starting local Kubernetes v1.7.0 cluster


Starting VM


Downloading Minikube ISO

97.80 MB / 97.80 MB [==============================================] 100.00% 0s

Getting VM IP address


Moving files into cluster


Setting up certs


Starting cluster components


Connecting to cluster


Setting up kubeconfig


Kubectl is now configured to use the cluster.








蚘述子Kubernetes



Kubernetesでは、 Deploymentによっお制埡されるReplicaSetを介しおコンテナヌが起動されたす。

以䞋はDeploymentを説明する.ymlファむルの䟋です。 ReplicaSetは、2぀のNginxレプリカの起動を提䟛したす。



 // nginx-deployment.yml apiVersion: apps/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 # tells deployment to run 2 pods matching the template template: # create pods using pod definition in this template metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
      
      





展開を䜜成するには、kubectl CLIを䜿甚する必芁がありたす。



マむクロサヌビスで構成されるアプリケヌションを䜜成するには、サヌビスごずに展開ファむルを䜜成する必芁がありたす。 これは手動で行うこずも、 Komposeを䜿甚するこずもできたす。



Komposeを䜿甚しおデプロむメントずサヌビスを䜜成する



Komposeは、Docker構成ファむルをKubernetesが䜿甚する蚘述子ファむルに倉換するツヌルです。 このサヌビスの方が䟿利で、移行プロセスを高速化したす。



泚

Komposeはオプションで、すべおを手動で䜜成できたすが、展開プロセスを倧幅に高速化したす





# Linux

$ curl -L https://github.com/kubernetes/kompose/releases/download/v1.0.0/kompose-linux-amd64 -o kompose

# macOS

$ curl -L https://github.com/kubernetes/kompose/releases/download/v1.0.0/kompose-darwin-amd64 -o kompose



$ chmod +x kompose

$ sudo mv ./kompose /usr/local/bin/kompose








Komposeでdocker -stack.ymlを開始する前に、少し倉曎しお各サヌビスのデプロむキヌを削陀したす。 このキヌは認識されないため、蚘述子ファむルの生成時に゚ラヌが発生する堎合がありたす。 ネットワヌクに関する情報を削陀するこずもできたす。 Komposeでは、docker -stack-k8s.ymlを呌び出す新しいファむルを提䟛したす。



 version: "3" services: redis: image: redis:alpine ports: - "6379" db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 depends_on: - redis result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 depends_on: - db worker: image: dockersamples/examplevotingapp_worker visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" volumes: db-data:
      
      





docker-stack-k8s.ymlファむルから、次のコマンドを䜿甚しおアプリケヌションの蚘述子を生成したす。



$ kompose convert --file docker-stack-k8s.yml

WARN Volume mount on the host "/var/run/docker.sock" isn't supported - ignoring path on the host

INFO Kubernetes file "db-service.yaml" created

INFO Kubernetes file "redis-service.yaml" created

INFO Kubernetes file "result-service.yaml" created

INFO Kubernetes file "visualizer-service.yaml" created

INFO Kubernetes file "vote-service.yaml" created

INFO Kubernetes file "worker-service.yaml" created

INFO Kubernetes file "db-deployment.yaml" created

INFO Kubernetes file "db-data-persistentvolumeclaim.yaml" created

INFO Kubernetes file "redis-deployment.yaml" created

INFO Kubernetes file "result-deployment.yaml" created

INFO Kubernetes file "visualizer-deployment.yaml" created

INFO Kubernetes file "visualizer-claim0-persistentvolumeclaim.yaml" created

INFO Kubernetes file "vote-deployment.yaml" created

INFO Kubernetes file "worker-deployment.yaml" created








各サヌビスに぀いお、展開ファむルずサヌビスが䜜成されるこずがわかりたす。

譊告は1぀だけ受け取りたした。 Docker゜ケットに接続できないため、 ビゞュアラむザヌず接続されたす。 このサヌビスの開始は詊みたせんが、残りに焊点を合わせたす。



アプリケヌションの展開



kubectlを䜿甚しお、蚘述子ファむルで指定されたすべおのコンポヌネントを䜜成したす。 ファむルが珟圚のフォルダヌにあるこずを瀺したす。



$ kubectl create -f .

persistentvolumeclaim "db-data" created

deployment "db" created

service "db" created

deployment "redis" created

service "redis" created

deployment "result" created

service "result" created

persistentvolumeclaim "visualizer-claim0" created

deployment "visualizer" created

service "visualizer" created

deployment "vote" created

service "vote" created

deployment "worker" created

service "worker" created

unable to decode "docker-stack-k8s.yml":...








泚倉曎した構成ファむルを珟圚のフォルダヌに残したため、解析できないため゚ラヌが発生したした。 しかし、この間違いはリスクなしで無芖できたす。



これらのコマンドを䜿甚するず、䜜成されたサヌビスずデプロむメントを確認できたす。

画像



倖の䞖界からアプリケヌションにアクセスできるようにしたす



投祚ず結果のむンタヌフェヌスにアクセスするには、それらのために䜜成されたサヌビスをわずかに倉曎する必芁がありたす。



投祚甚に生成された蚘述子は次のずおりです。



 apiVersion: v1 kind: Service metadata: creationTimestamp: null labels: io.kompose.service: vote name: vote spec: ports: - name: "5000" port: 5000 targetPort: 80 selector: io.kompose.service: vote status: loadBalancer: {}
      
      





サヌビスのタむプを倉曎し、 ClusterIPをNodePortに眮き換えたす。 ClusterIPはサヌビスを内郚で利甚可胜にし、 NodePortはポヌトをクラスタヌの各ノヌドで公開し、䞖界䞭で利甚できるようにしたす。 投祚ず結果の䞡方に倖郚からアクセスできるようにするため 、 resultに察しおも同じこずを行いたす。



 apiVersion: v1 kind: Service metadata: labels: io.kompose.service: vote name: vote spec: type: NodePort ports: - name: "5000" port: 5000 targetPort: 80 selector: io.kompose.service: vote
      
      





䞡方のサヌビス 投祚ず結果 に倉曎を加えたら、それらを再䜜成できたす。



$ kubectl delete svc vote

$ kubectl delete svc result

$ kubectl create -f vote-service.yaml

service "vote" created

$ kubectl create -f result-service.yaml

service "result" created








アプリケヌションぞのアクセス



次に、 投祚および結果サヌビスの詳现を取埗し、それらが提䟛するポヌトを取埗したす。

画像



投祚はポヌト30069で利甚でき、 結果は31873です。今床は投祚しお結果を確認したす。

画像画像



Kubernetesの基本コンポヌネントを理解した埌、アプリケヌションを簡単にデプロむできたした。 Komposeは私たちを倧いに助けおくれたした。



ハシコヌプの遊牧民



Nomadは、マシンのクラスタヌを管理し、それらでアプリケヌションを実行するためのツヌルです。 マシンずアプリケヌションホストを抜象化し、ナヌザヌが実行したいこずを蚀うこずができるようにしたす。 そしお、Nomadは、それがどこでどのように起動されるかに぀いお責任を負いたす。



ノマドコンセプト



Nomadクラスタヌは、 サヌバヌ サヌバヌモヌドたたはクラむアント クラむアントモヌドで動䜜できる゚ヌゞェントで構成されおいたす。





画像



Nomadクラスタヌでは、いく぀かのタむプのタスクを起動できたす。



アプリケヌションをデプロむするには、Nomadの基本抂念を理解する必芁がありたす。





蚭眮



この䟋では、Docker Machineを䜿甚しお䜜成されたDockerホストでアプリケヌションを実行したす。 ロヌカルIP-192.168.1.100。 たず、Consulを実行したす。Consulは、サヌビスの怜出ず登録に䜿甚されたす。 Nomadを起動し、アプリケヌションをJob in Nomadずしおデプロむしたす。



サヌビスの登録ず発芋のための領事



サヌビスを怜出しお登録するには、NomadのJobのように機胜しないConsulなどのツヌルをお勧めしたす。 領事はリンクからダりンロヌドできたす。



このコマンドは、Consulサヌバヌをロヌカルで起動したす。



$ consul agent -dev -client=0.0.0.0 -dns-port=53 -recursor=8.8.8.8







䜿甚されるオプションを詳しく芋おみたしょう。



Nomadはこのリンクからダりンロヌドできたす。



ノヌドを持぀クラスタヌを䜜成する



Nomadをダりンロヌドしたら、次の蚭定で゚ヌゞェントを起動できたす。



 // nomad.hcl bind_addr = "0.0.0.0" data_dir = "/var/lib/nomad" server { enabled = true bootstrap_expect = 1 } client { enabled = true network_speed = 100 }
      
      





゚ヌゞェントはサヌバヌずクラむアントの䞡方ずしお機胜したす。 bind_addrは、タスクを倖郚から受け入れるこずができるように、どのむンタヌフェむスでも動䜜する必芁があるこずを指摘したす。 次の蚭定でNomad Agentを起動したす。



$ nomad agent -config=nomad.hcl

==> WARNING: Bootstrap mode enabled! Potentially unsafe operation.

Loaded configuration from nomad-v2.hcl

==> Starting Nomad agent...

==> Nomad agent configuration:

Client: true

Log Level: INFO

Region: global (DC: dc1)

Server: true

Version: 0.6.0

==> Nomad agent started! Log data will stream in below:








泚デフォルトでは、NomadはロヌカルのConsulむンスタンスに接続したす。

単䞀ノヌドクラスタヌをむンストヌルしたした。 䞀意のメンバヌに関する情報は次のずおりです。



$ nomad server-members

Name Address Port Status Leader Protocol Build Datacenter Region

neptune.local.global 192.168.1.100 4648 alive true 2 0.6.0 dc1 global








アプリケヌションの展開



Swarmを䜿甚しおアプリケヌションをデプロむするには、すぐに構成ファむルを䜿甚できたす。 Kubernetesを介しおデプロむするには、同じ構成ファむルからの蚘述子が必芁です。 これはすべお、Nomadを通じおどのように行われたすか



たず、Kompose for Hashicorpに䌌たツヌルはありたせん。そのため、コンマのNomadぞの移行を簡単にするこずができたすちなみに、オヌプン゜ヌスプロゞェクトにずっおは良い考えです。 Jobs 、 groups 、 tasksを蚘述するファむルは手動で䜜成する必芁がありたす。



これに぀いおは、 RedisおよびVoteサヌビスのゞョブに぀いお説明する際に詳しく芋おいきたす。 他のサヌビスに぀いおは、このようになりたす。



Redisのゞョブの定矩



このファむルは、アプリケヌションのRedisの䞀郚を定矩したす。



 // redis.nomad job "redis-nomad" { datacenters = ["dc1"] type = "service" group "redis-group" { task "redis" { driver = "docker" config { image = "redis:3.2" port_map { db = 6379 } } resources { cpu = 500 # 500 MHz memory = 256 # 256MB network { mbits = 10 port "db" {} } } service { name = "redis" address_mode = "driver" port = "db" check { name = "alive" type = "tcp" interval = "10s" timeout = "2s" } } } } }
      
      





ここに䜕が曞かれおいるか芋おみたしょう





ゞョブが正しく実行されるかどうかを確認するには、 planコマンドを䜿甚したす。



 $ nomad plan redis.nomad + Job: "nomad-redis" + Task Group: "cache" (1 create) + Task: "redis" (forces create) Scheduler dry-run: - All tasks successfully allocated. Job Modify Index: 0 To submit the job with version verification run: nomad run -check-index 0 redis.nomad When running the job with the check-index flag, the job will only be run if the server side version matches the job modify index returned. If the index has changed, another user has modified the job and the plan's results are potentially invalid.
      
      





すべおが機胜しおいるようです。 次に、このゞョブを䜿甚しおタスクを展開したす。



 $ nomad run redis.nomad ==> Monitoring evaluation "1e729627" Evaluation triggered by job "nomad-redis" Allocation "bf3fc4b2" created: node "b0d927cd", group "cache" Evaluation status changed: "pending" -> "complete" ==> Evaluation "1e729627" finished with status "complete"
      
      





プレヌスメントが䜜成されたこずがわかりたす。 圌のステヌタスを確認しおください



 $ nomad alloc-status bf3fc4b2 ID = bf3fc4b2 Eval ID = 1e729627 Name = nomad-redis.cache[0] Node ID = b0d927cd Job ID = nomad-redis Job Version = 0 Client Status = running Client Description = <none> Desired Status = run Desired Description = <none> Created At = 08/23/17 21:52:03 CEST Task "redis" is "running" Task Resources CPU Memory Disk IOPS Addresses 1/500 MHz 6.3 MiB/256 MiB 300 MiB 0 db: 192.168.1.100:21886 Task Events: Started At = 08/23/17 19:52:03 UTC Finished At = N/A Total Restarts = 0 Last Restart = N/A Recent Events: Time Type Description 08/23/17 21:52:03 CEST Started Task started by client 08/23/17 21:52:03 CEST Task Setup Building Task Directory 08/23/17 21:52:03 CEST Received Task received by client
      
      





コンテナは正しく起動されおいたす。 Consul DNSサヌバヌをチェックしお、サヌビスも正しく登録されおいるこずを確認したしょう。



 $ dig @localhost SRV redis.service.consul ; <<>> DiG 9.10.3-P4-Ubuntu <<>> @localhost SRV redis.service.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35884 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;redis.service.consul. IN SRV ;; ANSWER SECTION: redis.service.consul. 0 IN SRV 1 1 6379 ac110002.addr.dc1.consul. ;; ADDITIONAL SECTION: ac110002.addr.dc1.consul. 0 IN A 172.17.0.2 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Aug 23 23:08:36 CEST 2017 ;; MSG SIZE rcvd: 103
      
      





タスクはIP 172.17.0.2によっおホストされ、そのポヌトは先に瀺したように6379です。



投祚のための仕事の定矩



投祚サヌビスのゞョブを定矩したす。 次のファむルを䜿甚したす。



 // job.nomad job "vote-nomad" { datacenters = ["dc1"] type = "service" group "vote-group" { task "vote" { driver = "docker" config { image = "dockersamples/examplevotingapp_vote:before" dns_search_domains = ["service.dc1.consul"] dns_servers = ["172.17.0.1", "8.8.8.8"] port_map { http = 80 } } service { name = "vote" port = "http" check { name = "vote interface running on 80" interval = "10s" timeout = "5s" type = "http" protocol = "http" path = "/" } } resources { cpu = 500 # 500 MHz memory = 256 # 256MB network { port "http" { static = 5000 } } } } } }
      
      





ただし、Redisに䜿甚したファむルずはいく぀かの違いがありたす。





 // app.py def get_redis(): if not hasattr(g, 'redis'): g.redis = Redis(host="redis", db=0, socket_timeout=5) return g.redis
      
      





この堎合、 redisを䜿甚しおIPコンテナヌを取埗するには 、 投祚の あるコンテナヌがConsul DNSサヌバヌを䜿甚する必芁がありたす。 コンテナからのDNSク゚リは、Dockerブリッゞ172.17.0.1を介しお実行されたす。 dns_search_domainsは、サヌビスXがConsul内のX.service.dc1.consulずしお登録されおいるこずを刀別したす





他のサヌビスに察しお同じ蚭定を行うこずができたすworker、postgres、result。



アプリケヌションぞのアクセス



すべおのゞョブが実行されおいる堎合、ゞョブのステヌタスを確認し、すべおが機胜するこずを確認できたす。



画像



これは、Consulむンタヌフェヌスでも芋るこずができたす。



画像



IPノヌドこの䟋では192.168.1.100 により 、 voteおよびresultを䜿甚しおむンタヌフェヌスにアクセスできたす。



たずめ



ここに、そのような投祚投祚がデモンストレヌションの面で玠晎らしいアプリケヌションです。 オヌケストラを䜿甚しおコヌドを倉曎せずに展開できるかどうかを知りたいず思いたした。 はい、タンバリンずの特別なダンスがなくおもできたす。



この蚘事がSwarm、Kubernetes、Nomadの基本を理解するのに圹立぀こずを願っおいたす。 たた、Dockerで起動しおいるものずオヌケストラの䜿甚方法を知るこずも興味深いでしょう。



All Articles