Helion OpenStackの上にRancherでKubernetesクラスタを構築してみる(その1)

More than 1 year has passed since last update.


概要

OpenStack上でのコンテナ管理といえばZunがあり、またOpenStackでKubernetesなどのコンテナオーケストレーターの管理といえばMagnumがありますが、これらプロジェクトの立ち位置はまだ発展途上であり、プロダクションで採用しているOpenStack環境も少数派なんじゃないかと思います(October2016 User SurveyではMagnumのProduction採用率は2%でしたね)。HPEのディストリビューションであるHelion OpenStackもMagnumやZunは今のところ採用していません。

とはいえテナントレベルでは流行りのコンテナオーケストレーションを実現したいので、テナント上にプライベートCaaSを作っちゃえばいいわけです。というわけで、Helion OpenStackのテナント上にRancherでKubernetesクラスタを構築してみます。

まあRancherの場合、構築って言ってもDockerイメージを各Host(仮想マシン)で起動すればあとは勝手にやってくれるんですが、せっかくなんで仮想マシンのデプロイにOpenStack Heatを使うところもやってみたいと思います。


前提


  • 動いているOpenStack環境:


    • ここではHelion OpenStack 4.0 (Mitaka) の環境を使っています

    • イントラネット上にあるプライベートIaaSで、Proxy経由でインターネットにつながります



  • OpenStack上のテナント(プロジェクト)


    • ユーザアカウント

    • テナント内プライベートネットワークがひとつ:10.0.0.0/8

    • Glanceに登録された仮想マシンイメージ:ぶっちゃけdockerが動けばなんでもよくて、AtomicとかCoreOSとか使えば手っ取り早いんですが、ここではCentOS7を使ってみます。なければここからダウンロードしてGlanceに登録します。




作りたいもの

こんな感じ。

3.PNG

何も考えずに作るとk8sの全ノードにPublic IPを振る感じになりますが、通常イントラネットでは使えるIPアドレスが限られていると思います。なのでFloating IPを3つ使って

- Rancher Serverへのアクセス用

- k8sのLoad Balancer用 x2

とし、コンテナ間の通信はプライベートネットワークを使います。


手順

以下OpenStackの操作はコマンドを記載しますが、Horizonのほうが楽な方はそちらで


1.ベースイメージの作成

いちいちノード増やすたびにdockerのインストールとかめんどうなので、CentOS7にDockerをインストールしたベースイメージを作っちゃいます


1.1 仮想マシンの起動

CentOS7のイメージから仮想マシンインスタンスを起動します。dockerをインストールするだけなのでflavorはsmallとかで適当に

$ nova boot --flavor 2 --image <CentOS7のイメージID> --key-name <keypair名> --security-groups <セキュリティーグループID> centos7-docker-base

sshで接続して作業したいのでフローティングIPを振ります。

$ nova floating-ip-list

$ nova floating-ip-associate centos7-docker-base <Floating IPアドレス>

インスタンスが起動したらsshでログインします。

$ ssh -i <keyfile> centos@<Floating IP>


1.2 Dockerのインストール

Dockerをインストールします。

$ export http_proxy=http://web-proxy.example.com:8080

$ export https_proxy=http://web-proxy.example.com:8080
$ sudo -E yum -y update
$ sudo -E curl -fsSL https://get.docker.com/ | sh
$ sudo usermod -aG docker centos
$ sudo systemctl enable docker.service
$ sudo systemctl start docker.service

dockerサービスの環境変数にHTTP_PROXYが設定されてなきゃいけないので、めんどくさいけど以下設定します。CentOS7ではdockerサービスはsystemctlで起動されますので、/etc/systemd/system/docker.service.d/の下に*.confというファイルを置いておけば起動時にパラメータが読み込まれます。

今回はベースとなる仮想マシンイメージにあらかじめ設定を仕込んでしまいますが、各仮想マシンインスタンス起動時にcloud-initスクリプトで設定してもよいです。Heatでデプロイする場合はそのほうがよいかもしれません。

$ sudo su

# vi /etc/systemd/system/docker.service.d/20-http-proxy.conf


20-http-proxy.conf

[Service]

Environment="HTTP_PROXY=http://web-proxy.example.com:8080"

# systemctl daemon-reload

# systemctl restart docker


1.3 Dockerの動作確認

一般ユーザでログインしなおして動作確認

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

dockerサービスにProxyが正しく設定されていないとimageのpullができずエラーになります。


1.4 SnapShotの取得

仮想マシンインスタンスをシャットダウンします。

スナップショットを取得します。

$ nova image-create centos7-docker-base centos7-docker-base-image


2 Rancher+Kubernetesクラスタのセットアップ


2.1 ノードの起動

1.で作成したイメージ(スナップショット)をつかって仮想マシンをデプロイします。ここでは5ノード一気にデプロイします。このへんがOpenStackは楽ですね。

$ nova boot --image centos7-docker-base-image --min-count 5 --key-name <keypair名> --security-groups <セキュリティグループ名> --flavor 3 rancher-k8s

$ nova list | grep rancher-k8s

| 526eb62b-a2ba-44ce-8309-f6f400c8468a | rancher-k8s-1 | ACTIVE | - | Running | junichi-private=10.0.0.25 |
| de77f2dd-d8b0-416a-9277-e1fe97a1a32c | rancher-k8s-2 | ACTIVE | - | Running | junichi-private=10.0.0.26 |
| 86cefc4d-7ea9-4d83-ae85-5da19ea6f40c | rancher-k8s-3 | ACTIVE | - | Running | junichi-private=10.0.0.27 |
| 1484ac47-c602-46f2-af3d-24dacaed1f83 | rancher-k8s-4 | ACTIVE | - | Running | junichi-private=10.0.0.28 |
| 6ec885b6-edc8-4bab-a96b-de1d8d4c668c | rancher-k8s-5 | ACTIVE | - | Running | junichi-private=10.0.0.29 |


2.2 Rancher Serverのセットアップ

ここから先はhttp://docs.rancher.com/のドキュメントに書いてある通りです。zembutsuさんのこちらもわかりやすいです。

なので以下、違うところだけ書きます。

1台目(rancher-k8s-1)にRancherをインストールします。

まずFloating IPを振ります。

$ nova floating-ip-associate rancher-k8s-1 <Floating IPアドレス>

sshでログインします。

$ ssh -i <keyfile> centos@<Floating IPアドレス>

すでに元のイメージにDockerがインストールされていてProxyも設定してあるので、Rancher Serverのインストールはdocker run一発です。

$ sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server

Unable to find image 'rancher/server:latest' locally
latest: Pulling from rancher/server
96c6a1f3c3b0: Downloading 32.44 MB/65.7 MB
ed40d4bcb313: Download complete
b171f9dbc13b: Download complete
...


2.3 Kubernetesのセットアップ

rancher-k8s-1に振ったFloating IPのポート8080にブラウザでアクセスします。

EnvironmentでKubernetesを登録します。

最初のHostを登録する際に、Rancher ServerのURLを聞かれますが、クラスタ内の通信はプライベートネットワークを使いたいので、プライベートのIPアドレスで登録します。

1.PNG

あとはホストを登録していきます。ホストの登録はWeb画面の指示に従い、各ノードにsshで入ってコマンドを叩くだけです。

$ sudo docker run -e CATTLE_AGENT_IP="10.0.0.27"  -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.0.2 http://10.0.0.25:8080/v1/scripts/E0A1E9AE5212FFF56845:1480078800000:57ZANJblcGjSP7tU2740ygNlctw

4台目以降のノードにはFloating IPを振らないので、1台目のノードを踏み台とします。そのため1台目のノードにはkeyfileをコピーしておきます。

クラスタの構成が終わるとこんな感じになります([INFRASTRUCTURE]-[Hosts])。

4.PNG

続きは次回。