_・)Keep Smiling

モソモソと日々の雑感を書き溜めるというか書き殴るというか書き捨てるというか

RKEってなんじゃ?

この記事は Rancher Advent Calendar 2017 - Adventar の1日目の記事です。

師走になりました

泣いても笑っても2017年もあと一ヶ月となってしまいました。 年を取ると時間の流れが速くなると言いますが、ここ数年をそれを痛いほど実感する毎日です・・・。

さて、速いと言えば我らがRancherの進化スピード・・・といいつつ、こちらは逆に最近落ち着いてますね。 来年早々にはKubernetesを中心に据えたRancher 2.0がリリースされる様子で今はそちらに多くの開発リソースを注ぎ込んでいる真っ最中かなーと想われます。 12月にリリースされるとXmasプレゼント的な感じでナイスだった気もしますが、まぁそのぶん良いものが出てくることを願いましょう。

Rancher JPコミュニティについて紹介するよ(ていだったよ)!

さて本稿はRancherアドカレの記事ですが、マニアックな技術的投稿は他の人に丸投げして今回はコミュニティの話を書きたいと思います。 ・・・いや正確には思っていたんです。しかし、昨日たまたま次のアドカレを見つけてしまってコミュニティのことはそっちで書くことにしました。

adventar.org

というわけで少し思い直して牛可愛いよポエムでも書こうと思ったら別のメンバーに止められたので最近のニュースの話にします。

RancherがRKEを産んだってさ!

正直アルファベット3文字略語は紛らわしいので好きではないのですが、Rancherさんもやってしまいました。 Rancher Kubernetes EngineRKEです。最近こんな名前のやつばっかりだな・・・。

つい先日の11月29日のことですが、Rancherの開発および商用サブスクリプションの提供をする企業であるRancher LabsのブログにてこのRKEに関する投稿がいくつかなされました。

Announcing RKE, a Lightweight Kubernetes Installer | Rancher Labs

An Introduction to Rancher Kubernetes Engine (RKE) | Rancher Labs

日本語がとくいなフレンズのためにGoogle翻訳さんがうまいこと訳してくれたページも貼っとくね。

軽量KubernetesインストーラRKEを発表 | Rancher Labs

Rancher Kubernetes Engine(RKE)の紹介 | Rancher Labs

こちらの記事に書いてあるとおりRKEはGo言語で書かれた軽量k8sインストーラだそうです。

Rancherとk8s

Rancher 1.xでもk8s環境構築が出来ることは牛Loveなフレンズもご存知の通りです。これについては以前に私もプレゼンしてスライドを共有しているので興味のある方はそちらをご覧ください。

www.slideshare.net

じゃあなんでRKEを?という話なんですが、最初のほうの記事にあるようにRancherとk8sの独立性を高めることが目的と考えられます。つまり、Rancher側の障害でk8s環境が止まったりしないようにするためですね。

現在、Rancher LabsはRancher 2.0の開発をモリモリモーモー頑張っている真っ最中です。

記事中にも少し書いてありますが、Rancher 1.xがマルチコンテナオーケストレーションツール(Cattle、Kubernnetes、Mesos、Swarm、Windows Container)の対応だったのに対して、Rancher 2.0では思いっきりKubernetesに舵を切ったものに化けてしまいます。1.xの一部の資産は引き継げるようにするっぽいFAQはあるのですが、どっちかというと(マルチ)k8s環境を管理するツールとして頑張っていくぜ!的な方向のようです。

Rancherが何でもかんでも全部やるというよりは、誰が(何が)つくったk8sであっても簡単に管理ができるようにするためのRancherという位置を目指しているんじゃないかなーという感じ。

実際、最近のコンテナ界隈を見渡してみると猫も杓子もみーんなk8sベッタリで、「僕たちk8sできるフレンズだよ!」って言わないとヤバイ的なオーラさえ漂っています。もちろんk8s自体は大変素晴らしい仕組みですしコンテナオーケストレーションツールの大本命であることは間違いないと思いますが、ユーザサイドからみると「デプロイツールも環境もこんなに選択肢があって何を選べばいいのよ」状態に陥っていくような気配を感じる次第です。

Rancherは以前からそもそもマルチな環境にデプロイできたり、マルチなオーケストレーションツールに対応したりと、あまり1つのものに絞り過ぎないような方針をとっているように思います。今回2.0でk8sに絞っては居ますが、それでもマルチなk8sを見据えて開発を進めているんかなーと個人的に妄想しています。実際そうなのかは知らんけど(おい)。

んじゃ早速

まぁ、誕生の理由はさておき早速RKEを使ってみます。現時点ではRKE v0.0.7-devがGitHubで公開されており、環境としてmacOSまたはLinux上で利用できるようです。

今回はお試しということで、RancherOSの仮想マシンを3台立て、ホスト側のmacOSからRKEを試してみましょう。

  • ホスト環境

  • VM

    • vCPU: 2core
    • vMem: 2GB
    • vDisk: 200GB(Thin)
    • OS: RancherOS 1.1.0
    • Docker: 1.12.6

ここではRancherOSのインストール手順は省略します。前出のスライドにRancherOSインストール詳細な手順があるので、必要な場合はそちらをご覧ください。 また、バージョン1.12.xのDockerがインストールされていてSSHアクセスが可能で実行ユーザがdockerを使用できる状態であれば他のOSでも大丈夫なようです(RancherOSはこれらの要件を全て楽に満たせるので使いました)。

ちなみに、RKEは実行時、SSH接続用秘密鍵をデフォルトで~/.ssh/id_rsaとして見にいくようです。現時点では、鍵のPATHを指定する方法が分からなかったので今回はホスト側の~/.ssh/id_rsaに対応するid_rsa.pubをRancher OSには登録しています。

  • cloud-config.yml参考
#cloud-config
rancher:
  docker:
    engine: docker-1.12.6
ssh_authorized_keys:
  - ( ~/.ssh/id_rsaに対応する公開鍵情報 )

RKEの入手

既にmacOS向けのBuild済みのバイナリパッケージがRKEのGitHub Releaseページで公開されていますので、ここからrke_darwin-amd64をクリックして適当なダウンロードします(ファイル名はrke_darwin-amd64.dmsになります)。

このままではコマンドとして実行しづらいのでリネームしましょう。また、実行権も付けて実行できることを確認します。

$ mv rke_darwin-amd64.dms rke
$ chmod +x rke
$ ./rke
NAME:
   rke - Rancher Kubernetes Engine, Running kubernetes cluster in the cloud

USAGE:
   rke [global options] command [command options] [arguments...]

VERSION:
   v0.0.7-dev

AUTHOR(S):
   Rancher Labs, Inc.

COMMANDS:
     up              Bring the cluster up
     remove          Teardown the cluster and clean cluster nodes
     version         Show cluster Kubernetes version
     config, config  Setup cluster configuration
     help, h         Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug, -d    Debug logging
   --help, -h     show help
   --version, -v  print the version

cluster.ymlの作成

実行できることを確認したので、インストールのためのYAMLファイルを作成します。 RKEではcluster.ymlがデフォルトのクラスター構成ファイル名になるようです。

$ vi cluster.yml

尚、内容は前述のBlog記事を参考にこんな感じにしてみました。

---
nodes:
  - address: 192.168.101.148
    user: rancher
    role: [controlplane]
  - address: 192.168.101.149
    user: rancher
    role: [worker]
  - address: 192.168.101.150
    user: rancher
    role: [etcd]

services:
  etcd:
    image: quay.io/coreos/etcd:latest
  kube-api:
    image: rancher/k8s:v1.8.3-rancher2
  kube-controller:
    image: rancher/k8s:v1.8.3-rancher2
  scheduler:
    image: rancher/k8s:v1.8.3-rancher2
  kubelet:
    image: rancher/k8s:v1.8.3-rancher2
  kubeproxy:
    image: rancher/k8s:v1.8.3-rancher2

_・).。oO(DockerHubみてみたらv1.8.3-rancher3ってイメージも既にありそう・・・)

k8sのインストール

では、準備が出来たら早速upしてみましょう。

$ ./rke up
INFO[0000] Building Kubernetes cluster
INFO[0000] [ssh] Checking private key
INFO[0000] [ssh] Start tunnel for host [192.168.101.150]
INFO[0000] [ssh] Start tunnel for host [192.168.101.148]
INFO[0000] [ssh] Start tunnel for host [192.168.101.149]
INFO[0000] [state] Found local kube config file, trying to get state from cluster
INFO[0000] [state] Fetching cluster state from Kubernetes
INFO[0030] Timed out waiting for kubernetes cluster to get state
INFO[0030] [certificates] Generating kubernetes certificates
INFO[0030] [certificates] Generating CA kubernetes certificates
INFO[0030] [certificates] Generating Kubernetes API server certificates
INFO[0031] [certificates] Generating Kube Controller certificates
INFO[0031] [certificates] Generating Kube Scheduler certificates
INFO[0032] [certificates] Generating Kube Proxy certificates
INFO[0032] [certificates] Generating Node certificate
INFO[0032] [certificates] Generating admin certificates and kubeconfig
INFO[0032] [certificates] Deploying kubernetes certificates to Cluster nodes
INFO[0052] [certificates] Successfully deployed kubernetes certificates to Cluster nodes
INFO[0052] [etcd] Building up Etcd Plane..
INFO[0052] [etcd] Pulling Image on host [192.168.101.150]
INFO[0056] [etcd] Successfully pulled etcd image on host [192.168.101.150]
INFO[0056] [etcd] Successfully started etcd container on host [192.168.101.150]
INFO[0056] [etcd] Successfully started Etcd Plane..
INFO[0056] [controlplane] Building up Controller Plane..
INFO[0056] [controlplane] Pulling Image on host [192.168.101.148]
INFO[0061] [controlplane] Successfully pulled kube-api image on host [192.168.101.148]
INFO[0061] [controlplane] Successfully started kube-api container on host [192.168.101.148]
INFO[0061] [controlplane] Pulling Image on host [192.168.101.148]
INFO[0065] [controlplane] Successfully pulled kube-controller image on host [192.168.101.148]
INFO[0065] [controlplane] Successfully started kube-controller container on host [192.168.101.148]
INFO[0065] [controlplane] Pulling Image on host [192.168.101.148]
INFO[0069] [controlplane] Successfully pulled scheduler image on host [192.168.101.148]
INFO[0069] [controlplane] Successfully started scheduler container on host [192.168.101.148]
INFO[0069] [controlplane] Successfully started Controller Plane..
INFO[0069] [worker] Building up Worker Plane..
INFO[0069] [worker] Pulling Image on host [192.168.101.148]
INFO[0073] [worker] Successfully pulled kubelet image on host [192.168.101.148]
INFO[0073] [worker] Successfully started kubelet container on host [192.168.101.148]
INFO[0073] [worker] Pulling Image on host [192.168.101.148]
INFO[0077] [worker] Successfully pulled kube-proxy image on host [192.168.101.148]
INFO[0078] [worker] Successfully started kube-proxy container on host [192.168.101.148]
INFO[0078] [worker] Pulling Image on host [192.168.101.149]
INFO[0082] [worker] Successfully pulled nginx-proxy image on host [192.168.101.149]
INFO[0082] [worker] Successfully started nginx-proxy container on host [192.168.101.149]
INFO[0082] [worker] Pulling Image on host [192.168.101.149]
INFO[0086] [worker] Successfully pulled kubelet image on host [192.168.101.149]
INFO[0087] [worker] Successfully started kubelet container on host [192.168.101.149]
INFO[0087] [worker] Pulling Image on host [192.168.101.149]
INFO[0091] [worker] Successfully pulled kube-proxy image on host [192.168.101.149]
INFO[0091] [worker] Successfully started kube-proxy container on host [192.168.101.149]
INFO[0091] [worker] Successfully started Worker Plane..
INFO[0091] [reconcile] Reconciling cluster state
INFO[0091] [reconcile] This is newly generated cluster
INFO[0091] [certificates] Save kubernetes certificates as secrets
INFO[0109] [certificates] Successfuly saved certificates as kubernetes secret [k8s-certs]
INFO[0109] [state] Saving cluster state to Kubernetes
INFO[0109] [state] Successfully Saved cluster state to Kubernetes ConfigMap: cluster-state
INFO[0109] [network] Setting up network plugin: flannel
INFO[0109] [addons] Saving addon ConfigMap to Kubernetes
INFO[0109] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-netwok-plugin
INFO[0109] [addons] Executing deploy job..
INFO[0124] [addons] Setting up KubeDNS
INFO[0124] [addons] Saving addon ConfigMap to Kubernetes
INFO[0124] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-kubedns-addon
INFO[0124] [addons] Executing deploy job..
INFO[0129] [addons] KubeDNS deployed successfully..
INFO[0129] [addons] Setting up user addons..
INFO[0129] [addons] No user addons configured..
INFO[0129] Finished building Kubernetes cluster successfully

kubectlの実行

無事にupが成功したら、カレントディレクトリに.kube_config_cluster.ymlというファイルが作成されていますので、これを~/.kube/configにコピーします。 このファイルはkubectlコマンド実行時に読み取られ、今回インストールしたk8s環境を制御可能とします。ちなみにkubectlコマンドはmacOSの場合、HomeBrewで簡単にインストールできます。

$ ls -a
./                        ../                       .kube_config_cluster.yml  cluster.yml               rke
$ cp .kube_config_cluster.yml ~/.kube/config
$ kubectl get nodes
NAME              STATUS    AGE       VERSION
192.168.101.148   Ready     14m       v1.8.3-rancher1
192.168.101.149   Ready     14m       v1.8.3-rancher1

_・).。oO(ここのバージョンはrancher1でいいのかしら。。。)

無事にインストール出来たご様子です。Blogの内容を見ると、他にもHA構成を取ってみたり、ノードの追加/削除をしたりと、RKEではいろいろ出来そうですね。

k8s環境の削除

とりあえず今回はここまでとして、最後にお掃除してみたいと思います。

$ ./rke remove
Are you sure you want to remove Kubernetes cluster [y/n]: y
INFO[0002] Tearing down Kubernetes cluster
INFO[0002] [ssh] Checking private key
INFO[0002] [ssh] Start tunnel for host [192.168.101.150]
INFO[0002] [ssh] Start tunnel for host [192.168.101.148]
INFO[0002] [ssh] Start tunnel for host [192.168.101.149]
INFO[0002] [worker] Tearing down Worker Plane..
INFO[0002] [remove/kubelet] Checking if container is running on host [192.168.101.148]
INFO[0002] [remove/kubelet] Stopping container on host [192.168.101.148]
INFO[0002] [remove/kubelet] Removing container on host [192.168.101.148]
INFO[0002] [remove/kubelet] Sucessfully removed container on host [192.168.101.148]
INFO[0002] [remove/kube-proxy] Checking if container is running on host [192.168.101.148]
INFO[0002] [remove/kube-proxy] Stopping container on host [192.168.101.148]
INFO[0002] [remove/kube-proxy] Removing container on host [192.168.101.148]
INFO[0002] [remove/kube-proxy] Sucessfully removed container on host [192.168.101.148]
INFO[0002] [remove/kubelet] Checking if container is running on host [192.168.101.149]
INFO[0002] [remove/kubelet] Stopping container on host [192.168.101.149]
INFO[0002] [remove/kubelet] Removing container on host [192.168.101.149]
INFO[0002] [remove/kubelet] Sucessfully removed container on host [192.168.101.149]
INFO[0002] [remove/kube-proxy] Checking if container is running on host [192.168.101.149]
INFO[0002] [remove/kube-proxy] Stopping container on host [192.168.101.149]
INFO[0002] [remove/kube-proxy] Removing container on host [192.168.101.149]
INFO[0002] [remove/kube-proxy] Sucessfully removed container on host [192.168.101.149]
INFO[0002] [remove/nginx-proxy] Checking if container is running on host [192.168.101.149]
INFO[0002] [remove/nginx-proxy] Stopping container on host [192.168.101.149]
INFO[0003] [remove/nginx-proxy] Removing container on host [192.168.101.149]
INFO[0003] [remove/nginx-proxy] Sucessfully removed container on host [192.168.101.149]
INFO[0003] [worker] Successfully teared down Worker Plane..
INFO[0003] [controlplane] Tearing down the Controller Plane..
INFO[0003] [remove/kube-api] Checking if container is running on host [192.168.101.148]
INFO[0003] [remove/kube-api] Stopping container on host [192.168.101.148]
INFO[0003] [remove/kube-api] Removing container on host [192.168.101.148]
INFO[0003] [remove/kube-api] Sucessfully removed container on host [192.168.101.148]
INFO[0003] [remove/kube-controller] Checking if container is running on host [192.168.101.148]
INFO[0003] [remove/kube-controller] Stopping container on host [192.168.101.148]
INFO[0003] [remove/kube-controller] Removing container on host [192.168.101.148]
INFO[0003] [remove/kube-controller] Sucessfully removed container on host [192.168.101.148]
INFO[0003] [remove/scheduler] Checking if container is running on host [192.168.101.148]
INFO[0003] [remove/scheduler] Stopping container on host [192.168.101.148]
INFO[0003] [remove/scheduler] Removing container on host [192.168.101.148]
INFO[0003] [remove/scheduler] Sucessfully removed container on host [192.168.101.148]
INFO[0003] [controlplane] Successfully teared down Controller Plane..
INFO[0003] [etcd] Tearing down Etcd Plane..
INFO[0003] [remove/etcd] Checking if container is running on host [192.168.101.150]
INFO[0003] [remove/etcd] Stopping container on host [192.168.101.150]
INFO[0004] [remove/etcd] Removing container on host [192.168.101.150]
INFO[0004] [remove/etcd] Sucessfully removed container on host [192.168.101.150]
INFO[0004] [etcd] Successfully teared down Etcd Plane..
INFO[0004] [hosts] Cleaning up host [192.168.101.148]
INFO[0004] [hosts] Running cleaner container on host [192.168.101.148]
INFO[0004] [kube-cleaner] Pulling Image on host [192.168.101.148]
INFO[0009] [kube-cleaner] Successfully pulled kube-cleaner image on host [192.168.101.148]
INFO[0010] [kube-cleaner] Successfully started kube-cleaner container on host [192.168.101.148]
INFO[0010] [hosts] Removing cleaner container on host [192.168.101.148]
INFO[0010] [hosts] Successfully cleaned up host [192.168.101.148]
INFO[0010] [hosts] Cleaning up host [192.168.101.149]
INFO[0010] [hosts] Running cleaner container on host [192.168.101.149]
INFO[0010] [kube-cleaner] Pulling Image on host [192.168.101.149]
INFO[0017] [kube-cleaner] Successfully pulled kube-cleaner image on host [192.168.101.149]
INFO[0018] [kube-cleaner] Successfully started kube-cleaner container on host [192.168.101.149]
INFO[0018] [hosts] Removing cleaner container on host [192.168.101.149]
INFO[0018] [hosts] Successfully cleaned up host [192.168.101.149]
INFO[0018] [hosts] Cleaning up host [192.168.101.150]
INFO[0018] [hosts] Running cleaner container on host [192.168.101.150]
INFO[0018] [kube-cleaner] Pulling Image on host [192.168.101.150]
INFO[0023] [kube-cleaner] Successfully pulled kube-cleaner image on host [192.168.101.150]
INFO[0024] [kube-cleaner] Successfully started kube-cleaner container on host [192.168.101.150]
INFO[0024] [hosts] Removing cleaner container on host [192.168.101.150]
INFO[0024] [hosts] Successfully cleaned up host [192.168.101.150]
INFO[0024] Cluster removed successfully

無事にお掃除も完了です。

まとめ

いかがだったでしょうか。

個人的には簡単ではあるものの、まだまだベータなので柔軟性や拡張性が十分とは言い切れないなーという感じでした。 とはいえ一般的にはまだ難しいと言われるk8sのインストールを、タダでさえ構築が簡単だったRancher 1.xよりも更に簡単に構築出来ること、またRancher自体から独立できることは耐障害性の面でも利点なのかなと思います。コンテナネットワークもデフォルトのFlannel以外にもCalicoやCanalを容易に選択できるようです。このあたりはまた色々試してくれる人が現れることを祈って・・・(他力本願)。

以上、 Rancher Advent Calendar 2017 - Adventar の1日目の記事でした。明日はおすぎ(ピーコ?)アイコンでおなじみの良太郎さんによる牛ポエムだそうです。え、いいの?