RioでGitHubリポジトリからのRunを試す

新しくなったRio

f:id:febc_yamamoto:20190525222428p:plain

KubeCon EUにあわせ新しくなったRioがアナウンスされました。

Rio自体は以前からOSSとして公開されていましたが、今回はRancher Labsからのリリースアナウンスもありある程度開発に区切りがついたということなのでしょう。

rancher.com

公式サイトもできてました。

rio.io

今回は新しくなったRioを軽く触ってみました。

なおRioについては以前ブログ書いてますのでこちらもご一読ください。

febc-yamamoto.hatenablog.jp

事前準備

Kubernetesクラスタ

以前のRioスタンドアロンという、embeddedなk8sクラスタ(後のk3s)を起動してくれるモードがありましたが、 新しいRioではk8sクラスタはあらかじめ準備しておく必要があります。

お好みのクラスタを用意しておきましょう。

k3sやDocker for Mac(のk8s)、minikubeもOKですし、GKE/AKS/EKSももちろんOKとのことです。 なおk8s v1.13以降が必要とのことですのでバージョンには注意しておいてください。

rioコマンドのインストール

フロントエンドとなるコマンドrioをインストールしておきます。

以下のコマンドでOKです。

$ curl -sfL https://get.rio.io | sh - 

上記コマンドで実行されるシェルスクリプトの確認がめんどくさい場合はGitHubのReleaseページから直接バイナリをダウンロードしてもOKです。

Releases · rancher/rio · GitHub

Rioのセットアップ

各種コンポーネントのデプロイ

まずはRioの各種コンポーネントk8sクラスタ上にデプロイします。 rio installコマンドを実行することでrio-systemというnamespaceにデプロイされます。

$ rio install

Creating namespace rio-system
Defaulting cluster CIDR to 10.43.0.1/16
Deploying Rio control plane....
Waiting for rio controller to initialize
Waiting for rio controller to initialize
Waiting for rio controller to initialize
Waiting for rio controller to initialize
Waiting for rio controller to initialize
Waiting for rio controller to initialize
Waiting for rio controller to initialize
Waiting for all the system components to be up. Not ready component: [autoscaler build-controller buildkit cert-manager grafana istio-citadel istio-pilot istio-telemetry kiali prometheus registry webhook]
Waiting for all the system components to be up. Not ready component: [autoscaler build-controller buildkit cert-manager grafana istio-citadel istio-pilot istio-telemetry kiali prometheus registry webhook]
Waiting for all the system components to be up. Not ready component: [autoscaler buildkit cert-manager grafana istio-citadel istio-pilot istio-telemetry kiali webhook]
Waiting for all the system components to be up. Not ready component: [cert-manager grafana istio-pilot kiali]
Waiting for service loadbalancer to be up
Waiting for service loadbalancer to be up
Waiting for service loadbalancer to be up
Waiting for service loadbalancer to be up
rio controller version v0.1.1-rc3 (2771703b) installed into namespace rio-system
Please make sure all the system pods are actually running. Run `kubectl get po -n rio-system` to get more detail.
Controller logs are available from `rio systemlogs`

Welcome to Rio!

Run `rio run https://github.com/rancher/rio-demo` as an example

なお、ここでtype=LoadBalancerなserviceが使えない場合はこのまま待つかHostPortsを使うか聞かれます。
コードを見るとそのほかにも分岐するパターンが結構あるようですね。
環境に合わせ適宜回答しましょう。

デプロイされたか確認

rio installが完了したらkubectl get pod -n rio-systemで確認してみます。

$ kubectl get pod -n rio-system

NAME                               READY   STATUS    RESTARTS   AGE
autoscaler-696866b8f7-9fbcq        1/1     Running   0          9m11s
build-controller-94b48b58f-m5kgw   2/2     Running   0          8m38s
buildkit-7f46884f98-qkjv9          2/2     Running   0          9m6s
cert-manager-57b4f876c5-hnxq6      1/1     Running   0          8m43s
grafana-68c6d8494d-rt9gg           2/2     Running   0          9m6s
istio-citadel-d76685f74-kczqs      1/1     Running   0          9m3s
istio-gateway-4ssl5                2/2     Running   0          8m57s
istio-gateway-872gl                2/2     Running   0          8m57s
istio-gateway-979xb                2/2     Running   0          8m57s
istio-pilot-85b894cd75-gg4n5       2/2     Running   0          8m54s
istio-telemetry-6b686cbbf5-bzwq5   2/2     Running   0          9m7s
kiali-7d4b6dc78c-mm5r2             2/2     Running   0          8m46s
prometheus-59c5655d9c-rw8mp        1/1     Running   0          9m11s
registry-6c4fddb8b6-2bvrm          2/2     Running   0          8m40s
registry-proxy-46ftw               1/1     Running   0          9m8s
registry-proxy-shjf9               1/1     Running   0          9m8s
registry-proxy-smszz               1/1     Running   0          9m8s
rio-controller-86c4bf9698-6blb5    1/1     Running   0          9m27s
webhook-5f6fc8f6f9-q6h6w           2/2     Running   0          8m28s

AutoScalerやKnativeのbuild-controller、buildkit、cert-manager、grafana、istio、kiali、prometheus、、、、と色々なPodが並んでますね。

Rioの新機能を試す - GitリポジトリからのRun

前回Rioを試した時にはなかった機能としてGitHubリポジトリのURLを指定してRunする機能が入っていました。
RioはデフォルトでKnative+buildkitでイメージをビルドするようになっているようです。
(オプションでbuildpackなども使えるようですがまだ試してないです)

ということで早速試してみました。

確認にはこちらのリポジトリを用意しました。

github.com

これはgolangでHTTPサーバを立ち上げHello Rio!というメッセージを返すだけの簡単なもので、main.goDockerfileの2ファイルだけで構成されているリポジトリとなっています。

main.goは以下の通りです。

package main


import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func handler(w http.ResponseWriter, r *http.Request) {
    time.Sleep(100 * time.Millisecond)
    fmt.Fprintln(w, "Hello Rio!!")
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Dockerfileは以下の通りです。

FROM golang:1.11.1
ENV GOPATH="/go"
RUN ["mkdir", "-p", "/go/src/github.com/yamamoto-febc/rio-demo"]
COPY * /go/src/github.com/yamamoto-febc/rio-demo/
WORKDIR /go/src/github.com/yamamoto-febc/rio-demo
RUN ["go", "build", "-o", "demo"]
CMD ["./demo"]

Runしてみる

ということで早速Runしてみました。

# -pオプション: 公開するポート -nオプション: 名前(今回はbuildという名前)
$ rio run -p 8080/http -n build https://github.com/yamamoto-febc/rio-demo

rio psを実行してみるとイメージのビルドを待機中と出ました。

$ rio ps

# イメージのビルド待ち
NAME            CREATED         ENDPOINT                                      REVISIONS   SCALE     WEIGHT    DETAIL
default/build   2 seconds ago   https://build-default.7vlxuv.on-rio.io:9443   v0          0/1       100%      v0 NotReady; v0 waiting on build

しばらく待つとイメージがビルドされ、コンテナの起動~公開まで行われました。

# イメージがビルドされ、コンテナ起動~公開までされた状態
$ rio ps
NAME            CREATED         ENDPOINT                                      REVISIONS   SCALE     WEIGHT    DETAIL
default/build   6 minutes ago   https://build-default.7vlxuv.on-rio.io:9443   v0          1         100%      

# エンドポイント宛てにリクエストしてみる
$ curl https://build-default.7vlxuv.on-rio.io:9443

Hello Rio!!

無事表示されましたね!!!

コードの修正〜pushを試す

次にコードを修正し、コミットとプッシュを試してみます。 Rioはデフォルトではmasterブランチへのタグ/コミットのpushをポーリングで検知してくれるとのことです。 (オプションでWebhookも利用できるとのこと)

ということで先ほどのコードを修正しpushして反映されるか確認してみます。

# メッセージを書き換えてみる: "Hello Rio!" から"Bonjour Rio!"へ
$ vi main.go

$ コミットしてpush
$ git add main.go
$ git commit -m"Update messages"
$ git push origin master

pushしたらRioが検知しているかrio revisionコマンドで確認してみます。

$ rio revision default/build
NAME                   IMAGE                                                                   CREATED          SCALE     ENDPOINT                                             WEIGHT    DETAIL
default/build:v0       localhost:5442/default/build:ff1d967decbfd34ecd1268d72b5a4e8e1067f9ee   19 minutes ago   1         https://build-v0-default.7vlxuv.on-rio.io:9443       100       
default/build:v37d26                                                                           28 seconds ago   0/1       https://build-v37d26-default.7vlxuv.on-rio.io:9443   0         

default/build:v37d26というリビジョンができてますね。こちらをビルド中のようです。 しばらく待つと次のようになりました。

rio revision default/build
NAME                   IMAGE                                                                                 CREATED          SCALE     ENDPOINT                                             WEIGHT    DETAIL
default/build:v0       localhost:5442/default/build:ff1d967decbfd34ecd1268d72b5a4e8e1067f9ee                 21 minutes ago   1         https://build-v0-default.7vlxuv.on-rio.io:9443       0         
default/build:v37d26   localhost:5442/default/build-169daa9-b92af:37d2632cb0d649dda800f5375b48b19419836f93   2 minutes ago    1         https://build-v37d26-default.7vlxuv.on-rio.io:9443   100       

新しい方のリビジョンのビルドが終わり、そちらに切り替わっているようですね。WEIGHTが新しいリビジョンの方に100%となりました。
では先ほどのエンドポイントあてに再度リクエストしてみます。

# 再度エンドポイント宛てにリクエストしてみる
$ curl https://build-default.7vlxuv.on-rio.io:9443

Bonjour Rio!!

お!!!!更新されてますね!

この手軽さはなかなか良いですね!

ということで

時間と体力切れのため今回はここまでです。 とっつきにくいKubernetesのあれこれを上手く覆い隠すフロントエンド、という印象を持ちました。

モニタリング面なども面白そうなので時間を見つけてもう少し触ってみたいところです。

以上です。