仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

rkeを今更ながら触ってみた

  • 【2019年9月5日15:00追記】若干修正しました。
  • 【2019年9月5日18:00追記】若干修正しました。

これまで、Rancher LabがOSSで開発しているk3s、k3OS、Rancher、RancherOSなどをこのブログでも取り上げてきました。

先日ふと、k3sやk3OSがリリースされる以前に公開されていたrkeを触っていないのに気がつきました。 今回はrkeについてまとめてみたいと思います。

rkeとは?

github.com rancher.com

rkeはRancher Kubernetes Engineのことであり、KubeadmやKubesprayのように仮想サーバやオンプレミス環境にKubernetesクラスタを簡単に構築できるツールです。使い方はかんたんで、次を用意するだけでrkeを使ってKubernetes環境があっという間にできあがります。

  • rkeクライアント
  • コントロールプレーン(K8sの管理系サービスなど)をデプロイするDockerがインストールされたノード
  • etcdをデプロイするDockerがインストールされたノード
  • WorkerをデプロイするDockerがインストールされたノード

rkeクライアントはmacOS、Linux、Windows向けに用意されており、バイナリ一つで動きます。 好きな環境で動かしましょう。 K8sのデプロイ先である「ノード」に必要な要件については、次のドキュメントにまとまっています。

rancher.com

セットアップの流れ

rkeクライアントのダウンロードとインストール

rkeのインストールはいろいろな方法があり、こちらにまとまっています。

rancher.com

GitHubのリリースページからダウンロードする場合はクライアントをインストールする環境で/rke/releases/tag/latestを開いて、OSに対応するrkeをダウンロードし実行権限を付与して適切なディレクトリーに展開します。

macOSにrkeクライアントをインストールするのを例とすると

mac% cd Downloads
mac% mv rke_darwin-amd64 rke
mac% chmod +x rke
mac% sudo mv rke /usr/local/bin

Homebrewが使える場合はbrew install rkeでもインストールできます。ただし、GitHubでリリースされているものよりも古い場合があります。 何らかの方法でrkeクライアントをインストールしたら、確認のために次のコマンドを実行して、バージョンとヘルプの出力を確認してください。

mac% rke -v
mac% rke -help

ノードの準備

rkeでサービスを展開するためのDockerホストを準備します。 管理者権限が必要な時はrootユーザー、rkeコマンドを実行する時はcentosユーザー(実際使うユーザーに置き換えて実行してください)を使う例で説明します。

各ノードのhostsに追記

10.211.55.27  k8s-master
10.211.55.28  k8s-worker

ssh-copy-idコマンドで公開鍵をauthorized_keysに登録

SSHキーペアはssh-keygenコマンドで作成します。 本例の場合はmacOS上にrkeクライアントをインストールして、そのサーバーからsshを実行しますので、rkeで環境のデプロイ時に使うSSHキーペアを作っておいてください。

ecdsaの鍵を使う場合はssh-keygen -t ecdsaとオプションをつけて実行します。-tオプションを指定しなかった場合は現在ですと大抵RSAの鍵が作成されます。

作成したユーザーがSSHキーペアをecdsaで作成した場合、かつ各ノードにcentosという名前のユーザーでログインする例です。

rkeの要件としてroot以外かつ管理権限を持つ(sudoの実行が許可されている)ユーザーが必要になります。次のように実行するとパスワードを求められるので、例の場合はcentosのパスワードを設定します。

パスワードを設定したらクライアントからノードにSSH接続できることを確認します。

node# useradd centos
node# passwd centos

クライアントからssh-copy-idコマンドで、公開鍵をauthorized_keysに登録します。

mac% ssh-copy-id -i ~/.ssh/id_ecdsa centos@10.211.55.27
mac% ssh-copy-id -i ~/.ssh/id_ecdsa centos@10.211.55.28

公開鍵認証でノードにアクセスできることを確認します。

mac% ssh centos@10.211.55.27
mac% ssh centos@10.211.55.28

Dockerパッケージのインストール

要件に沿ったDockerパッケージをホストにインストールします。 RHEL7やCentOS 7でRHEL Dockerをインストールする場合は次のように実行します。

Oracle Linux 7を使う場合は、dockerパッケージの代わりにdocker-engineパッケージをインストールしてください。

node% sudo yum update && sudo yum install docker
node% sudo systemctl enable docker

dockerグループが作られていない場合は作成します。

node% sudo groupadd docker

要件に沿って、現在のユーザーでsudoなしにdockerコマンドが実行できるように設定します。

node% sudo usermod -aG docker $USER  && sudo systemctl start docker

各ノードでDockerサービスが起動していることを確認します。

node% sudo systemctl status docker

ファイアウォールの設定

RHEL7やCentOS 7では要件に沿ったポートfirewall-cmdコマンドなどでポート開放します。 ポートは割と多いので、シェルスクリプトなどを使ってポートを設定しましょう。

ノードに必要な基本的なセットアップは以上で終了です。

rkeのコンフィグレーション

rkeを使ってKubernetes Clusterをデプロイするための構成ファイルをrke configコマンドで実施します。コマンドを実行すると次から次へと質問が表示されるので、構築したい環境に合わせて設定を入力していきます。次が実行例です。

mac% rke config
# rkeクライアントからノードにアクセスするための鍵
[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]:  ~/.ssh/id_ecdsa
[+] Number of Hosts [1]:  2
[+] SSH Address of host (1) [none]:  10.211.55.27
[+] SSH Port of host (1) [22]:  22
# rkeクライアントからノードにアクセスするための鍵
[+] SSH Private Key Path of host (10.211.55.27) [none]:  ~/.ssh/id_ecdsa
[+] SSH User of host (10.211.55.27) [ubuntu]:  centos
[+] Is host (10.211.55.27) a Control Plane host (y/n)? [y]:  y
[+] Is host (10.211.55.27) a Worker host (y/n)? [n]:  n
[+] Is host (10.211.55.27) an etcd host (y/n)? [n]:  y
[+] Override Hostname of host (10.211.55.27) [none]: 
[+] Internal IP of host (10.211.55.27) [none]: 
[+] Docker socket path on host (10.211.55.27) [/var/run/docker.sock]: 
[+] SSH Address of host (2) [none]:  10.211.55.28
[+] SSH Port of host (2) [22]:  22
# rkeクライアントからノードにアクセスするための鍵
[+] SSH Private Key Path of host (10.211.55.28) [none]:  ~/.ssh/id_ecdsa
[+] SSH User of host (10.211.55.28) [ubuntu]:  centos
[+] Is host (10.211.55.28) a Control Plane host (y/n)? [y]:  n
[+] Is host (10.211.55.28) a Worker host (y/n)? [n]:  y
[+] Is host (10.211.55.28) an etcd host (y/n)? [n]:  n
[+] Override Hostname of host (10.211.55.28) [none]: 
[+] Internal IP of host (10.211.55.28) [none]: 
[+] Docker socket path on host (10.211.55.28) [/var/run/docker.sock]: 
# ネットワークプラグイン。デフォルトはCanal
[+] Network Plugin Type (flannel, calico, weave, canal) [canal]: 
[+] Authentication Strategy [x509]: 
[+] Authorization Mode (rbac, none) [rbac]: 
[+] Kubernetes Docker image [rancher/hyperkube:v1.14.6-rancher1]: 
[+] Cluster domain [cluster.local]: 
[+] Service Cluster IP Range [10.43.0.0/16]: 
[+] Enable PodSecurityPolicy [n]: 
[+] Cluster Network CIDR [10.42.0.0/16]: 
[+] Cluster DNS Service IP [10.43.0.10]: 
[+] Add addon manifest URLs or YAML files [no]: 

設定が終わると、カレントディレクトリーにcluster.ymlという名前のファイルが生成されます。 rke configで入力を間違えたり、設定を別に変更したい場合は直接YAMLファイルの内容を編集しても構いません。

rkeによるK8sクラスターのデプロイ

cluster.ymlの準備ができたら次のように実行します。

mac% rke up

少々時間がかかります。 INFO[0079] Finished building Kubernetes cluster successfullyのように出力されたら、Kubernetes Clusterのセットアップ完了です。

f:id:virtualtech:20190903140025p:plain

構築が完了すると、カレントディレクトリーにkube_config_cluster.ymlという名前のファイルがさらに作られます。 このKubeconfigファイルを使ってノードの情報を確認してみましょう。2つのノードがStatus Readyとなっていれば問題ありません。

mac% kubectl --kubeconfig=kube_config_cluster.yml  get no
NAME           STATUS   ROLES               AGE    VERSION
10.211.55.27   Ready    controlplane,etcd   122m   v1.14.6
10.211.55.28   Ready    worker              122m   v1.14.6

rkeによるクラスター構築に失敗した場合は、rke removeコマンドを実行すればインストール前の状態に戻すことができます。 YAMLを修正するかrke configを実行し直してください。

デプロイしたK8sの利用

次のようなYAMLを作成してください。

mac% cat hello.yml
apiVersion: v1
kind: Pod
metadata:
  name: hello-world
spec:
  containers:
    - name: busybox
      image: busybox
      tty: true

コンテナーを作成してみましょう。問題なくコンテナーを作成できるはずです。

mac% kubectl --kubeconfig=kube_config_cluster.yml  create -f hello.yml
pod/hello-world created

mac% kubectl --kubeconfig=kube_config_cluster.yml  get -f hello.yml
NAME          READY   STATUS    RESTARTS   AGE
hello-world   1/1     Running   0          6s

mac% kubectl --kubeconfig=kube_config_cluster.yml  exec -it hello-world sh
/ # 

以上です。簡単ですよね?