Kubernetes Meetup Tokyo #8でCloud Foundry Container Runtime(CFCR)を使ってOpenStack Pikeにk8sをインストールできると聞いてインストールしてみました。OpenStackはもう何年も触っているし、BOSHは3年前に触ったことあるし、と始めましたがドキュメント通りコピペすればいい、というわけではないのでなかなか大変でした。
OpenStack環境
https://docs.openstack.org/install-guide/openstack-services.html#minimal-deployment のminimal deployment に加えてcinder も必要なのでインストールしました。この手順ではhostsファイルで名前解決していますが、後々BOSHで起動したVMが名前解決できる必要があるのでendpointはIPアドレスで再登録しておきました。
CFCR用プロジェクト、ユーザー、鍵、仮想ネットワーク、サブネット、セキュリティグループを作成します。自分は以下のように作りました。
- プロジェクト名:k8s
- ユーザー k8s
- 仮想ネットワーク selfservice
- サブネット selfservice, 172.16.1.0/24
- 鍵 mykey
- セキュリティグループ k8s
セキュリティグループのルールはCFCRの前提としてBOSHが使える必要があるため、8. Add the following rules to the BOSH Security Group: かつ 5. A network configured to allow the following: をとります。
以下はセキュリティグループルールの例。試行錯誤していたので正しくないかもしれませんが。。
$ openstack security group rule list k8s +--------------------------------------+-------------+-----------+-------------+--------------------------------------+ | ID | IP Protocol | IP Range | Port Range | Remote Security Group | +--------------------------------------+-------------+-----------+-------------+--------------------------------------+ | 09268ad6-16e0-4679-b788-97ecca778679 | udp | None | 8285:8285 | 99d8ce43-f500-47ec-9cce-dd4b32f6ae76 | | 1bf09b03-bfed-4bbf-a489-70babbbb44ec | None | None | | None | | 2199df36-f76f-4946-8a81-d05cd20e8622 | tcp | 0.0.0.0/0 | 30000:32765 | None | | 2f4a30e4-2038-4883-915f-3b63322ad040 | tcp | 0.0.0.0/0 | 8443:8443 | None | | 54357d8f-88ea-4492-a183-1c53509aa70b | tcp | None | 1:65535 | 99d8ce43-f500-47ec-9cce-dd4b32f6ae76 | | 9eca2f5e-6ae7-4d79-9d4b-93fd2b002596 | tcp | 0.0.0.0/0 | 6868:6868 | None | | b5f84e30-338c-42eb-a066-8ef808345d60 | tcp | 0.0.0.0/0 | 25555:25555 | None | | e7655700-801b-477c-b2b7-af6fe5937afc | None | None | | None | | ebfc7a77-f808-4216-9f7f-297eb9efcaba | tcp | None | 53:53 | 99d8ce43-f500-47ec-9cce-dd4b32f6ae76 | +--------------------------------------+-------------+-----------+-------------+--------------------------------------+
また、CFCR用フレーバーm1.large、m1.xlargeを作成します。名前が合っている必要があります。以下は作成後をリストした例。
$ nova flavor-list +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | 0 | m1.nano | 64 | 1 | 0 | | 1 | 1.0 | True | | 1 | m1.small | 2048 | 10 | 0 | | 1 | 1.0 | True | | 2 | m1.xlarge | 8192 | 20 | 0 | | 4 | 1.0 | True | | 3 | m1.large | 4096 | 20 | 0 | | 2 | 1.0 | True | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
Bastion VM作成
OpenStack でBOSHを使うときは踏み台としてVMを作成(Bastion VMという)してそこから操作するのが常道のようです。ここでもそれに習い作成します。上記で作成したユーザーで、作成した鍵、仮想ネットワーク、サブネットを指定します。イメージはubuntu xenialにしました。フレーバーはm1.small(メモリ2048、ディスク10GB)。
Bastion VMに入り、BOSH CLI v2とcredhub-cliをインストールします。credhub-cliはドキュメントにはありませんが後々インストールが必要になります。BOSH CLI v2のインストール手順はhttps://bosh.io/docs/cli-v2.html#installにあります。Goで書かれているので実行ファイルをダウンロード、実行権を付与しパスがあるディレクトリに置きます。このとき、ファイル名をboshではなくbosh-cliにします。なぜか、CFCRのシェルスクリプトではbosh-cliとなっているためです。その後書いてある通りに(Trustyではありませんが気にせず)OS依存パッケージをインストールします。credhub-cliはhttps://github.com/cloudfoundry-incubator/credhub-cli/releasesからダウンロードして解凍し実行権を付与し、パスがあるディレクトリに移動します。
以上でOpenStack環境と作業するVMの準備ができました。
BOSHのデプロイ
https://docs-cfcr.cfapps.io/installing/openstack/deploying-bosh-openstack/ の手順です。
設定ファイル生成
Step 1: Generate a Configuration Templateに書いてある通りにBastion VMに入って実行します。実行すると/home/ubuntu/kubo-env/kubo下にdirector.yml、director-secrets.ymlができます。
ロードバランサ作成
Step 2: Configure Routingに相当する手順です。ここはよくわからず合っているかわかりませんが、とりあえず動作したということで記録します。OpenStackではロードバランササービスが一般的ではないので、VMにHAProxyをインストールしてそれをロードバランサに使います。と言ってもFloatingIPにアクセスしたらkubernetesのマスターノードにある apiserverに通すだけ。。この次で設定ファイルにFloating IPを書くこともあり、この段階でFloating IPも付与して稼働させておきます。HAProxyパッケージをインストールした後にHAProxyの設定ファイル/etc/haproxy/haproxy/haproxy.cfgに以下を追加しました。
frontend web_proxy default_backend kubeapi bind *:8443 mode tcp backend kubeapi mode tcp server kubeapi 172.16.1.9:8443
172.16.1.9 はkubernetesのマスターノードのIPアドレスです。実はこれはデプロイしてみないとわからないので今は適当。
BOSH directorデプロイ
BOSH directorを構築するステップです。終わるとbosh/0という名前のVMが作成されます。
まず、/home/ubuntu/kubo-env/kubo/director.ymlを編集します。以下が例です。
internal_ip: 172.16.1.20 # Internal ip address of the BOSH director. Please select an available ip address in the network you wish to deploy into. internal_cidr: 172.16.1.0/24 # CIDR range that BOSH will deploy to internal_gw: 172.16.1.1 # internal gateway director_name: k8director # user friendly Director name dns_recursor_ip: 10.0.0.1 # DNS IP address for resolving non-BOSH hostnames kubo_release_url: https://storage.googleapis.com/kubo-public/kubo-release-latest.tgz worker_count: 3 # IaaS routing mode settings # Comment this section when using CF routing mode routing_mode: iaas kubernetes_master_host: 10.0.0.202 # IP address that can be used to reach the Kubernetes API, usually the address of a load balancer or static IP master_target_pool: # target pool that master nodes will be a part of authorization_mode: abac # RBAC or ABAC authorization modes for the K8s cluster. Note: RBAC is not stable as of 0.8.x. auth_url: 'http://10.0.0.11:5000/v3' # OpenStack authentication URL az: nova # Availability zone default_key_name: mykey # Name of the SSH key pair default_security_groups: # List of security groups for the instances - k8s - default net_id: 57452a08-e50a-40a6-a25a-cb72e8b44ac5 # OpenStack network identifier openstack_domain: default # OpenStack domain (optional) openstack_project: k8s # Openstack project name openstack_tenant: k8s # OpenStack tenant (required for multi-tenant environments) region: RegionOne # OpenStack region (optional) openstack_username: k8s # OpenStack admin username
internal_ipはBOSH directorのIPアドレスです。まだ使われていないサブネットのIPアドレスを指定します。internal_cidrは作成したサブネットのアドレス範囲です。internal_gwは作成したサブネットのゲートウェイです。dns_recursor_ipはDNSサーバのIPアドレスです。kubernetes_master_hostはHAProxyのVMにつけたFloatingIPです。
default_key_nameに指定したキーペアの秘密鍵を適当な場所に置きます。自分は/home/ubuntu/kubo-deployment下に置きました。
次に/home/ubuntu/kubo-env/kubo/director-secretes.ymlを編集します。openstack_passwordの値にadminのパスワードを書き込みます。
準備ができたので、kubo-deployment下から以下を実行します。
$ ./bin/deploy_bosh "${kubo_env_path}" id_rsa
しばらく待つとbosh/0というVMが作成されて終了します。
CFCRデプロイ
ここまで来ればあともう少しです。ここからが本番CFCRデプロイだろ、と思いますが本当です。これが良くも悪くもBOSHというもの。
私の環境はOpenStackかつノープロキシなので、Step 3: Deploy CFCRから始まります。以下を実行します。
$ ./bin/deploy_k8s ~/kubo-env/kubo my-cluster
成功すると、VMが4つできました。マスターノード1つとワーカーノード3つのようです。名前がmasterで始まっているVMのIPアドレスをひかえます。haproxy.cfgに適当に設定したIPをこのアドレスに変更し、HAProxyサービスを再起動します。はい終了。
Kubernetesクラスターにアクセス
Step 4: Access Kubernetesの手順です。用意されているシェルを実行してconfigを生成してapiserverにアクセスします。
以下を実行します。これで~/.kube が作成されます、たぶん。
./bin/set_kubeconfig ~/kubo-env/kubo my-cluster
以下を実行し動作確認します。
$ kubectl get pods --namespace=kube-system
以下のように出力されました。
ubuntu@bastion3:~$ kubectl get pods --namespace=kube-system NAME READY STATUS RESTARTS AGE heapster-5cd77b4fcb-gfcth 1/1 Running 0 6d kube-dns-7468555786-qm47z 3/3 Running 0 6d kubernetes-dashboard-85f6fc6c95-b74hv 1/1 Running 0 6d monitoring-influxdb-679d8fc75c-lr5fs 1/1 Running 0 6d
めでたく終了。