---
title: Cloud Foundry Container Runtime(a.k.a Kubo / Kubernetes on BOSH) 0.11.0をBOSH-Liteにデプロイ
tags: ["Kubo", "BOSH", "Kubernetes", "BOSH-Lite", "CFCR"]
categories: ["Dev", "CaaS", "Kubernetes", "CFCR"]
date: 2018-01-06T14:20:53Z
updated: 2018-01-07T02:12:14Z
---

**目次**

<!-- toc -->

### Cloud Foundry Container Runtimeとは

<img src="https://docs-cfcr.cfapps.io/images/common/cfcr-full.png" width="300px">

[Cloud Foundry Container Runtime](https://docs-cfcr.cfapps.io/)(以降、CFCR)は、KubernetesのBOSH Releaseです。[BOSH](https://bosh.io)でKubernetesクラスタを管理できるようになります。
かつてはKuboと呼ばれていましたが、リブランディングにより改名されました。

<img src="https://docs-cfcr.cfapps.io/images/common/certified_kubernetes_1.8_color.png" width="100px">

[Certified Kubernetes Conformance Program](https://www.cncf.io/announcement/2017/11/13/cloud-native-computing-foundation-launches-certified-kubernetes-program-32-conformant-distributions-platforms/)の一つです。

BOSHを使うことで、Kubernetesクラスタのデプロイを容易になるだけではなく、クラスタの自動復旧、ローリングアップデートやセキュリティパッチ当てなども運用負荷も軽減されます。

> CFCRはいわゆる"PaaSのCloud Foundry"とは別物で、BOSHが共通基盤となっているという意味で"Cloud Foundry"という冠が付いているように見えます。
> "PaaSのCloud Foundry"はCFAR(Cloud Foundry Application Runtime)という名前になりました。

### CFCR on BOSH-Lite

CFCR自体は執筆時点では

* GCP
* vSphere
* AWS
* OpenStack

しかサポートしていませんが、BOSH Releaseは基本的にはIaaS非依存なので、BOSH Liteにもデプロイは可能です。ただし、当然Cloud Providerのサポートはありません。

CFCRをBOSH-Lite on VirtualBoxにデプロイできることで、気軽に開発環境におけるKubernetesを管理できるようになることがメリットです。
CFCRは基本的にはGKEにバージョンを2週間以内で追従することを目指しています(ただし、メンテナンスバージョンが0のものは除く)。

例えば、本番環境ではGKEやCFCR on vSphere/OpenStackあるいはCFCRの商用版である[PKS (Pivotal Container Service)](https://pivotal.io/platform/pivotal-container-service)を利用する場合に、
検証環境あるいは開発環境としてそのへんのUbuntuマシン上にCFCR on BOSH-Liteにセットアップできるとリソース消費の観点でお得です。

私の場合、このブログは本番環境としてGKEで動していますが、検証は自宅サーバーのUbuntu上のVirtualBoxにセットアップしたBOSH-LiteにデプロイしたCFCRを使用しています。
GitHubの`develop`ブランチがCFCR on BOSH-Liteにデプロイされ、`master`ブランチがGKEにデプロイされています。

![image](https://user-images.githubusercontent.com/106908/34641118-4e305e72-f342-11e7-8f5b-8bd92d1d19b0.png)

Minikubeと比べるとバージョンアップの度にreinstallする必要がないのが便利です。

> ただし、CFCRも1.0になるまでは非互換なアップデートが含まれる可能性があります。またMinikubeに比べて、デプロイ対象イメージをDocker Registryにpushしないといけない点がデメリットです。(頑張れば直接Worker VM上のDockerに直接つなげれられると思いますが...)

### CFCRのデプロイ

CFCRのデプロイ方法は次の2パターンがあります。

* 用意されたスクリプトを使ってBOSHから順番にインストールしていくCFCR独自の方法
* [`cfcr.yml`](https://github.com/cloudfoundry-incubator/kubo-deployment/blob/master/manifests/cfcr.yml)と[operation files](https://github.com/cloudfoundry-incubator/kubo-deployment/tree/master/manifests/ops-files)を使って既存のBOSHに`bosh deploy`でデプロイしていく普通のBOSHの方法

CFCRとしては前者をオフィシャルな方法として提供しており、[ドキュメント](https://docs-cfcr.cfapps.io/installing/)に書かれているのもこの方法です。
前者ではBOSH Liteへのデプロイ方法は提供されていません。

後者はBOSH界のLegend、[Dr. Nic](https://twitter.com/drnic)の[Pull Request](https://github.com/cloudfoundry-incubator/kubo-deployment/pull/237)により導入されました。BOSHユーザーには馴染みのあるデプロイ方法です。
公式ドキュメントとは別に[こちら](https://github.com/cloudfoundry-incubator/kubo-deployment/blob/master/manifests/README.md)にインストール方法が記載されています。
こちらもBOSH-Liteはサポートしていないのですが、試したところ一部制約はありますが利用可能でした。

#### 事前準備

次のソフトウェアのインストールが必要です。

* VirtualBox ... https://www.virtualbox.org/wiki/Downloads
* BOSH CLI ... https://bosh.io/docs/cli-v2.html#install
* CredHub CLI ... https://github.com/cloudfoundry-incubator/credhub-cli#installing-the-cli
* Kubernetes CLI ... https://kubernetes.io/docs/tasks/tools/install-kubectl/

#### BOSH-Liteのセットアップ

CFCRはBOSH Director + UAA + CredHub構成を必須としています。

セットアップ方法は、次の記事

* https://blog.ik.am/entries/415 (BOSH Director単体のデプロイ)
* https://blog.ik.am/entries/428 (BOSH Director + UAAのデプロイ)
* https://blog.ik.am/entries/429 (BOSH Director + UAA + CredHubのデプロイ)

と基本的に同じですが、一応簡単に再掲します。

ちなみに、CFCR 0.11.0を使う場合は、StemcellのバージョンをBOSH側とCFCR側で合わせないとflanneldがエラーになりました。
記事執筆時点ではbosh-deploymentは[`ca97795d4e12dc423247b4add70dbc79bc77b1af`](https://github.com/cloudfoundry/bosh-deployment/tree/ca97795d4e12dc423247b4add70dbc79bc77b1af)を使いました。
この時点でのStemcellは3468.13が前提(compiled-releaseで使われているバージョン)となっていますので、CFCRでも3468.13を使うようにします。

```
mkdir ~/bosh-manifests
cd ~/bosh-manifests
git submodule add git@github.com:cloudfoundry/bosh-deployment.git
cd bosh-deployment
git checkout ca97795d4e12dc423247b4add70dbc79bc77b1af
cd ..
```

次に、BOSH Director VMに割り当てるCPUコア数、メモリサイズを大きくするためのops-fileを`ops-files/director-size-lite.yml`に作成します。このサイズを大きくすれば快適なKubernetes環境ができます。

次の例は私の環境(6cpu、28GBメモリ)です。自分の環境に合わせて変更してください。デフォルトは2cpu、4GBメモリで、`bosh-deployment/virtualbox/cpi.yml`に設定されています。

``` yaml
mkdir ~/bosh-manifests/ops-files
cat <<EOF > ~/bosh-manifests/ops-files/director-size-lite.yml
- type: replace
  path: /resource_pools/name=vms/cloud_properties/cpus
  value: 6

- type: replace
  path: /resource_pools/name=vms/cloud_properties/memory
  value:  28_674
EOF
```

あとは`bosh create-env`でBOSH Director VMを立ち上げればセットアップ環境です。

```
cd ~/bosh-manifests
bosh create-env bosh-deployment/bosh.yml \
  -o bosh-deployment/virtualbox/cpi.yml \
  -o bosh-deployment/virtualbox/outbound-network.yml  \
  -o bosh-deployment/bosh-lite.yml \
  -o bosh-deployment/bosh-lite-runc.yml \
  -o bosh-deployment/uaa.yml \
  -o bosh-deployment/credhub.yml \
  -o bosh-deployment/jumpbox-user.yml \
  -o ops-files/director-size-lite.yml \
  --vars-store bosh-lite-creds.yml \
  -v director_name=bosh-lite \
  -v internal_ip=192.168.50.6 \
  -v internal_gw=192.168.50.1 \
  -v internal_cidr=192.168.50.0/24 \
  -v outbound_network_name=NatNetwork \
  --state bosh-lite-state.json
```

BOSH Directorが立ち上がったら、次の環境変数を設定します。

```
export BOSH_ENVIRONMENT=192.168.50.6
export BOSH_CLIENT=admin
export BOSH_CLIENT_SECRET=`bosh int ~/bosh-manifests/bosh-lite-creds.yml --path /admin_password`
export BOSH_CA_CERT=`bosh int ~/bosh-manifests/bosh-lite-creds.yml --path /director_ssl/ca`
```

これで`bosh login`できることを確認してください。

```
$ bosh login
Successfully authenticated with UAA

Succeeded
```

また、`bosh env`でVersionが264.5.0になっていることを確認してください。

```
$ bosh env
Using environment '192.168.50.6' as client 'admin'

Name      bosh-lite  
UUID      7c35f11d-c3f8-4f22-8619-b92d50f9cc23  
Version   264.5.0 (00000000)  
CPI       warden_cpi  
Features  compiled_package_cache: disabled  
          config_server: enabled  
          dns: disabled  
          snapshots: disabled  
User      admin  

Succeeded
```

#### Cloud Configの設定

`cfcr.yml`はデフォルトで[bosh-bootloader](https://github.com/cloudfoundry/bosh-bootloader)あるいは[cf-deployment](https://github.com/cloudfoundry/cf-deployment)のCloud Configで動くように作られているので、
cf-deploymentで用意されているBOSH Lite用のCloud Configを使用します。

```
bosh update-cloud-config <(curl -L https://github.com/cloudfoundry/cf-deployment/raw/master/iaas-support/bosh-lite/cloud-config.yml)

# 検証したファイルは https://github.com/cloudfoundry/cf-deployment/raw/488e24dd8a2551e3a9e8695147c748e1e9d7d951/iaas-support/bosh-lite/cloud-config.yml です。
```

#### Stemcellのアップロード

BOSHでプロビジョニングされるVM(BOSH Liteの場合はコンテナ)のベースとなるイメージであるStemcellをアップロードします。
CFCRの場合はMasterとWorkerがStemcellから作られます。

前述の通り、v0.11.0をBOSH Liteで動かすにはBOSH VMを作成する際に使ったStemcellと同じバージョンにしないとflanneldのKernel Moduleロードの関係でエラーになりました。
今回は3468.13を使用します。BOSH LiteがどのバージョンのStemcellを使っているかは[こちら](https://github.com/cloudfoundry/bosh-deployment/blob/ca97795d4e12dc423247b4add70dbc79bc77b1af/virtualbox/cpi.yml#L10-L14)で確認できます。

```
bosh upload-stemcell https://bosh.io/d/stemcells/bosh-warden-boshlite-ubuntu-trusty-go_agent?v=3468.13
```

#### CFCRのデプロイ


いよいよCFCR(まだ名前は[kubo-release](https://github.com/cloudfoundry-incubator/kubo-release))をデプロイします。
マニフェストは[kubo-deployment](https://github.com/cloudfoundry-incubator/kubo-deployment)で管理されています。
この記事の内容はv0.11.0でしか動かないので、`v0.11.0`タグに切り替えます。

```
cd ~/bosh-manifests
git submodule add git@github.com:cloudfoundry-incubator/kubo-deployment.git 
cd kubo-deployment
git checkout v0.11.0
cd ..
```


`kubo-deployment/manifests/cfcr.yml`がメインなのですが、BOSH Liteでv0.11.0を動かすために次の5つのops-fileを作成します。

1. Stemcellのバージョンを3468.13に固定するops-file (デフォルトで`latest`が指定されているが、cfcr以外で使うstemcellと衝突しないように明示する)
1. `kubo-release`のバージョンを0.11.0に固定するops-file
1. masterにStatic IPを指定するためのops-file
1. workerにStatic IPを指定するためのops-file (Serviceで`type: LoadBalancer`は使用できないので、`type: NodePort`を便利に使うためworkerのIPを固定する)
1. workerのインスタンス数(デフォルトで3)を1に減らすops-file (BOSH Liteは1 VMで動くのでworkerを複数台にする意味があまりない)

> CFCR v0.11.0はControllerとEtcdを1つのMasterノードに同居させます。またMasterのMulti-AZには対応していません。

まとめたファイルを作ってもいいですが、用途別に作って取捨選択できるようにするのがops-fileを作る上で良い作法です。


"Stemcellのバージョンを3468.13に固定するops-file"は次の通り。以下、コピペでファイル作成できます。

``` yaml 
cat <<EOF > ~/bosh-manifests/ops-files/use-specific-stemcell.yml
- type: replace
  path: /stemcells/0/version
  value: ((stemcell_version))
EOF
```

"`kubo-release`のバージョンを0.11.0に固定するops-file"は次の通り。


``` yaml
cat <<EOF > ~/bosh-manifests/ops-files/kubernetes-kubo-0.11.0.yml
- type: replace
  path: /releases/name=kubo
  value:
    name: kubo
    url: https://bosh.io/d/github.com/cloudfoundry-incubator/kubo-release?v=0.11.0
    version: 0.11.0
    sha1: 823ac7fb7b8fa8bc7d10b8dc0f4b052890ae9f59
EOF
```

"masterにStatic IPを指定するためのops-file"は次の通り。

``` yaml
cat <<EOF > ~/bosh-manifests/ops-files/kubernetes-master-static-ips.yml
- type: replace
  path: /instance_groups/name=master/networks/0/static_ips?
  value: [((kubernetes_master_host))]
- type: replace
  path: /variables/name=tls-kubernetes/options/alternative_names/-
  value: ((kubernetes_master_host))
EOF
```

"workerにStatic IPを指定するためのops-file"は次の通り。

``` yaml
cat <<EOF > ~/bosh-manifests/ops-files/kubernetes-worker-static-ips.yml
- type: replace
  path: /instance_groups/name=worker/networks/0/static_ips?
  value: ((kubernetes_worker_hosts))
EOF
```

"workerのインスタンス数を1に減らすops-file"は次の通り。

``` yaml
cat <<EOF > ~/bosh-manifests/ops-files/kubernetes-single-worker.yml
- type: replace
  path: /instance_groups/name=worker/instances
  value: 1
EOF
```

masterとworkerのStatic IPはCloud Configに設定した[`static`のレンジ](https://github.com/cloudfoundry/cf-deployment/blob/488e24dd8a2551e3a9e8695147c748e1e9d7d951/iaas-support/bosh-lite/cloud-config.yml#L30-L34)の中から空いているIPを選択してください。

```
cd ~/bosh-manifests
bosh deploy -d cfcr kubo-deployment/manifests/cfcr.yml \
            -o ops-files/use-specific-stemcell.yml \
            -o ops-files/kubernetes-kubo-0.11.0.yml \
            -o ops-files/kubernetes-master-static-ips.yml \
            -o ops-files/kubernetes-worker-static-ips.yml \
            -o ops-files/kubernetes-single-worker.yml \
            -v stemcell_version="3468.13" \
            -v kubernetes_master_host=10.244.1.92 \
            -v kubernetes_worker_hosts='["10.244.1.93"]' \
            --no-redact
```

BOSH Releaseのダウンロードが完了すれば補間されたマニフェストファイルが表示され、`Continue? [yN]:`と聞かれるので`y`を入力してください。

`bosh deploy`が始まるとkuberntesやetcd、dockerなどKubernetesに必要なコンポーネントのコンパイルが始まります。
コンパイルが終わると、VM(BOSH-Liteの場合はコンテナ)が立ち上がり、Stemcellの上にコンパイルしたコンポーネントを乗せ、プロセスを起動させます。

次のようなログが出力されればデプロイ成功です。

```
Task 6

Task 6 | 13:17:18 | Preparing deployment: Preparing deployment (00:00:07)
Task 6 | 13:17:27 | Preparing package compilation: Finding packages to compile (00:00:00)
Task 6 | 13:17:27 | Compiling packages: socat/5737907822eb2c5ab7aa509d699acc566f349b7e86d8a8d176037b90d3427dbe
Task 6 | 13:17:27 | Compiling packages: ctop/e5f579167182e9a1587c2346f4e84bad2c445c2e
Task 6 | 13:17:27 | Compiling packages: golang-1.8-linux/1509998fbf5c66cb8fc361a479beafb41ef8cc14
Task 6 | 13:17:27 | Compiling packages: docker/238a6e226d78accc4ca870d3db43e4bfecf4f213
Task 6 | 13:17:27 | Compiling packages: bosh-helpers/a616966453683545eb0e28d88da5a951f5f110ae
Task 6 | 13:17:27 | Compiling packages: govc/6346e96cef8082e05e975b0b7c8b4c2a6d62cb8756b24fce2590909a28e96d34
Task 6 | 13:18:17 | Compiling packages: bosh-helpers/a616966453683545eb0e28d88da5a951f5f110ae (00:00:50)
Task 6 | 13:18:17 | Compiling packages: golang/2206cd4937e897c2a6639f93db9683a529b73e5c
Task 6 | 13:18:23 | Compiling packages: ctop/e5f579167182e9a1587c2346f4e84bad2c445c2e (00:00:56)
Task 6 | 13:18:23 | Compiling packages: etcd/4206d555a094bc1f775fe5eedbb146c1a0de0a3e
Task 6 | 13:18:24 | Compiling packages: govc/6346e96cef8082e05e975b0b7c8b4c2a6d62cb8756b24fce2590909a28e96d34 (00:00:57)
Task 6 | 13:18:24 | Compiling packages: etcd-common/0f365b3a98184c2a6537efd51f67e8d5e9d2c486 (00:00:01)
Task 6 | 13:18:25 | Compiling packages: jq/55d30ecb3391824ac6730632fbd1e101e3e967ff7aee3166b5163f47c2cde074 (00:00:03)
Task 6 | 13:18:28 | Compiling packages: kubernetes/43cb587e6cf7665ff51f7aad84a4486c27ae7e15890d7cc1163c36a85b8b967e
Task 6 | 13:18:32 | Compiling packages: etcd/4206d555a094bc1f775fe5eedbb146c1a0de0a3e (00:00:09)
Task 6 | 13:18:32 | Compiling packages: cni/5284a9c9bbd9f069d015a2cef88f61e352fe8a8eb0cd07000d84d983b4dfc730 (00:00:15)
Task 6 | 13:18:47 | Compiling packages: flanneld/24ad5204e0ccb6f6a49d76b4c0b839d0a3518c20096e30dc864e637e75070b9f
Task 6 | 13:18:52 | Compiling packages: docker/238a6e226d78accc4ca870d3db43e4bfecf4f213 (00:01:25)
Task 6 | 13:18:52 | Compiling packages: etcdctl/4e7dc7e0ad2d3a324a9d5544ca294bc72939391a3304b55385b768fb303a01dc
Task 6 | 13:18:52 | Compiling packages: flanneld/24ad5204e0ccb6f6a49d76b4c0b839d0a3518c20096e30dc864e637e75070b9f (00:00:05)
Task 6 | 13:18:52 | Compiling packages: pid_utils/a2a905d267548c461ccf91937963ff7d26356f8f2edd928490ba529d0cc94aa4 (00:00:02)
Task 6 | 13:18:55 | Compiling packages: etcdctl/4e7dc7e0ad2d3a324a9d5544ca294bc72939391a3304b55385b768fb303a01dc (00:00:03)
Task 6 | 13:19:48 | Compiling packages: socat/5737907822eb2c5ab7aa509d699acc566f349b7e86d8a8d176037b90d3427dbe (00:02:21)
Task 6 | 13:19:49 | Compiling packages: golang-1.8-linux/1509998fbf5c66cb8fc361a479beafb41ef8cc14 (00:02:22)
Task 6 | 13:19:49 | Compiling packages: bosh-dns/4a31fa2f1e36764fca50862fba944d2b546aa33d
Task 6 | 13:20:02 | Compiling packages: golang/2206cd4937e897c2a6639f93db9683a529b73e5c (00:01:45)
Task 6 | 13:20:02 | Compiling packages: etcd-dns-checker/aa192138b758a2ecd9f7046ee8d321344b14b1d3
Task 6 | 13:20:02 | Compiling packages: etcdfab/4f84f7856e7b2b120c70cab85df3d5ad5fd5adac
Task 6 | 13:20:02 | Compiling packages: etcd-consistency-checker/ca2e79c9ac1267247787582ffcf045f57d120390 (00:00:30)
Task 6 | 13:20:34 | Compiling packages: etcd-dns-checker/aa192138b758a2ecd9f7046ee8d321344b14b1d3 (00:00:32)
Task 6 | 13:20:47 | Compiling packages: etcdfab/4f84f7856e7b2b120c70cab85df3d5ad5fd5adac (00:00:45)
Task 6 | 13:20:50 | Compiling packages: bosh-dns/4a31fa2f1e36764fca50862fba944d2b546aa33d (00:01:01)
Task 6 | 13:20:54 | Compiling packages: kubernetes/43cb587e6cf7665ff51f7aad84a4486c27ae7e15890d7cc1163c36a85b8b967e (00:02:26)
Task 6 | 13:20:56 | Creating missing vms: master/69a27adc-70bd-45e2-b1b6-7638395cc5ec (0)
Task 6 | 13:20:56 | Creating missing vms: worker/5be6eacd-1a17-46e9-ac8a-20d1f50228e0 (0) (00:01:04)
Task 6 | 13:22:01 | Creating missing vms: master/69a27adc-70bd-45e2-b1b6-7638395cc5ec (0) (00:01:05)
Task 6 | 13:22:01 | Updating instance master: master/69a27adc-70bd-45e2-b1b6-7638395cc5ec (0) (canary) (00:01:45)
Task 6 | 13:23:47 | Updating instance worker: worker/5be6eacd-1a17-46e9-ac8a-20d1f50228e0 (0) (canary) (00:03:23)

Task 6 Started  Sat Jan  6 13:17:18 UTC 2018
Task 6 Finished Sat Jan  6 13:27:10 UTC 2018
Task 6 Duration 00:09:52
Task 6 done

Succeeded
```

`bosh vms`でBOSHで管理されているVM一覧を確認してください。

```
$ bosh vms
Using environment '192.168.50.6' as client 'admin'

Task 7. Done

Deployment 'cfcr'

Instance                                     Process State  AZ  IPs          VM CID                                VM Type  
master/69a27adc-70bd-45e2-b1b6-7638395cc5ec  running        z1  10.244.1.92  996c0440-a3d5-4087-54f0-60cee98004e7  small  
worker/5be6eacd-1a17-46e9-ac8a-20d1f50228e0  running        z1  10.244.1.93  c9d60e0d-6567-4097-7164-3ac36f97b999  small-highmem  

2 vms

Succeeded
```

`bosh instances --ps`で各VM上で動いているプロセス一覧を表示できます。

```
$ bosh instances --ps
Using environment '192.168.50.6' as client 'admin'

Task 8. Done

Deployment 'cfcr'

Instance                                     Process                        Process State  AZ  IPs  
master/69a27adc-70bd-45e2-b1b6-7638395cc5ec  -                              running        z1  10.244.1.92  
~                                            bosh-dns                       running        -   -  
~                                            bosh-dns-healthcheck           running        -   -  
~                                            bosh-dns-resolvconf            running        -   -  
~                                            etcd                           running        -   -  
~                                            etcd_consistency_checker       running        -   -  
~                                            flanneld                       running        -   -  
~                                            kubernetes-api                 running        -   -  
~                                            kubernetes-controller-manager  running        -   -  
~                                            kubernetes-scheduler           running        -   -  
worker/5be6eacd-1a17-46e9-ac8a-20d1f50228e0  -                              running        z1  10.244.1.93  
~                                            bosh-dns                       running        -   -  
~                                            bosh-dns-healthcheck           running        -   -  
~                                            bosh-dns-resolvconf            running        -   -  
~                                            docker                         running        -   -  
~                                            flanneld                       running        -   -  
~                                            kubelet                        running        -   -  
~                                            kubernetes-proxy               running        -   -  

18 instances

Succeeded
```


#### Kubernetesにアクセス

デプロイしたKubernetesにアクセスしましょう。

まずはBOSH Liteのネットワーク(`10.244.0.0/20`)にアクセスするためのルーティングの設定が必要です。

```
# Macの場合
sudo route add -net 10.244.0.0/16 192.168.50.6
# Linuxの場合
sudo route add -net 10.244.0.0/16 gw 192.168.50.6
```

adminのパスワードやコンポーネント間のTLS証明書などはCredHubに保存されています。


CredHubには次のコマンドでログインできます。

```
credhub login \
        -s 192.168.50.6:8844 \
        -u credhub-cli \
        -p `bosh int ~/bosh-manifests/bosh-lite-creds.yml --path /credhub_cli_password` \
        --ca-cert <(bosh int ~/bosh-manifests/bosh-lite-creds.yml --path /uaa_ssl/ca) \
        --ca-cert <(bosh int ~/bosh-manifests/bosh-lite-creds.yml --path /credhub_ca/ca)
```

CredHubに登録されているCredentialsは次の通りです。

```
$ credhub find
credentials:
- name: /dns_healthcheck_client_tls
  version_created_at: 2018-01-06T13:17:22Z
- name: /dns_healthcheck_server_tls
  version_created_at: 2018-01-06T13:17:22Z
- name: /dns_healthcheck_tls_ca
  version_created_at: 2018-01-06T13:17:22Z
- name: /bosh-lite/cfcr/tls-etcd-client
  version_created_at: 2018-01-06T13:17:21Z
- name: /bosh-lite/cfcr/tls-etcd-server
  version_created_at: 2018-01-06T13:17:21Z
- name: /bosh-lite/cfcr/tls-docker
  version_created_at: 2018-01-06T13:17:21Z
- name: /bosh-lite/cfcr/tls-kubernetes
  version_created_at: 2018-01-06T13:17:21Z
- name: /bosh-lite/cfcr/tls-kubelet
  version_created_at: 2018-01-06T13:17:21Z
- name: /bosh-lite/cfcr/kubo_ca
  version_created_at: 2018-01-06T13:17:20Z
- name: /bosh-lite/cfcr/route-sync-password
  version_created_at: 2018-01-06T13:17:20Z
- name: /bosh-lite/cfcr/kube-scheduler-password
  version_created_at: 2018-01-06T13:17:20Z
- name: /bosh-lite/cfcr/kube-proxy-password
  version_created_at: 2018-01-06T13:17:20Z
- name: /bosh-lite/cfcr/kubelet-password
  version_created_at: 2018-01-06T13:17:20Z
- name: /bosh-lite/cfcr/kubo-admin-password
  version_created_at: 2018-01-06T13:17:19Z
```

adminのパスワードは`credhub get -n /bosh-lite/cfcr/kubo-admin-password`で取得できます。

```
admin_password=`credhub get -n /bosh-lite/cfcr/kubo-admin-password | bosh int --path /value -`
```

```
export admin_password=$(credhub get -n /bosh-lite/cfcr/kubo-admin-password | bosh int --path /value -)
export master_host=10.244.1.92
export cluster_name=cfcr
export user_name=cfcr-admin
export context_name=cfcr

kubectl config set-cluster "${cluster_name}" --server="https://${master_host}:8443"   --insecure-skip-tls-verify=true
kubectl config set-credentials "${user_name}" --token="${admin_password}"
kubectl config set-context "${context_name}" --cluster="${cluster_name}" --user="${user_name}"
kubectl config use-context "${context_name}"
```

これでKubernetesにアクセスできます。

```
$ kubectl get node -o wide

NAME          STATUS    AGE       VERSION   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION
10.244.1.93   Ready     31m       v1.8.4    <none>        Ubuntu 14.04.5 LTS   4.4.0-103-generic
 
$ kubectl get all -n kube-system

NAME                                       READY     STATUS    RESTARTS   AGE
po/heapster-776fb9d89b-l75w9               1/1       Running   0          30m
po/kube-dns-9dc479d4f-6c8p6                3/3       Running   0          30m
po/kubernetes-dashboard-789b8cfdb7-jsnwb   1/1       Running   0          30m
po/monitoring-influxdb-c577bbf7-n2jvv      1/1       Running   0          30m

NAME                       CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
svc/heapster               10.100.200.56    <none>        80/TCP            30m
svc/kube-dns               10.100.200.10    <none>        53/UDP,53/TCP     30m
svc/kubernetes-dashboard   10.100.200.200   <none>        80/TCP            30m
svc/monitoring-influxdb    10.100.200.242   <none>        80/TCP,8086/TCP   30m

NAME                          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/heapster               1         1         1            1           30m
deploy/kube-dns               1         1         1            1           30m
deploy/kubernetes-dashboard   1         1         1            1           30m
deploy/monitoring-influxdb    1         1         1            1           30m

NAME                                 DESIRED   CURRENT   READY     AGE
rs/heapster-776fb9d89b               1         1         1         30m
rs/kube-dns-9dc479d4f                1         1         1         30m
rs/kubernetes-dashboard-789b8cfdb7   1         1         1         30m
rs/monitoring-influxdb-c577bbf7      1         1         1         30m
```

`kubectl proxy`で[http://localhost:8001/ui](http://localhost:8001/ui)にアクセスできます。

![image](https://user-images.githubusercontent.com/106908/34640465-608076fe-f336-11e7-97df-b322023a7ad8.png)


#### サンプルアプリのデプロイ

サンプルアプリをデプロイしてNode Portで公開します。

``` yaml
cat <<EOF | kubectl apply -f - 
apiVersion: v1
kind: Service
metadata:
  name: kuar
  namespace: default
spec:
  type: NodePort
  ports:
    - name: http
      protocol: TCP
      port: 8080
  selector:
    app: kuar
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kuar
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: kuar
  template:
    metadata:
      labels:
        app: kuar
    spec:
      containers:
      - name: kuar
        image: gcr.io/kuar-demo/kuard-amd64:1
        ports:
        - containerPort: 8080
EOF
```

次の結果を見れば`32300`ポートで公開されました。

```
$ kubectl get all -o wide
NAME                       READY     STATUS    RESTARTS   AGE       IP            NODE
po/kuar-778cf749cf-8mrjh   1/1       Running   0          44s       10.200.30.7   10.244.1.93
po/kuar-778cf749cf-rzndc   1/1       Running   0          44s       10.200.30.6   10.244.1.93

NAME             CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE       SELECTOR
svc/kuar         10.100.200.207   <nodes>       8080:32300/TCP   44s       app=kuar
svc/kubernetes   10.100.200.1     <none>        443/TCP          45m       <none>

NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINER(S)   IMAGE(S)                         SELECTOR
deploy/kuar   2         2         2            2           44s       kuar           gcr.io/kuar-demo/kuard-amd64:1   app=kuar

NAME                 DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                         SELECTOR
rs/kuar-778cf749cf   2         2         2         44s       kuar           gcr.io/kuar-demo/kuard-amd64:1   app=kuar,pod-template-hash=3347930579
```

`http://(worker_host):32300`でアプリケーションにアクセスできます。この記事ではworker_hostは`10.244.1.93`です。

![image](https://user-images.githubusercontent.com/106908/34640535-7cde91ea-f337-11e7-9d7f-ec8a9e4c84bb.png)


----

CFCRをBOSH Liteにデプロイする方法を紹介しました。

サーバー上にCFCR on BOSH Liteをデプロイする場合はmasterの8443ポートに対してport forwardするかHA Proxyを用意すれば、サーバー外からこのKubernetesクラスタにアクセスできます。

次はこの環境の上にFaaSの[riff](https://projectriff.io/)をデプロイする方法を紹介します。
