- 【2019年9月5日15:00追記】若干修正しました。
- 【2019年9月5日18:00追記】若干修正しました。
- 【2019年10月1日19:00追記】
/rke/releases/tag/latest
がなくなっていたので修正しました。その他、若干修正しました。
これまで、Rancher LabがOSSで開発しているk3s、k3OS、Rancher、RancherOSなどをこのブログでも取り上げてきました。
先日ふと、k3sやk3OSがリリースされる以前に公開されていたrkeを触っていないのに気がつきました。 今回はrkeについてまとめてみたいと思います。
rkeとは?
rkeはRancher Kubernetes Engineのことであり、KubeadmやKubesprayのように仮想サーバやオンプレミス環境にKubernetesクラスタを簡単に構築できるツールです。使い方はかんたんで、次を用意するだけでrkeを使ってKubernetes環境があっという間にできあがります。
- rkeクライアント
- コントロールプレーン(K8sの管理系サービスなど)をデプロイするDockerがインストールされたノード
- etcdをデプロイするDockerがインストールされたノード
- WorkerをデプロイするDockerがインストールされたノード
rkeクライアントはmacOS、Linux、Windows向けに用意されており、バイナリ一つで動きます。 好きな環境で動かしましょう。 K8sのデプロイ先である「ノード」に必要な要件については、次のドキュメントにまとまっています。
セットアップの流れ
rkeクライアントのダウンロードとインストール
rkeのインストールはいろいろな方法があり、こちらにまとまっています。
GitHubのリリースページからダウンロードする場合はクライアントをインストールする環境で/rke/releases/tag/を開いて、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% sudo useradd centos node% sudo 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
ノードの/var/run/docker.sockにユーザー権限でアクセスできるように調整
/var/run/docker.sock
にdockerrootグループでアクセスできるように設定します。
daemon.jsonに複数行記述するときは、カンマをつけます。
% sudo vi /etc/docker/daemon.json { "group": "dockerroot" } % sudo usermod -aG dockerroot <user_name> && sudo reboot
各ノードで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のセットアップ完了です。
構築が完了すると、カレントディレクトリーに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 / #
以上です。簡単ですよね?