月別アーカイブ: 2018年1月

Cloud Foundry Container Runtime でk8s on OpenStack

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

めでたく終了。