RKEってなんじゃ?
この記事は Rancher Advent Calendar 2017 - Adventar の1日目の記事です。
師走になりました
泣いても笑っても2017年もあと一ヶ月となってしまいました。 年を取ると時間の流れが速くなると言いますが、ここ数年をそれを痛いほど実感する毎日です・・・。
さて、速いと言えば我らがRancherの進化スピード・・・といいつつ、こちらは逆に最近落ち着いてますね。 来年早々にはKubernetesを中心に据えたRancher 2.0がリリースされる様子で今はそちらに多くの開発リソースを注ぎ込んでいる真っ最中かなーと想われます。 12月にリリースされるとXmasプレゼント的な感じでナイスだった気もしますが、まぁそのぶん良いものが出てくることを願いましょう。
Rancher JPコミュニティについて紹介するよ(ていだったよ)!
さて本稿はRancherアドカレの記事ですが、マニアックな技術的投稿は他の人に丸投げして今回はコミュニティの話を書きたいと思います。 ・・・いや正確には思っていたんです。しかし、昨日たまたま次のアドカレを見つけてしまってコミュニティのことはそっちで書くことにしました。
というわけで少し思い直して牛可愛いよポエムでも書こうと思ったら別のメンバーに止められたので最近のニュースの話にします。
RancherがRKEを産んだってさ!
正直アルファベット3文字略語は紛らわしいので好きではないのですが、Rancherさんもやってしまいました。
Rancher Kubernetes EngineでRKEです。最近こんな名前のやつばっかりだな・・・。
つい先日の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を試してみましょう。
ホスト環境
- マシン: MacBook Pro (13" 2016)/ 3.3GHz Core i7 / 16GB
- OS: macOS High Sierra 10.13.1(17B1002)
- 仮想化ソフト: VMware Fusion 10.0.1 (6754183)
-
- 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日目の記事でした。明日はおすぎ(ピーコ?)アイコンでおなじみの良太郎さんによる牛ポエムだそうです。え、いいの?