「Rio」- 古き良きDockerのUXをモダンなクラウドネイティブソフトウェア達に
2018/10/1更新:
- v0.0.3を使うように修正
- 文言を微修正
Twitterにて「Rio」のデモ動画が発表された
つい先日(2018/8/7)、TwitterにてRancher社のDarren Shepherd氏がRioというプロダクトのデモ動画を発表してました。
Early Preview of Rio, a new end-to-end container tool from Rancher. Basically this is what I've been doing for that last couple months. https://t.co/MQ8dwaaNT1
— Darren Shepherd (@ibuildthecloud) August 6, 2018
前々から氏のツイートなどでRioの開発をしてる旨を匂わせていましたがいよいよ動く段階まできたようです。
Rancher 2.0の開発もまだまだ継続してる中、新しいプロダクトはしばらく先じゃないかと思ってましたが 思っていたより早い段階で動く姿を見れたので結構驚きました。
もうGitHubからダウンロードできる状態でしたので早速動かしてみました。
注: 以降は先のデモ動画の内容をなぞっていっただけのものです。 動画を見た方は多分この先読まなくてOKです。
「Rio」って何?
Rancher社が開発している、新しいコンテナツールとのことです。
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上にも書かれてます)。
現在は基本となるコンテナランタイム(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からダウンロードし展開しておきます。
# rio v0.0.3のダウンロード curl -L -o rio.tgz https://github.com/rancher/rio/releases/download/v0.0.3/rio-v0.0.3-linux-amd64.tar.gz # 展開 tar zxvf rio.tgz # PATHの通った場所に移動 mv rio-v0.0.3-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
が使われるようです。
この辺の処理は以下のあたりにありますので興味のある方はソース追ってみてください。
- https://github.com/rancher/rio/blob/master/controllers/backend/pod/pod_controller.go
- https://github.com/rancher/rancher/tree/7e581517d1d3f20a440a65abcdfcc43e58062156/pkg/controllers/user/approuter
そして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に貼っておきます。
- 01. Rioインストール直後のリソースたち(
kubectl get all
) - 02. Rioインストール直後のCRDs
- 03. Run(-pオプションあり)でサービスを公開した直後のリソースたち
- 04. Run(-pオプションあり)でサービスを公開した直後のIstio関連CR
- 05. Stageした後のリソースたち
- 06. Stageした後のIstio関連CR
- 07. カナリアリリース(weight)時のCR
途中で面倒になったので全ての変化を網羅したわけではないのでご注意ください。
Kubernetes完全ガイド (impress top gear)
- 作者: 青山真也
- 出版社/メーカー: インプレス
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 山田明憲
- 出版社/メーカー: 技術評論社
- 発売日: 2018/08/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る