RKE(Rancher Kubernetes Engin)も登場したことですし、さっそくサクッとKubernetesクラスタを作ってみたいと思います。さらにそのクラスタ上にFaaSで人気を集めているOpenFaaSをHelm経由でデプロイしてみたいと思います。この記事は2つに分けていて、

  • その1:RKEでKubernetesをデプロイ
  • その2:KubernetesにOpenFaaSをデプロイ

という内容になっています。

まず、Kubernetesのクラスタは1Masterノードと1Workerノードというシンプルな構成にしたいと思います。以下、構成のイメージです。
1_kX4NlgPeovpOXwxd5SmcJw

前提

  • Docker (1.12〜17.03)が動かせるホスト2台
    (この記事ではUbuntu16.04にDocker17.03-ceを使います)
  • 各ホストは1コア1GB RAMあればOK

RKEでKubernetesクラスタをデプロイ

英語が読める方は"Announcing RKE, a Lightweight Kubernetes Installer"を一読されることをおすすめします。また、11月に開催されたオンラインミートアップもおすすめです。"Managing Kubernetes Clusters with Rancher 2.0 — November 2017 Online Meetup"

RKEのダウンロード

RKEはこちらからダウンロードできます。RKEはKubernetesを簡単にデプロイ可能にしてくれるCLIツールです。OSXユーザーであれば rke_darwin-amd64 をダウンロードして rke という名前に変更してください。また、 chmod +x rke で実行権限を与えるのもお忘れなく。あとは /usr/local/bin など、 PATH が通っている場所に格納しておくといいです。 rke と実行したら以下のような結果が表示されるはずです:

NAME:
   rke - Rancher Kubernetes Engine, Running kubernetes cluster in the cloud
USAGE:
   rke [global options] command [command options] [arguments...]
VERSION:
   v0.0.8-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

rke config の作成

rke が準備できたところでクラスタ作成用の設定ファイルを作成しましょう。 rke config を実行することで対話的に設定ファイルを作成することができます。下図は今回作るホストの情報です。Host1がいわゆるMasterノードで、Host2がWorkerノードとなります。
1_7yL9DBBJ_TVLwA65ToXK-Q

上を実現するためには rke config で以下のように回答します。

Cluster Level SSH Private Key Path [~/.ssh/id_rsa]:
Number of Hosts [3]: 2
SSH Address of host (1) [none]: 203.104.214.176
SSH Private Key Path of host (203.104.214.176) [none]:
SSH Private Key of host (203.104.214.176) [none]:
SSH User of host (203.104.214.176) [ubuntu]: root
Is host (203.104.214.176) a control host (y/n)? [y]: y
Is host (203.104.214.176) a worker host (y/n)? [n]: n
Is host (203.104.214.176) an Etcd host (y/n)? [n]: y
Override Hostname of host (203.104.214.176) [none]:
Internal IP of host (203.104.214.176) [none]:
Docker socket path on host (203.104.214.176) [/var/run/docker.sock]:
SSH Address of host (2) [none]: 203.104.227.60
SSH Private Key Path of host (203.104.227.60) [none]:
SSH Private Key of host (203.104.227.60) [none]:
SSH User of host (203.104.227.60) [ubuntu]: root
Is host (203.104.227.60) a control host (y/n)? [y]: n
Is host (203.104.227.60) a worker host (y/n)? [n]: y
Is host (203.104.227.60) an Etcd host (y/n)? [n]: n
Override Hostname of host (203.104.227.60) [none]:
Internal IP of host (203.104.227.60) [none]:
Docker socket path on host (203.104.227.60) [/var/run/docker.sock]:
Network Plugin Type [flannel]: calico
Authentication Strategy [x509]:
Etcd Docker Image [quay.io/coreos/etcd:latest]:
Kubernetes Docker image [rancher/k8s:v1.8.3-rancher2]:
Cluster domain [cluster.local]:
Service Cluster IP Range [10.233.0.0/18]:
Cluster Network CIDR [10.233.64.0/18]:
Cluster DNS Service IP [10.233.0.3]:
Infra Container image [gcr.io/google_containers/pause-amd64:3.0]:

※ 今回用意したホストは root ユーザしかいなかったので root を使っていますが、Dockerが使えるユーザーであれば root である必要はありません。また、ネットワークには calico を使っていますが、他にも flannelcanal があります。弊社山澤が weavePRもしたので、おそらく次のリリースで weave も使えるようになるはずです。

上の対話が完了したら、 cluster.yml が作られているのが確認できると思います。内容としては以下のようになっているはずです。

nodes:
- address: 203.104.214.176
  internal_address: ""
  role:
  - controlplane
  - etcd
  hostname_override: ""
  user: root
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ""
- address: 203.104.227.60
  internal_address: ""
  role:
  - worker
  hostname_override: ""
  user: root
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ""
services:
  etcd:
    image: quay.io/coreos/etcd:latest
    extra_args: {}
  kube-api:
    image: rancher/k8s:v1.8.3-rancher2
    extra_args: {}
    service_cluster_ip_range: 10.233.0.0/18
  kube-controller:
    image: rancher/k8s:v1.8.3-rancher2
    extra_args: {}
    cluster_cidr: 10.233.64.0/18
    service_cluster_ip_range: 10.233.0.0/18
  scheduler:
    image: rancher/k8s:v1.8.3-rancher2
    extra_args: {}
  kubelet:
    image: rancher/k8s:v1.8.3-rancher2
    extra_args: {}
    cluster_domain: cluster.local
    infra_container_image: gcr.io/google_containers/pause-amd64:3.0
    cluster_dns_server: 10.233.0.3
  kubeproxy:
    image: rancher/k8s:v1.8.3-rancher2
    extra_args: {}
network:
  plugin: calico
  options: {}
auth:
  strategy: x509
  options: {}
addons: ""
system_images: {}
ssh_key_path: ~/.ssh/id_rsa

Dockerをホストにインストール

KubernetesがサポートしているDockerならどれでも動作するはずですが、今回のKubernetesは1.8.3なので、Dockerは17.03をインストールしたいと思います。インストールはRancher Labsが用意してくれている便利スクリプトがこちらにありますので、使いましょう。

17.03は以下のコマンド一発でインストールできます。

curl https://releases.rancher.com/install-docker/17.03.sh | sh

docker versionコマンドで意図したバージョンがインストールされていることを確認しましょう。

Client:
 Version:      17.03.2-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 03:35:14 2017
 OS/Arch:      linux/amd64
Server:
 Version:      17.03.2-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 03:35:14 2017
 OS/Arch:      linux/amd64
 Experimental: false

authorized_keys の登録

デプロイ先のホストに ssh ができるように authorized_keys を登録しておきます。 ~/.ssh/id_rsa という秘密鍵があるとすれば、 ~/.ssh/id_rsa.pub に公開鍵があるかと思いますので、これの中身をコピーします。そして、デプロイ先のホストで ~/.ssh/authorized_keys の中に公開鍵の中身を貼り付けましょう。設定後、デプロイ先のホストに ssh ができることを確認してください。

スワップは無効化!

自分でデプロイしたLinuxだとswapが有効な状態かと思います。この状態では kubelet が正常に起動せずに以下のようなエラーが出ます。

error: failed to run Kubelet: Running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained:

なので、それぞれのホストで

sudo swapoff -a

を実行するか、先程の cluster.yml に以下のように fail-swap-on: false を追記してください。

kubelet:
  image: rancher/k8s:v1.8.3-rancher2
  extra_args:
    fail-swap-on: false

デプロイ!

準備は整いました。それでは、 cluster.yml が格納されているディレクトリにいることを確認して、 rke up を実行しましょう!デプロイされていくのが確認できます。

INFO[0000] Building Kubernetes cluster
INFO[0000] [ssh] Setup tunnel for host [203.104.214.176]
INFO[0000] [ssh] Setup tunnel for host [203.104.214.176]
INFO[0001] [ssh] Setup tunnel for host [203.104.227.60]
INFO[0002] [certificates] Generating kubernetes certificates
INFO[0002] [certificates] Generating CA kubernetes certificates
INFO[0002] [certificates] Generating Kubernetes API server certificates
INFO[0002] [certificates] Generating Kube Controller certificates
INFO[0002] [certificates] Generating Kube Scheduler certificates
INFO[0003] [certificates] Generating Kube Proxy certificates
INFO[0003] [certificates] Generating Node certificate
INFO[0004] [certificates] Generating admin certificates and kubeconfig
INFO[0004] [reconcile] Reconciling cluster state
INFO[0004] [reconcile] This is newly generated cluster
INFO[0004] [certificates] Deploying kubernetes certificates to Cluster nodes
INFO[0023] Successfully Deployed local admin kubeconfig at [./.kube_config_cluster.yml]
INFO[0023] [certificates] Successfully deployed kubernetes certificates to Cluster nodes
INFO[0023] [etcd] Building up Etcd Plane..
INFO[0023] [etcd] Pulling Image on host [203.104.214.176]
INFO[0028] [etcd] Successfully pulled [etcd] image on host [203.104.214.176]
INFO[0028] [etcd] Successfully started [etcd] container on host [203.104.214.176]
INFO[0028] [etcd] Successfully started Etcd Plane..
INFO[0028] [controlplane] Building up Controller Plane..
INFO[0028] [controlplane] Pulling Image on host [203.104.214.176]
INFO[0086] [controlplane] Successfully pulled [kube-api] image on host [203.104.214.176]
INFO[0087] [controlplane] Successfully started [kube-api] container on host [203.104.214.176]
INFO[0087] [controlplane] Pulling Image on host [203.104.214.176]
INFO[0089] [controlplane] Successfully pulled [kube-controller] image on host [203.104.214.176]
INFO[0089] [controlplane] Successfully started [kube-controller] container on host [203.104.214.176]
INFO[0090] [controlplane] Pulling Image on host [203.104.214.176]
INFO[0092] [controlplane] Successfully pulled [scheduler] image on host [203.104.214.176]
INFO[0092] [controlplane] Successfully started [scheduler] container on host [203.104.214.176]
INFO[0092] [controlplane] Successfully started Controller Plane..
INFO[0092] [worker] Building up Worker Plane..
INFO[0092] [worker] Pulling Image on host [203.104.214.176]
INFO[0095] [worker] Successfully pulled [kubelet] image on host [203.104.214.176]
INFO[0095] [worker] Successfully started [kubelet] container on host [203.104.214.176]
INFO[0095] [worker] Pulling Image on host [203.104.214.176]
INFO[0097] [worker] Successfully pulled [kube-proxy] image on host [203.104.214.176]
INFO[0098] [worker] Successfully started [kube-proxy] container on host [203.104.214.176]
INFO[0098] [worker] Pulling Image on host [203.104.227.60]
INFO[0103] [worker] Successfully pulled [nginx-proxy] image on host [203.104.227.60]
INFO[0103] [worker] Successfully started [nginx-proxy] container on host [203.104.227.60]
INFO[0103] [worker] Pulling Image on host [203.104.227.60]
INFO[0156] [worker] Successfully pulled [kubelet] image on host [203.104.227.60]
INFO[0156] [worker] Successfully started [kubelet] container on host [203.104.227.60]
INFO[0156] [worker] Pulling Image on host [203.104.227.60]
INFO[0159] [worker] Successfully pulled [kube-proxy] image on host [203.104.227.60]
INFO[0159] [worker] Successfully started [kube-proxy] container on host [203.104.227.60]
INFO[0159] [worker] Successfully started Worker Plane..
INFO[0159] [certificates] Save kubernetes certificates as secrets
INFO[0177] [certificates] Successfuly saved certificates as kubernetes secret [k8s-certs]
INFO[0177] [state] Saving cluster state to Kubernetes
INFO[0177] [state] Successfully Saved cluster state to Kubernetes ConfigMap: cluster-state
INFO[0177] [network] Setting up network plugin: calico
INFO[0177] [addons] Saving addon ConfigMap to Kubernetes
INFO[0177] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-network-plugin
INFO[0177] [addons] Executing deploy job..
INFO[0183] [addons] Setting up KubeDNS
INFO[0183] [addons] Saving addon ConfigMap to Kubernetes
INFO[0183] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-kubedns-addon
INFO[0183] [addons] Executing deploy job..
INFO[0188] [addons] KubeDNS deployed successfully..
INFO[0188] [addons] Setting up user addons..
INFO[0188] [addons] No user addons configured..
INFO[0188] Finished building Kubernetes cluster successfully

初回デプロイはネットワーク速度に依存します(イメージを pull するので)。その時間を抜きにした場合は数分でデプロイは完了します。

Finished building Kubernetes cluster successfull

この文言が見えたらデプロイ完了です。 .kube_config_cluster.yml が作成されているのが確認できるかと思います。この状態で以下のコマンドを実行してください。

kubectl --kubeconfig .kube_config_cluster.yml get all --all-namespaces

kubernetesクラスタの情報が取得できるのを確認してください。

おわりに

rke の簡単さは伝わりましたでしょうか?次の記事ではここで作成したクラスタにServerlessプラットフォームなOpenFaaSをデプロイする方法を紹介します!

© 2018. SuperSoftware Co., Ltd. All Rights Reserved.