📝 BLOG.IK.AM

@making's memo
(🗃 Categories 🏷 Tags)

CFCRでデプロイしたKubernetes on AWSをSpot Instanceにする

🗃 {Dev/CaaS/Kubernetes/CFCR}

🏷 AWS 🏷 BOSH 🏷 CFCR 🏷 Kubernetes 🏷 Kubo

🗓 Updated at 2018-06-04T00:14:31+09:00 by Toshiaki Maki  🗓 Created at 2018-06-03T21:43:47+09:00 by Toshiaki Maki  {✒️️ Edit  ⏰ History}


前記事でCloud Foundry Container Runtime 0.17.0をBOSH-wayでAWSにデプロイしましたが、
クラスタをSpot InstanceにしてVM料金を3分の1くらいにします。

BOSHのvm_extensionsを使えば、BOSHでプロビジョニングしたVMにSpot Instanceの競り値を指定できます。

まずはBOSH DirectorがSpot Instanceを使えるように${prefix}-bosh-director IAMユーザーに次のIAM actionを追加してください。

  • ec2:RequestSpotInstances
  • ec2:DescribeSpotInstanceRequests
  • ec2:CancelSpotInstanceRequests
  • iam:CreateServiceLinkedRole

次にBastion serverにログイン。

./ssh-bastion.sh 

BOSH用の環境変数を読み込みます。

cd cfcr-manifests
source bosh-aws-env.sh

master vmに使用しているt2.microとworker vmに使用しているt2.mediumのSpot Instance価格はそれぞれ$0.0046、$0.0182で安定しています。


念のため、$0.0047、$0.0183で入札するようにspot_bid_priceを設定するvm_extensionsをCloud Configに追加するops-fileを作成します。

cat <<EOF > ops-files/cloud-config-spot-instance.yml 
- type: replace
  path: /vm_extensions?/-
  value:
    name: spot-instance-0.0047
    cloud_properties:
      spot_bid_price: 0.0047
      spot_ondemand_fallback: true

- type: replace
  path: /vm_extensions?/-
  value:
    name: spot-instance-0.0183
    cloud_properties:
      spot_bid_price: 0.0183
      spot_ondemand_fallback: true
EOF

spot_ondemand_fallbacktrueにしているので、Spot Instanceの価格が上がってAWSによってVMがシャットダウンされた場合にBOSH DirectorがOnDemand Instanceとして再作成してくれます。

update-cloud-config.shcloud-config-spot-instance.ymlを追加して実行します。

cat <<'EOF' > update-cloud-config.sh
#!/bin/bash
bosh update-cloud-config kubo-deployment/configurations/aws/cloud-config.yml \
    -o ops-files/cloud-config-rename-vm-types.yml \
    -o ops-files/cloud-config-small-vm-types.yml \
    -o ops-files/cloud-config-master-lb.yml \
    -o ops-files/cloud-config-spot-instance.yml \
    -v az=${zone} \
    -v master_iam_instance_profile=${prefix}-cfcr-master \
    -v worker_iam_instance_profile=${prefix}-cfcr-worker \
    -v internal_cidr=${private_subnet_ip_prefix}.0/24 \
    -v internal_gw=${private_subnet_ip_prefix}.1 \
    -v dns_recursor_ip=${private_subnet_ip_prefix}.1 \
    -v subnet_id=${private_subnet_id} \
    -v master_target_pool=${prefix}-cfcr-api
EOF

./update-cloud-config.sh

次にこれらのvm_extensionsをKubernetesクラスタで使用するops-fileを作成します。

cat <<EOF > ops-files/kubernetes-spot-instance.yml 
- type: replace
  path: /instance_groups/name=master/vm_extensions?/-
  value: spot-instance-0.0047
- type: replace
  path: /instance_groups/name=worker/vm_extensions?/-
  value: spot-instance-0.0183
EOF

deploy-kubernetes.shops-files/kubernetes-spot-instance.ymlを追加して実行します。

cat <<'EOF' > deploy-kubernetes.sh
#!/bin/bash
bosh deploy -d cfcr kubo-deployment/manifests/cfcr.yml \
    -o kubo-deployment/manifests/ops-files/misc/single-master.yml \
    -o kubo-deployment/manifests/ops-files/addons-spec.yml \
    -o kubo-deployment/manifests/ops-files/iaas/aws/lb.yml \
    -o kubo-deployment/manifests/ops-files/iaas/aws/cloud-provider.yml \
    -o ops-files/kubernetes-kubo-0.17.0.yml \
    -o ops-files/kubernetes-worker.yml \
    -o ops-files/kubernetes-master-lb.yml \
    -o ops-files/kubernetes-spot-instance.yml \
    --var-file addons-spec=<(for f in `ls specs/*.yml`;do cat $f;echo;echo "---";done) \
    -v kubernetes_cluster_tag=${kubernetes_cluster_tag} \
    -v kubernetes_master_host=${master_lb_ip_address} \
    --no-redact
EOF

./deploy-kubernetes.sh

EC2コンソールの"Spot Requests"で、Spot Instanceが作成されていることを確認してください。

image

うまくいかない場合はOnDemand Instanceになっているので、bosh -d cfcr recreate masterまたはbosh -d cfcr recreate worker、失敗している方を実行してください。