主夫ときどきプログラマ

データベース、Webエンジニアリング、コミュニティ、etc

Compose on Kubrenetes を使ってみる

Kubernetes を使うはじめのステップとして Compose on Kubernetes を使って試しに動かしてみた。

結果的に「DockerとKubernetesへの理解がまだまだ浅いので、本買ってちゃんと読んだほうがいい」とわかった。

試し終わったあと Docker/Kubernetes 実践コンテナ開発入門 を購入して勉強してます。おすすめ。

ついでに 入門 監視 も買ってしまった。A5サイズ200ページほどで読んでておもしろい。これもおすすめ。

Compose on Kubernetes とは

Docker社がオフィシャルに開発しているツールで Docker Compose ファイル (docker-compose.yml) を Kubernetes cluster にデプロイしてくれるもの。 Kuberetes でインフラを構築するにはそれ用の設定ファイルを幾つか用意する必要があるが、Compose on Kubernetes を使えば docker-compose.yml をそのままKuberetes で動かせられるよ、というもの。

すでに Docker Compose を使ってコンテナを動かしていて、これからKubernetesを使ってみようかな、という人におすすめらしい。

公式ページ のドキュメントが少なく日本語情報も少ないので、動かすのがちょっと大変だった。

Mac で動かす方法

環境のセットアップ

当然ながら Docker Desktop for Mac がインストールされている必要がある。 インストールされていると右上のステータスバーにクジラのアイコンがあって、ここからDockerの設定パネルを開く。 Enable Kubernetes にチェックを入れると、Kubernetesのインストールが始まる。しばらく時間がかかる。

f:id:masayuki14:20190419155144p:plain
Kubernetesのインストール

インストールが終わるとフッターに Kubernetes is running が表示されステータスがグリーンになり、利用可能となる。

kubectl コマンドが使えるようになり、動作を確認できる。

% kubectl api-versions | grep compose
compose.docker.com/v1beta1
compose.docker.com/v1beta2

デプロイしてみる

デプロイはローカルにインストールされた Kubernetesdocker-compose.yml を使ってコンテナを起動させるというもの。 サンプルにある内容で docker-compose.yml を作る。

version: '3.3'

services:

  db:
    build: db
    image: dockersamples/k8s-wordsmith-db

  words:
    build: words
    image: dockersamples/k8s-wordsmith-api
    deploy:
      replicas: 5

  web:
    build: web
    image: dockersamples/k8s-wordsmith-web
    ports:
     - "33000:80"

改めて見ると deploy: replica: 5 という項目がある。普段 Docker Compose を使うときには指定しない項目。 Kubernetesのための拡張なのか、Docker Composeにもともとあるのか、Docker Swarm の項目なのかわからんので、気が向いたら調べる。 ただ、この実行したらわかるけど、Podとして words コンテナが5台起動してるので、そういう設定のものらしい。

$ docker stack deploy --orchestrator=kubernetes -c docker-compose.yml hellokube

docker stack コマンドでデプロイできる。オーケストレーターに kubernetes を使って hellokube という STACK名でデプロイする。 公式ドキュメントはここまでで、この後どうしていいかわからないので気をつけましょう。

コマンドを実行するとこうなった。

Ignoring unsupported options: build

service "words": build is ignored
service "web": build is ignored
service "db": build is ignored
Waiting for the stack to be stable and running...
db: Ready       [pod status: 1/1 ready, 0/1 pending, 0/1 failed]
adminer: Failed     [pod status: 0/0 ready, 0/0 pending, 0/0 failed]
web: Ready      [pod status: 1/1 ready, 0/1 pending, 0/1 failed]
words: Ready        [pod status: 5/5 ready, 0/5 pending, 0/5 failed]

ブラウザからコンテナにアクセス

docker-compose.yml にあるように http://localhost:33000 にアクセスできる。

f:id:masayuki14:20190419164146p:plain

docker stack コマンド

今回はじめて使ったコマンドなのでなんのコマンドかわからなかったのでヘルプをみる。困ったときのヘルプ。

$ docker stack help

Usage:  docker stack [OPTIONS] COMMAND

Manage Docker stacks

Options:
      --kubeconfig string     Kubernetes config file
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)

Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

Run 'docker stack COMMAND --help' for more information on a command.

rm で停止できそう。

コマンドで状態をみたり停止したり

コンテナのリストや状態を docker stack コマンドで確認できます。 別途 kubectl get all など kubectl コマンドも使える模様。

$  docker stack ls --orchestrator=kubernetes
NAME                SERVICES            ORCHESTRATOR        NAMESPACE
hellokube           3                   Kubernetes          default

$ docker stack ps --orchestrator=kubernetes hellokube
ID                  NAME                               IMAGE                             NODE                 DESIRED STATE       CURRENT STATE          ERROR               PORTS
a02c17eb-60c        hellokube_db-79b45689db-p5bsh      dockersamples/k8s-wordsmith-db    docker-for-desktop   Running             Running 21 hours ago
a026f294-60c        hellokube_web-6b56cf97b9-9kpwj     dockersamples/k8s-wordsmith-web   docker-for-desktop   Running             Running 21 hours ago                       *:0->80/tcp
a038f9bf-60c        hellokube_words-6d654698d5-5dvcl   dockersamples/k8s-wordsmith-api   docker-for-desktop   Running             Running 21 hours ago
a0393b47-60c        hellokube_words-6d654698d5-jbpvc   dockersamples/k8s-wordsmith-api   docker-for-desktop   Running             Running 21 hours ago
a02f6edf-60c        hellokube_words-6d654698d5-k5ffg   dockersamples/k8s-wordsmith-api   docker-for-desktop   Running             Running 21 hours ago
a0342f61-60c        hellokube_words-6d654698d5-kvx2k   dockersamples/k8s-wordsmith-api   docker-for-desktop   Running             Running 21 hours ago
a0342102-60c        hellokube_words-6d654698d5-ssldw   dockersamples/k8s-wordsmith-api   docker-for-desktop   Running             Running 21 hours ago

$ docker stack services --orchestrator=kubernetes hellokube
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
a03132da-60c        hellokube_db        replicated          0/0                 dockersamples/k8s-wordsmith-db
a03132da-60c        hellokube_db        replicated          0/0                 mysql:8.0
a041e664-60c        hellokube_web       replicated          1/1                 dockersamples/k8s-wordsmith-web   *:33000->80/tcp
a04bdfa0-60c        hellokube_words     replicated          5/5                 dockersamples/k8s-wordsmith-api

コンテナの停止方法。これは公式ドキュメントにないので困った。

$ docker stack rm --orchestrator=kubernetes hellokube
Removing stack: hellokube

とりあえず止められた。良かった。

参考文献

公式ドキュメントは リポジトリの /docs にあるので読んだらいいことあるかもしれない。

Docker blog でも紹介されていて、日本語訳記事もあるので、概要を理解するのに役立つ。

似たようなものに Kompose というものもあり、同じように docker-compose.yml を使ってKubernetesにデプロイできる。

感想

やっぱりちゃんと本読んだほうがいいよね!

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門