---
title: Kubo(Kubernetes on BOSH)をAWSにデプロイ
tags: ["Kubo", "BOSH", "Kubernetes", "AWS"]
categories: ["Dev", "CaaS", "Kubernetes"]
date: 2017-09-30T20:01:16Z
updated: 2017-09-30T20:28:25Z
---

**目次**

<!-- toc -->

### Kuboとは

KuboはKubernetesの[BOSH](https://bosh.io) Releaseです。BOSHを利用して、Kubernetesのデプロイ、運用を行うことができます。


* https://docs-kubo.cfapps.io/
* https://pivotal.io/jp/partners/kubo
* https://github.com/cloudfoundry-incubator/kubo-deployment

Cloud Foundry Foundationで共同開発されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/ed1bb4ed-dfdd-ed0c-60f5-700b0fd23e61.png)

BOSHはCloud Foundryの運用において長く使用されているツールです。

BOSHもKubernetesもGoogleのBorgを起源としており、Kubernetesがコンテナの管理をするのに対して、BOSHは同じように、その下のVMの管理を行います。

BOSHを使用することにより、

* マルチクラウド環境(GCP, AWS, Azure, vSphere, OpenStack)にデプロイできる (クラスタを分散できるわけではありません)
* Day 1 Operation(k8sクラスタのインストール、デプロイ)だけでなく、Day 2 Operation(k8sクラスタ自体の自動復旧、スケールアウト、Multi-AZ対応、ローリングアップデート)に対応できる

などのメリットがあり、他のKubernetesデプロイツールとの違いになっています。

GKEやACSのようなManaged Kubernetesが使えない場合や、パブリッククラウドとオンプレミスで同じ環境を使いたい場合の魅力的な選択肢になるかと思います。


本記事の執筆時点ではKubo(v0.7.0)は

* GCP
* vSphere
* OpenStack
* AWS

に対応しています。


以下はAWSにKuboをデプロイした時のメモです。

使用したcommitは

* [`kubo-deployment＠7ac26aaee48300f4e69b538c2c75a0488b884cf2`](https://github.com/cloudfoundry-incubator/kubo-deployment/tree/7ac26aaee48300f4e69b538c2c75a0488b884cf2)
です。

基本的には[ドキュメント](https://docs-kubo.cfapps.io)の通りですが、一部やりやすいように変更しています.


KuboをAWSにデプロイした場合のデフォルト構成は最終的に次の図のようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/ffe3fc18-ead4-9389-1455-9d35bbd3903b.png)


### VPCの作成

https://docs-kubo.cfapps.io/installing/aws/

AWSにBOSHをデプロイするための下準備をします。

まずはVPC作成。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1852/c08df3a9-10b0-d5f6-8014-afe878a889d2.png" width="60%" />

「DNS 解決」が有効になっていることを確認してください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1852/e4b5f61e-1bc1-ffc9-220d-4e16caa4fc26.png" width="60%" />

<img src="https://qiita-image-store.s3.amazonaws.com/0/1852/325b1f0c-360e-3930-a338-77eb75ff9368.png" width="60%" />

次にキーペア作成。ここでは`deployer`と言う名前にしておきます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1852/bac213c0-c9e0-959b-9ead-d2321ba4f7dc.png" width="60%" />


現状の図は次の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/7198325b-8fd7-7827-095b-c17d6561b6a3.png)


### AWS環境構築

`deployer.pem`を手元の環境の`~/kubo-workspace/`に配置し、

```
mkdir ~/kubo-workspace/
mv ~/deployer.pem ~/kubo-workspace/
chmod 600 ~/kubo-workspace/deployer.pem
```

terraformを使って、AWS環境をセットアップします。

AWSの情報を環境変数に設定します。

```
export prefix=makikubo-

export AWS_ACCESS_KEY_ID=xxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxx
export vpc_id=xxxxxx
export key_name=deployer # name of private key to use on Kubo VMs
export private_key_filename="~/kubo-workspace/${key_name}.pem" # private key to use on Kubo VMs
export region=ap-northeast-1 # region that you will deploy Kubo in
export zone=ap-northeast-1a # zone that you will deploy Kubo in
export public_subnet_ip_prefix="10.0.1" # subnet that will be used for bastion VM, NAT Gateway and load balancers
export private_subnet_ip_prefix="10.0.2" # subnet that will be used for Kubo VMs and BOSH director
export kubo_terraform_state=~/kubo-workspace/terraform.tfstate
```

terraformを実行します。

```
wget https://storage.googleapis.com/kubo-public/kubo-deployment-latest.tgz
tar -xvf kubo-deployment-latest.tgz
cd kubo-deployment/docs/user-guide/platforms/aws

terraform init

terraform apply \
  -var region="${region}" \
  -var zone="${zone}" \
  -var vpc_id="${vpc_id}" \
  -var prefix="${prefix}" \
  -var public_subnet_ip_prefix="${public_subnet_ip_prefix}" \
  -var private_subnet_ip_prefix="${private_subnet_ip_prefix}" \
  -var private_key_filename="${private_key_filename}" \
  -var key_name="${key_name}" \
  -state=${kubo_terraform_state}
```

publicとprivateの2つのサブネットが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/2b1d2b5b-376f-6dc8-d45f-3d4090e74f82.png)

それぞれのルートテーブルが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/95f85ff6-98a4-c540-2a76-c431a27639b6.png)

publicサブネットのルートテーブルはインターネットゲートウェイに繋がっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/2bd6a4ad-552a-58e8-319a-a961aeeacbc0.png)

privateサブネットのルーテテーブルはNATゲートウェイに繋がっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/d89e26b6-d18e-a382-4006-52eaf1ffa3fc.png)

Bastion(踏み台)サーバーのインスタンスが立ち上がります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/f743905d-1bd1-2a11-eca5-2663f054f553.png)

Worker VM向けのセキュリティグループが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/d54549ea-d249-8c6a-e897-15a631f27859.png)


現状の図は次の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/11198601-b436-2497-a9ad-8c47060d4c30.png)


### BOSH Directorのデプロイ

次にBOSH(Director VM)をデプロイします。

https://docs-kubo.cfapps.io/installing/aws/deploying-bosh-aws/

これ以降はBastion(踏み台)サーバーで作業します。

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

```
export kubo_terraform_state=~/kubo-workspace/terraform.tfstate
cd $(dirname $kubo_terraform_state)
ssh -i ~/kubo-workspace/deployer.pem ubuntu@$(terraform output bosh-bastion-ip)
```

手順自動化のため、`awscli`と`jq`をインストールしておきます。

```
sudo apt-get install awscli jq
```

AWSの設定を行います。

```
$ aws configure
AWS Access Key ID [None]: ****
AWS Secret Access Key [None]: ****
Default region name [None]: ap-northeast-1
Default output format [None]: 
```

まずはKuboをデプロイするための設定ファイルテンプレートを生成します。

```
cd /share/kubo-deployment

export kubo_envs=~/kubo-env
export kubo_env_name=kubo
export kubo_env_path="${kubo_envs}/${kubo_env_name}"

mkdir -p "${kubo_envs}"
./bin/generate_env_config "${kubo_envs}" "${kubo_env_name}" aws
```

Kubo用のIAMユーザーを作成します。


```
aws iam create-user --user-name "kubo-user"

policy=`cat <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:AssociateAddress",
                "ec2:AttachVolume",
                "ec2:CreateVolume",
                "ec2:DeleteSnapshot",
                "ec2:DeleteVolume",
                "ec2:DescribeAddresses",
                "ec2:DescribeImages",
                "ec2:DescribeInstances",
                "ec2:DescribeRegions",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSnapshots",
                "ec2:DescribeSubnets",
                "ec2:DescribeVolumes",
                "ec2:DetachVolume",
                "ec2:CreateSnapshot",
                "ec2:CreateTags",
                "ec2:RunInstances",
                "ec2:TerminateInstances",
                "ec2:RegisterImage",
                "ec2:DeregisterImage",
                "elasticloadbalancing:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "$(aws iam get-user --user-name "kubo-user" | jq -r ".User.Arn" | sed 's|user/kubo-user|role/*kubo*|')"
        }
    ]
}
EOF`

aws iam put-user-policy --user-name "kubo-user" \
    --policy-name "kubo-policy" \
    --policy-document "$policy"

aws iam create-access-key --user-name "kubo-user" > access-key.json
```

作成したIAMユーザー情報を設定ファイルに反映します。

```
sed -i "s/access_key_id:/access_key_id: $(jq -r .AccessKey.AccessKeyId access-key.json)/" ${kubo_env_path}/director-secrets.yml
sed -i "s/secret_access_key:/secret_access_key: $(jq -r .AccessKey.SecretAccessKey access-key.json)/" ${kubo_env_path}/director-secrets.yml
```

いよいよBOSH(Director VM)をデプロイします。

```
./bin/deploy_bosh "${kubo_env_path}" ~/deployer.pem
```

デプロイが完了すると`bosh/0`という名前のVMが立ち上がります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/1c1a9251-9dbe-8371-15c8-d0d0c16fc80c.png)

プロダクション向けの設定で`m4.xlarge`が使われており、検証用途にはちょっと大きいため、
次のvm typeを変更するoperation file(yamlのpatchファイル)を作成します。

```
mkdir ${HOME}/custom-ops-files
cat <<EOF > ${HOME}/custom-ops-files/director-size-aws.yml
- type: replace
  path: /resource_pools/name=vms/cloud_properties/instance_type
  value: t2.small
EOF
```

`deploy_bosh`スクリプトでは`bosh create-env`の追加オプションを環境変数`BOSH_EXTRA_OPS`で設定できます。
これを設定して再度デプロイします。

```
export BOSH_EXTRA_OPS="--ops-file ${HOME}/custom-ops-files/director-size-aws.yml "

/share/kubo-deployment/bin/deploy_bosh "${kubo_env_path}" ~/deployer.pem
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/8ef32418-33bd-6e93-c100-982e1ca9bfc2.png)


BOSH Directorの情報を環境変数に設定します。

```
BOSH_ENV=~/kubo-env/kubo . /share/kubo-deployment/bin/set_bosh_environment
```

BOSH Directorにログインします。

```
$ bosh-cli env
Using environment '10.0.2.252' as client 'bosh_admin'

Name      makikubo-bosh                         
UUID      56abcae9-2fca-4a97-a9c9-93fe02236e83  
Version   263.0.0 (00000000)                    
CPI       aws_cpi                               
Features  compiled_package_cache: disabled      
          config_server: enabled                
          dns: enabled                          
          snapshots: disabled                   
User      bosh_admin                            

Succeeded

$ bosh-cli log-in
Successfully authenticated with UAA

Succeeded
```


現状の図は次の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/7669d3a6-6ad7-edc3-ffdc-f76d0f7679c9.png)

### Kuboのルーティングの設定

https://docs-kubo.cfapps.io/installing/aws/routing-aws/

Kuboへルーティング(LB)をIaaSのものにするか、Cloud Foundryのものにするかを設定できます。
ここではIaaSのもの(ELB)を使用します。

```
export kubo_env_name=kubo
cd /share/kubo-deployment/docs/user-guide/routing/aws
export state_dir=~/kubo-env/${kubo_env_name}
export kubo_terraform_state=${state_dir}/terraform.tfstate
export AWS_ACCESS_KEY_ID=`jq -r .AccessKey.AccessKeyId /share/kubo-deployment/access-key.json `
export AWS_SECRET_ACCESS_KEY=`jq -r .AccessKey.SecretAccessKey /share/kubo-deployment/access-key.json`

terraform init

terraform apply \
   -var region=${region} \
   -var vpc_id=${vpc_id} \
   -var node_security_group_id=${default_security_groups} \
   -var public_subnet_id=${public_subnet_id} \
   -var prefix=${prefix} \
   -state=${kubo_terraform_state}
```

Master VM向けのセキュリティグループが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/48f60ee0-da8e-0211-965f-5c52230dba1c.png)

Master API向けのELBが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/4b198c3e-64ad-06ae-897e-f3075bbc8f0e.png)

設定ファイルに反映します。

```
export master_target_pool=$(terraform output -state=${kubo_terraform_state} kubo_master_target_pool) 
export kubernetes_master_host=$(terraform output -state=${kubo_terraform_state} master_lb_ip_address) 

. /share/kubo-deployment/docs/user-guide/platforms/aws/setup_helpers
set_iaas_routing "${state_dir}/director.yml"
```

現状の図は次の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/b1d58f08-dd07-53e9-7cdc-7ecb905892f7.png)


### Kuboのデプロイ

https://docs-kubo.cfapps.io/installing/deploying-kubo/

いよいよKuboのデプロイです。

```
/share/kubo-deployment/bin/deploy_k8s ~/kubo-env/kubo kubo
```

デプロイが完了したら、`bosh-cli`で確認します。

```
$ bosh-cli vms
Using environment '10.0.2.252' as client 'bosh_admin'

Task 6. Done

Deployment 'kubo'

Instance                                     Process State  AZ  IPs        VM CID               VM Type  
etcd/5a1ee552-f94d-4665-81ac-2deb1ee3ab0b    running        z1  10.0.2.5   i-01d38a8c93b919da9  common   
etcd/ba5d02c0-b80e-4092-976b-35a9f9718689    running        z1  10.0.2.6   i-09135355fb58155c5  common   
etcd/d4f49a10-6ba8-486b-9377-23fd91320b03    running        z1  10.0.2.4   i-0a989f01671b9eadc  common   
master/1b3e37b7-0641-43f2-81b9-5712085341ad  running        z1  10.0.2.8   i-0fa89c32ca7cfe3d4  master   
master/ca143c0a-aeb3-44a1-b77a-466c4e3a74eb  running        z1  10.0.2.7   i-070d791c1067fef9a  master   
worker/0663c9ee-80d2-44ce-b425-c4f4255d1340  running        z1  10.0.2.10  i-0f9c6b24a259c38d0  worker   
worker/0deaac05-1c0d-4fdd-b9c8-8bc72cbedd4d  running        z1  10.0.2.9   i-0191c6eeb9bac4893  worker   
worker/7efb6037-6e55-460d-8971-e569c2d903cd  running        z1  10.0.2.11  i-079f6d7f1d1407ee6  worker   

8 vms

Succeeded
```

etcdが3台、masterが2台、workerが3台デプロイされます。

![vms](https://qiita-image-store.s3.amazonaws.com/0/1852/aa97e766-33b0-77e6-5616-6c3724356462.png)

また使用されているBOSH Releaseは次の通りです。

```
$ bosh-cli releases
Using environment '10.0.2.252' as client 'bosh_admin'

Name       Version       Commit Hash  
docker     28.0.1*       8096ad43+    
kubo       0.8.0-dev.7*  529e961      
kubo-etcd  2*            aa57fc9      

(*) Currently deployed
(+) Uncommitted changes

3 releases

Succeeded
```

現状の図は次の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/ffe3fc18-ead4-9389-1455-9d35bbd3903b.png)

### Kubernetesへのアクセス

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

```
/share/kubo-deployment/bin/set_kubeconfig ~/kubo-env/kubo kubo
```

`~/.kube/config`が更新されました。これで`kubectl`を使ってアクセス可能です。


```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.6", GitCommit:"4bc5e7f9a6c25dc4c03d4d656f2cefd21540e28c", GitTreeState:"clean", BuildDate:"2017-09-14T06:55:55Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5", GitCommit:"17d7182a7ccbb167074be7a87f0a68bd00d58d97", GitTreeState:"clean", BuildDate:"2017-08-31T08:56:23Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl get pods --namespace=kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
heapster-932399794-5jskb                1/1       Running   0          8m
kube-dns-3329716278-k301f               3/3       Running   0          8m
kubernetes-dashboard-1367211859-kdgxb   1/1       Running   0          8m
monitoring-influxdb-564852376-sqr9s     1/1       Running   0          8m

$ kubectl get node -o wide
NAME                                           STATUS    AGE       VERSION   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION
ip-10-0-2-10.ap-northeast-1.compute.internal   Ready     11m       v1.7.5    <none>        Ubuntu 14.04.5 LTS   4.4.0-83-generic
ip-10-0-2-11.ap-northeast-1.compute.internal   Ready     9m        v1.7.5    <none>        Ubuntu 14.04.5 LTS   4.4.0-83-generic
ip-10-0-2-9.ap-northeast-1.compute.internal    Ready     13m       v1.7.5    <none>        Ubuntu 14.04.5 LTS   4.4.0-83-generic
```

### アプリケーションのデプロイ

簡単なアプリケーションをデプロイします。次の`hello-tomcat.yml`を作成します。

``` yaml
kind: Service
apiVersion: v1
metadata:
  name: hello-tomcat-service
spec:
  selector:
    run: hello-tomcat
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
  type: LoadBalancer
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: hello-tomcat-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: hello-tomcat
    spec:
      containers:
      - name: hello-tomcat
        image: making/hello-tomcat:v1
        ports:
        - containerPort: 8080
```

デプロイします。

```
kubectl apply -f hello-tomcat.yml
```

しばらくするとデプロイ完了します。

```
$ kubectl get pods
NAME                                       READY     STATUS    RESTARTS   AGE
hello-tomcat-deployment-1598259564-m9n0f   1/1       Running   0          5m
hello-tomcat-deployment-1598259564-wrqmd   1/1       Running   0          5m

$ kubectl get service hello-tomcat-service -o wide
NAME                   CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)          AGE       SELECTOR
hello-tomcat-service   10.100.200.94   abb39b003a46f11e7bffe06e0da5997d-1028762931.ap-northeast-1.elb.amazonaws.com   8080:32742/TCP   5m        run=hello-tomcat
```

ServiceがELBに紐付いていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/f0a12860-e0e7-ec2a-6f0f-ddd728dc2376.png)

アクセスしてみます。

```
$ curl http://abb39b003a46f11e7bffe06e0da5997d-1028762931.ap-northeast-1.elb.amazonaws.com:8080/
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>


$ curl http://abb39b003a46f11e7bffe06e0da5997d-1028762931.ap-northeast-1.elb.amazonaws.com:8080/env
HELLO_TOMCAT_SERVICE_SERVICE_HOST: 10.100.200.94
PATH: /usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT: tcp://10.100.200.1:443
JAVA_HOME: /docker-java-home/jre
CA_CERTIFICATES_JAVA_VERSION: 20161107~bpo8+1
KUBERNETES_SERVICE_HOST: 10.100.200.1
LANG: C.UTF-8
TOMCAT_MAJOR: 8
TOMCAT_VERSION: 8.5.15
LD_LIBRARY_PATH: /usr/local/tomcat/native-jni-lib
OPENSSL_VERSION: 1.1.0e-2
HELLO_TOMCAT_SERVICE_PORT_8080_TCP_PROTO: tcp
TOMCAT_NATIVE_LIBDIR: /usr/local/tomcat/native-jni-lib
PWD: /usr/local/tomcat
JAVA_VERSION: 8u131
KUBERNETES_PORT_443_TCP: tcp://10.100.200.1:443
TOMCAT_TGZ_URL: https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-8/v8.5.15/bin/apache-tomcat-8.5.15.tar.gz
KUBERNETES_PORT_443_TCP_ADDR: 10.100.200.1
HELLO_TOMCAT_SERVICE_PORT_8080_TCP_ADDR: 10.100.200.94
CATALINA_HOME: /usr/local/tomcat
HELLO_TOMCAT_SERVICE_PORT: tcp://10.100.200.94:8080
KUBERNETES_PORT_443_TCP_PROTO: tcp
HELLO_TOMCAT_SERVICE_SERVICE_PORT: 8080
HELLO_TOMCAT_SERVICE_PORT_8080_TCP_PORT: 8080
KUBERNETES_SERVICE_PORT: 443
HOSTNAME: hello-tomcat-deployment-1598259564-wrqmd
JAVA_DEBIAN_VERSION: 8u131-b11-1~bpo8+1
TOMCAT_ASC_URL: https://www.apache.org/dist/tomcat/tomcat-8/v8.5.15/bin/apache-tomcat-8.5.15.tar.gz.asc
KUBERNETES_PORT_443_TCP_PORT: 443
KUBERNETES_SERVICE_PORT_HTTPS: 443
HELLO_TOMCAT_SERVICE_PORT_8080_TCP: tcp://10.100.200.94:8080
GPG_KEYS: 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
HOME: /root
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/01b1c541-bcc5-6e15-3ce8-e24c16a7d870.png)


ロードバランスされることも確認できます。

```
$ for i in `seq 1 10`;do curl -s http://abb39b003a46f11e7bffe06e0da5997d-1028762931.ap-northeast-1.elb.amazonaws.com:8080/env | grep HOSTNAME;done
HOSTNAME: hello-tomcat-deployment-1598259564-wrqmd
HOSTNAME: hello-tomcat-deployment-1598259564-wrqmd
HOSTNAME: hello-tomcat-deployment-1598259564-m9n0f
HOSTNAME: hello-tomcat-deployment-1598259564-wrqmd
HOSTNAME: hello-tomcat-deployment-1598259564-m9n0f
HOSTNAME: hello-tomcat-deployment-1598259564-wrqmd
HOSTNAME: hello-tomcat-deployment-1598259564-wrqmd
HOSTNAME: hello-tomcat-deployment-1598259564-wrqmd
HOSTNAME: hello-tomcat-deployment-1598259564-m9n0f
HOSTNAME: hello-tomcat-deployment-1598259564-m9n0f
```


### Kuboのカスタマイズ

https://docs-kubo.cfapps.io/installing/customizing-kubo/

``deploy_k8s``ではデフォルトの設定が強制されます。
vm typeの変更など、細かい設定変更はBOSH CLIで直接行えます。

BOSH CLIによるデプロイに必要なCloud ConigとKuboのマニフェストファイルを次のコマンドで生成します。

```
cd /share/kubo-deployment
./bin/generate_cloud_config ~/kubo-env/kubo > ~/kubo-env/kubo/cloud-config.yml
./bin/generate_kubo_manifest ~/kubo-env/kubo kubo dummy > ~/kubo-env/kubo/kubo-manifest.yml
```

まずは利用可能な(小さい)VMタイプを追加するためのCloud Configのoperation fileを作成します。

```
cat <<EOF > ${HOME}/custom-ops-files/add-small-vm-types.yml
- type: replace
  path: /vm_types/-
  value:
    cloud_properties:
      ephemeral_disk:
        size: 25000
      instance_type: t2.micro
    name: common-small

- type: replace
  path: /vm_types/-
  value:
    cloud_properties:
      elbs:
      - makikubo-kubo-api
      ephemeral_disk:
        size: 25000
      iam_instance_profile: makikubo-kubo-master
      instance_type: t2.micro
    name: master-small

- type: replace
  path: /vm_types/-
  value:
    cloud_properties:
      ephemeral_disk:
        size: 50000
      iam_instance_profile: makikubo-kubo-worker
      instance_type: m4.large
    name: worker-small
EOF
```

``-o``でこのファイルを指定してCloud Configを更新します。

```
bosh-cli update-cloud-config ~/kubo-env/kubo/cloud-config.yml \
                             -o ~/custom-ops-files/add-small-vm-types.yml 
```

実行結果。

```
$ bosh-cli update-cloud-config ~/kubo-env/kubo/cloud-config.yml \
>                              -o ~/custom-ops-files/add-small-vm-types.yml 
Using environment '10.0.2.252' as client 'bosh_admin'

  vm_types:
+ - cloud_properties:
+     ephemeral_disk:
+       size: 25000
+     instance_type: t2.micro
+   name: common-small
+ - cloud_properties:
+     elbs:
+     - makikubo-kubo-api
+     ephemeral_disk:
+       size: 25000
+     iam_instance_profile: makikubo-kubo-master
+     instance_type: t2.micro
+   name: master-small
+ - cloud_properties:
+     ephemeral_disk:
+       size: 50000
+     iam_instance_profile: makikubo-kubo-worker
+     instance_type: m4.large
+   name: worker-small

Continue? [yN]: y

Succeeded
```

次にKuboで小さいVM Typeを使用するようなoperation file(`use-small-vm-types.yml`)を作成します。

```
cat <<EOF > ${HOME}/custom-ops-files/use-small-vm-types.yml
- type: replace
  path: /instance_groups/name=etcd/vm_type
  value: common-small

- type: replace
  path: /instance_groups/name=master/vm_type
  value: master-small

- type: replace
  path: /instance_groups/name=worker/vm_type
  value: worker-small
EOF
```

次にetcd, master, workerを全て1インスタンスに減らすためのoperation file(`scale-to-one.yml`)を作成します。

```
cat <<EOF > ${HOME}/custom-ops-files/scale-to-one.yml
- type: replace
  path: /instance_groups/name=etcd/instances
  value: 1

- type: replace
  path: /instance_groups/name=master/instances
  value: 1

- type: replace
  path: /instance_groups/name=worker/instances
  value: 1
EOF
```

``use-small-vm-types.yml``と``scale-to-one.yml``を追加して``bosh-cli deploy``します。

```
bosh-cli deploy -d kubo ~/kubo-env/kubo/kubo-manifest.yml \
                -o ~/custom-ops-files/use-small-vm-types.yml \
                -o ~/custom-ops-files/scale-to-one.yml 
```

実行結果。


```
$ bosh-cli deploy -d kubo ~/kubo-env/kubo/kubo-manifest.yml \
>                 -o ~/custom-ops-files/use-small-vm-types.yml \
>                 -o ~/custom-ops-files/scale-to-one.yml 
Using environment '10.0.2.252' as client 'bosh_admin'

Using deployment 'kubo'

Release 'kubo-etcd/2' already exists.

Release 'docker/28.0.1' already exists.

  vm_types:
+ - cloud_properties:
+     ephemeral_disk:
+       size: 25000
+     instance_type: t2.micro
+   name: common-small
+ - cloud_properties:
+     elbs:
+     - makikubo-kubo-api
+     ephemeral_disk:
+       size: 25000
+     iam_instance_profile: makikubo-kubo-master
+     instance_type: t2.micro
+   name: master-small
+ - cloud_properties:
+     ephemeral_disk:
+       size: 50000
+     iam_instance_profile: makikubo-kubo-worker
+     instance_type: m4.large
+   name: worker-small
  
  instance_groups:
  - name: etcd
-   instances: 3
+   instances: 1
-   vm_type: common
+   vm_type: common-small
  - name: master
-   instances: 2
+   instances: 1
-   vm_type: master
+   vm_type: master-small
  - name: worker
-   instances: 3
+   instances: 1
-   vm_type: worker
+   vm_type: worker-small

Continue? [yN]: y
```

![a](https://qiita-image-store.s3.amazonaws.com/0/1852/41b896be-4207-d9b7-f674-ca18c6fe8921.png)


> スケールダウンすると`hello-tomcat`がいなくなり、ELBのゴミが残っていました。。この辺の挙動はよくわかっていません。


使われなくなったDisk(EBS)はしばらく残っています。これを削除したい場合は、

```
bosh-cli -n clean-up --all
```


### Kuboのstart/stop

VMを削除して止めたい場合は、

```
bosh-cli -d kubo stop --hard
```

再開したい場合は、

```
bosh-cli -d kubo start
```

> `kube-system` sytem以外のpodはなくなる？

### Kuboの削除

```
bosh-cli -d kubo delete-deployment
```
