CIでkind使ってみたかったけど社会は厳しい

この記事はOpenSaaS Studio Advent Calendar 2019の10日目の記事。完全に穴埋めなのでたいしたネタではない。

CI中のみに必要なクラスタ

マニフェストのCIをしたい欲求と、大阪でCircleCI ユーザーコミュニティミートアップ#2で喋る必要が生じたので、最近使ってなかったCircleCIを使って、CI時の揮発的なKubernetesクラスタを作りたかった。

ちなみに昨日のLTのスライドはこちら。

.circleci/config.ymlのスニペットは次のような感じ。

version: 2
jobs:
  kind:
    machine:
      image: circleci/classic:201808-01
    steps:
    - checkout
    - run: 
        name: Install kubectl 
        command: |
          curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.3/bin/linux/amd64/kubectl
          chmod +x kubectl
          sudo mv kubectl /usr/local/bin      
    - run:
        name: Install kubernetes cluster with kind 
        command: |
          curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.6.1/kind-linux-amd64
          chmod +x kind 
          sudo mv kind /usr/local/bin
    - run:
        name: Start cluster
        command: |
          kind create cluster --name test-cluster --image kindest/node:v1.14.9
    - run:
        name: Waiting for ready
        command: |
          READY=""
          while [ "$READY" != "True" ]
          do
            sleep 2
            READY=`kubectl get node -o=jsonpath='{range .items[*]}{range @.status.conditions[?(@.type == "Ready")]}{@.status}{end}{end}'`
          done
          echo "Node is ready"
          echo "Current running pods are the follows:"
          kubectl get --all-namespaces pod

まあLT用に作ったネタということもあり、実用に耐えれるかという検証は十分になされていない。というか、現状は無理だと思う。クラスタの起動に1m30s、そこからReadyまでにさらに1mだし、さらにアプリケーションをデプロイしてという感じだとさらに数分かかる。

あとは大きなアプリケーションだとCircleCIのリソース上乗り切らないし、さらにcurl打ってもなんかやけに重い感じがした。

現状は普通に外部のクラスタにリモートでつないで、揮発的なNamespace切ってという感じが関の山な感はする。できればクラスタレベルでやりたいというのはあるので、現時点でのベストプラクティスあったら教えてほしいくらいである。