「Rio」- 古き良きDockerのUXをモダンなクラウドネイティブソフトウェア達に

Twitterにて「Rio」のデモ動画が発表された

つい先日(2018/8/7)、TwitterにてRancher社のDarren Shepherd氏がRioというプロダクトのデモ動画を発表してました。

前々から氏のツイートなどでRioの開発をしてる旨を匂わせていましたがいよいよ動く段階まできたようです。

Rancher 2.0の開発もまだまだ継続してる中、新しいプロダクトはしばらく先じゃないかと思ってましたが 思っていたより早い段階で動く姿を見れたので結構驚きました。

もうGitHubからダウンロードできる状態でしたので早速動かしてみました。

注: 以降は先のデモ動画の内容をなぞっていっただけのものです。 動画を見た方は多分この先読まなくてOKです。

Rio」って何?

Rancher社が開発している、新しいコンテナツールとのことです。

rancher/rio

READMEでは以下のように紹介されています。

  • Simple, fun, end-to-end container experience
  • Cloud Native Container Distribution

Rio is a user oriented end-to-end container solution with a focus on keeping containers simple and combating the current trend of complexity.
It's kept fun and simple through it's familiar and opinionated user experience.
Additionally, Rio is a "Cloud Native Container Distribution" meaning is includes builtin Cloud Native technologies such as Kubernetes, Istio, Containerd, etc.
so that the user need not be an expert in installing, using, and maintaining these system.

Cloud Native Container Distributionと掲げており、KubernetesやIstioをはじめとするCloud Nativeなプロダクトの組み合わせを シンプルなフロントエンドを通じて利用できるようになっています。

どんなプロダクトが含まれるかはデモ動画の中で紹介されていました(もちろんGitHub上にも書かれてます)。

f:id:febc_yamamoto:20180808195344p:plain

現在は基本となるコンテナランタイム(containerd)、オーケストレーション(kubernetes)、ネットワーク(flannel)、サービスメッシュ(istio)が組み込まれており、 今後はストレージ関連としてRancher社のLonghorn、モニタリングにPrometheus、イメージのビルドにBuildKit、イメージスキャンにCoreOSのClairなども組み込む予定のようです。

ということで早速動かしてみます。

Rioのインストール

Rioは既存のKubernetes(laptopの場合はMinikube or Docker for Win/Mac推奨とのこと)、またはLinux(4.x+)で動作するとのことです。

Prerequisites: If you want to run this on your laptop, then Minikube or Docker for Mac/Windows is recommended. If you don't have those then you need to run a Linux VM (or Linux itself, come to the darkside). We will make this easier in the future. Otherwise you can run this easily with any modern Linux server, nothing is needed to be installed except the kernel.

今回はクラウド上に立てたUbuntuで動かしてみます。 Rio本体以外はインストールする必要はないのですが、内部の調査をしたい方はkubectlくらいは入れておくと便利です。

余談1: Linux上でスタンドアロンで動かした場合はembededなk8sを起動して動作する、Rancher 2.0などと同じような動きをしてました
余談2: Docker for Macで試してたのですが外部からのアクセスができない箇所があって調べるのめんどくさくなったのでUbuntuにしました

まずRioの実行ファイルをGitHubからダウンロードし展開しておきます。

rancher/rio リリースページ

# ダウンロードして
$ curl -LO https://github.com/rancher/rio/releases/download/v0.0.2/rio-v0.0.2-linux-amd64.tar.gz

# 展開して
$ tar zxvf rio-v0.0.2-linux-amd64.tar.gz 

# PATHの通った場所へ
$ sudo mv rio-v0.0.2-linux-amd64/rio /usr/local/bin/

続いてRioコンポーネント群を起動します。 今回はRioスタンドアロンで起動します。もし既存のKubernetesクラスタを利用する場合はGitHub上のREADMEを参照してください。

# Rioサーバの起動(embeded-k8sモード)
$ sudo rio server

少し待つとコンソール上に以下のようにログイン用のトークンが出力されるはずです。 これをコピペして実行しましょう。

INFO[0010] To use CLI: rio login -s https://133.242.228.115:7443 -t xxxxxxxxxxxx::admin:xxxxxxxxxxxxxxxx 
# 起動したRioサーバへログイン(先ほどの表示をコピペ)
$ rio login -s https://133.242.228.115:7443 -t xxxxxxxxxxxx::admin:xxxxxxxxxxxxxxxx 

なお、rioコマンドをrootユーザで実行する場合はrio loginは不要とのことです。 以降はrioコマンドで様々な操作が可能になっているはずです。

余談: Rioスタンドアロンで起動した場合のkubectlの使い方

=== 2018/8/8 追記
rio -hには出てこないですが、よく見たらrio kubectlというサブコマンドがあるっぽいです。
なのでわざわざkubectlをインストールしなくても良さそうですね。
=== 追記ここまで

Rioスタンドアロンで起動するとRancher 2.0などと同じくembededモードでk8sを起動して利用するようになってました。 この場合、/var/lib/rancher/rio/server/cred/kubeconfig.yamlにkubeconfigが出力されてますのでこれを使えばkubectlも使えるようになります。 Rioを使うのであればkubectlは不要ですがやっぱりIstioのCRがどうなってるの?とか気になりますよね?そんな方向けの設定です。

# embededモードで起動しているk8sに接続するためのkubeconfigを環境変数に指定
$ export KUBECONFIG=/var/lib/rancher/rio/server/cred/kubeconfig.yaml

# kubectlが使えるはず
$ kubectl get cs
NAME                 STATUS    MESSAGE   ERROR
scheduler            Healthy   ok        
controller-manager   Healthy   ok 

$ kubectl get nodes #なんかバージョン表示がバグってるし
NAME             STATUS    ROLES     AGE       VERSION
node-conf-test   Ready     <none>    10m       v0.0.0-master+$Format:%h$

Rioでコンテナを起動してみる

まずは動かしてみます。 docker runするような感覚でrio runを実行することでコンテナの起動が可能です。

$ rio run --name foobar nginx  # --nameは省略可能

起動したか確認してみます。確認はrio psを実行します。

$ rio ps

NAME      IMAGE     CREATED          SCALE     STATE     ENDPOINT   DETAIL
foobar    nginx     10 seconds ago   1         active               

何か起動してるっぽいですね。 RioではDockerCompose風にServiceという単位でコンテナ(群)を管理しています。

Service

The main unit that is being dealt with in Rio are services. Services are just a collection of containers that provide a similar function. When you run containers in Rio you are really creating a Scalable Service. rio run and rio create will create a service. You can later scale that service with rio scale. Services are assigned a DNS name so that group of containers can be accessed from other services.

rio psで表示されるのはServiceの一覧ということですね。 さらにrio psに引数としてサービス名を与えることで詳細を確認可能です。

# サービスの詳細を確認
$ rio ps foobar

NAME                      IMAGE     CREATED              NODE                 IP         STATE     DETAIL
foobar/7946c5787c-l49rk   nginx     About a minute ago   node-conf-test       10.1.0.8   running   

コンテナへのattachやexecも可能です。

# コンテナ内でbashを実行(--interactive + --ttyオプションを指定 = dockerと同じ)
$ rio exec -it foobar bash

# *** ここはコンテナ内 ***
root@foobar-7946c5787c-l49rk:/# 

# 以下のようにサービス名/コンテナ名まで指定してもOK
# rio exec -it foobar/7946c5787c-l49rk bash

次にスケールアウトしてみます。

$ rio scale foobar=3

# 確認
$ rio ps
NAME      IMAGE     CREATED         SCALE     STATE     ENDPOINT   DETAIL
foobar    nginx     3 minutes ago   3         active               

$ rio ps foobar
NAME                      IMAGE     CREATED          NODE                 IP          STATE     DETAIL
foobar/7946c5787c-qqdkr   nginx     21 seconds ago   node-conf-test       10.1.0.9    running   
foobar/7946c5787c-snclf   nginx     21 seconds ago   node-conf-test       10.1.0.10   running   
foobar/7946c5787c-l49rk   nginx     3 minutes ago    node-conf-test       10.1.0.8    running   

端々がDockerっぽいですね。 他にもinspectといったおなじみのコマンドもありますので詳細はrio -hを実行して確認してみてください。

次に進む前に一旦起動したサービスを削除しておきます。

$ rio rm foobar

注: 今回は説明を簡単にするためにWorkSpaceやStackといった概念をすっ飛ばしてます。 詳細はGitHub上のConceptsを確認しておいてください。

Rioでサービスメッシュを体験してみる

RioにはIstioが組み込まれており簡単に利用できるようになっているようです。 ここでは

  • ステージング環境のデプロイ
  • カナリアリリース
  • ステージング環境を本番にプロモート

という流れで進めてみます。

サービスの起動 + 外部への公開

まずはサービスを起動し外部からアクセス可能にします。 ここではRioのREADME.mdに乗っているサンプルであるibuildthecloud/demo:v1というイメージを利用してます。 このイメージはHTTPでアクセスするとHello Worldという文字列を返すという単純なものです。

# -p(publish) オプションで80番ポートを公開
$ rio run -p 80/http --name rio-demo --scale=3 ibuildthecloud/demo:v1

確認しておきます。

$ rio ps

NAME       IMAGE                    CREATED          SCALE     STATE     ENDPOINT                                          DETAIL
rio-demo   ibuildthecloud/demo:v1   32 seconds ago   3         active    http://rio-demo.default.cr2ch1.lb.rancher.cloud 

なんだかエンドポイントとしてhttp://rio-demo.default.cr2ch1.lb.rancher.cloudというのが割り当てられてますね。 これはRioが割り当ててくれたもので、ノードのIPアドレスに解決されるようになってます。

# ノードのIPアドレス(この例では133.242.228.115/24)
$ ip a show dev eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 9c:a3:ba:30:60:dd brd ff:ff:ff:ff:ff:ff
    inet 133.242.228.115/24 brd 133.242.228.255 scope global eth0
       valid_lft forever preferred_lft forever

       
# Aレコードを確認してみる
$ dig rio-demo.default.cr2ch1.lb.rancher.cloud. A

; <<>> DiG 9.10.3-P4-Ubuntu <<>> rio-demo.default.cr2ch1.lb.rancher.cloud. A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45513
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;rio-demo.default.cr2ch1.lb.rancher.cloud. IN A

;; ANSWER SECTION:
rio-demo.default.cr2ch1.lb.rancher.cloud. 60 IN A 133.242.228.115

;; Query time: 147 msec
;; SERVER: 133.242.0.3#53(133.242.0.3)
;; WHEN: Wed Aug 08 09:35:09 UTC 2018
;; MSG SIZE  rcvd: 85

エンドポイントのホスト名は<ServiceName>.<StackName>.<ClusterID>.<ROOT domain>となってます。
RootドメインRioスタンドアロンで起動した場合はlb.rancher.cloud、Docker for Macなどの場合は127.0.0.1.nip.ioが使われるようです。

この辺の処理は以下のあたりにありますので興味のある方はソース追ってみてください。

そしてRioが裏でIstioをいい感じに設定してくれるようになっており、このエンドポイントを使えばサービスにアクセスできるようになっています。

(Istioがどうなってるのか気になる方は記事の末尾の「おまけ: 段階ごとのkubectlなどの詳細」を参照してください)

起動したサービスにアクセスしてみる

ということで確認してみましょう。

$ curl -s http://rio-demo.default.cr2ch1.lb.rancher.cloud 
Hello World

無事にHello Worldと表示されるはずです。

ステージング環境のデプロイ

次にこのサービスを更新したイメージを用意し、ステージング環境をデプロイしてみます。 ここでは:v3というタグをつけたイメージを更新したイメージとして準備しています。

$ rio stage --image=ibuildthecloud/demo:v3 rio-demo:v3

psもみておきましょう。

$ rio ps
NAME          IMAGE                    CREATED          SCALE     STATE     ENDPOINT                                             DETAIL
rio-demo      ibuildthecloud/demo:v1   32 minutes ago   3         active    http://rio-demo.default.cr2ch1.lb.rancher.cloud      
rio-demo:v3   ibuildthecloud/demo:v3   32 minutes ago   3         active    http://rio-demo-v3.default.cr2ch1.lb.rancher.cloud 

rio-demo:v3というサービスが作成され、専用のエンドポイントが割り当てられています。 このエンドポイントを使ってステージング環境での動作確認が可能です。

$ curl -s http://rio-demo-v3.default.cr2ch1.lb.rancher.cloud
Hello World v3

カナリアリリース

ステージング環境での動作確認が済んだらカナリアリリースしてみます。

まずは元のサービス(この例だとhttp://rio-demo.default.cr2ch1.lb.rancher.cloud)にアクセスした際、20%の確率でv3にアクセスされるようにしてみます。

$ rio weight rio-demo:v3=20%

その後元のサービスのエンドポイントにアクセスすると時折v3の方にアクセスするようになっています。

# URLは同じであることに注目

$ curl -s http://rio-demo.default.cr2ch1.lb.rancher.cloud 
Hello World

$ curl -s http://rio-demo.default.cr2ch1.lb.rancher.cloud 
Hello World v3

ステージング -> 本番へプロモート

カナリアリリースの結果が良好だったのでいよいよステージング環境を本番環境に昇格させます。

$ rio promote rio-demo:v3

その後はv3の方にしかアクセスされなくなっています。

$ curl -s http://rio-demo.default.cr2ch1.lb.rancher.cloud 
Hello World v3

psをみてみるとステージング環境がなくなり、元のサービスと入れ替わっているのが確認できます。

$ rio ps
NAME       IMAGE                    CREATED         SCALE     STATE     ENDPOINT                                          DETAIL
rio-demo   ibuildthecloud/demo:v3   8 minutes ago   3         active    http://rio-demo.default.cr2ch1.lb.rancher.cloud   

ということでサービスメッシュ周りの確認をしてみました。

終わりに

Rancher社が発表した新しいツール「Rio」を試してみました。
Docker風の操作感なのでもともとDockerコマンドに慣れていた方には違和感なく取り組めそうな気がします。
今のところk8s+istioのラッパーといった感が強いですが、今後組み込みのプロダクトは順次増えていくはずです。

なお、現状ではまだまだ開発中ということもあり動作が不安定です。 随所にバグもみられますので今は雰囲気を感じてみる程度の使い方となります。

今後に期待しましょう。

以上です。

おまけ: 段階ごとのkubectlなどの詳細

ここからは各操作ごとにkubectlを実行してみた結果を貼っておきます。
どのようにistioを操作しているのかなどを見てフムフムしたい方向けです。

長いのでgistに貼っておきます。

途中で面倒になったので全ての変化を網羅したわけではないのでご注意ください。