ラズパイでおうちKubernetesを作ってよかった件

この記事はKyash Advent Calendar 2020の10日目の記事です。

KyashのPaymentチーム佐藤です。KyashではVisaやQUICPayの決済基盤の開発をしております。 最近ラズパイでKubernetesクラスターを作ったので、今回はその感想なんかを書いていこうかなぁと思います。 詳しい構築方法などはWeb上に大量に上がっているので今回は省かせていただこうかと思います。

f:id:ar_ciel_sa2:20201210100531j:plain

なぜ作ろうと思ったか?

個人的な理由

まず個人的な理由としてはKubernetesは昔ちょこっと触っただけで業務でも触れる機会がなかったので触ってみたいなぁと思っていました。またCKADを取得しているマネージャーとの1on1でKubernetesの話をしたりと自分の中でKubernetes熱が高まってきたというのがありました。

GKEなどマネージドサービスを使っても良かったのですが、「構築もやってみたい!」、「家にあればほぼ無料で使える!」などメリットが大きかったのでおうちKubernetesクラスターを作ることにしました。 (あと一家に一台Kubernetesクラスターの時代って言ってみたかった。。。)

Kyashのエンジニアとしての理由

KyashのエンジニアとしてもKubernetesクラスターを作ってKubenetesを触りたいと思う理由があり、Kyashでは基本的にECS on FargateもしくはEC2でインフラを構築しておりKubernetes本番運用しておりません。しばらくはアーキテクチャを大きく変えることはないかもしれませんが、今選択しているアーキテクチャが適切かどうかを判断するには各アーキテクチャを知る必要があると思います。 昨今ではKubernetes上で動いているプロダクトも増えてきています。一旦自分たちのプロダクトを見直すという意味でもKubernetesの知見を得ておくことはかなり良いのでは?と思い個人的にもKyashのエンジニアとしても美味しいアクションだろうということでやってみることにしました。

買ったパーツとか

f:id:ar_ciel_sa2:20201210100612p:plain

ラズパイ3台でクラスターを構築しました。 ラズパイ自体は公式代理店で購入しましたが、それ以外は基本的にアマゾンで揃えることができます。 僕は持っていたのですがSDカードリーダーやminiHDMI <-> HDMI変換ケーブルが必要になるでしょう。

構築するときに苦労したこと

構築するにあたっておうちKubernetesの先輩方の知恵を借りることが多かったのですが、なにか他の人がやってないことをやろうかなぁと思い、使ったことのないAnsibleを使ってある程度まで構築するようにしようと思っていました。

以下の内容を自動でセットアップできるようにAnsibleを用意しました。

  • セキュリティ周りの設定
  • debパッケージのアップデート
  • docker、kubectl、kubelet、kubeadmのインストール
  • swapの無効化などkubeadmの立ち上げ要件を満たすための作業

設定を複数台にあてる場合、同一の作業をするのは面倒くさいのでやってよかったです。

ちょっと荒削りで鍵情報などを載せたままだったりするので、そこらへんを解決したら公開しようと思います。

勉強になったこと

Ansibleの勉強になった

全然Kubernetesとは関係無いのですが、Ansibleを使うことが出来たのでAnsibleについての勉強ができました。ベストプラクティス集を読んでどんな構成にすべきか?などの知見を得られました。

Ansibleベストプラクティス集

Ansibleの練習台としてもラズパイを1台持っていてもいいかもと思いました。

コントロールプレーンへの知見が深まった

GKEなどマネージドサービスで運用してるとコントロールプレーン側を多分意識しなくて良いのかな?と思っているのですが、構築の場合嫌でもコントロールプレーンを意識する必要があるので公式ドキュメントでコントロールプレーンについて調べることが多かったです。

以下の内容は僕にとって新発見でした。

  • kubectlでコマンドを叩くとkube-api-serverが受け取っていたり、ほぼ全操作がkube-api-serverを経由している
  • cloud-controller-managerの存在
    • 当然クラウド基盤とのやりとりも必要なのですが、そのやり方までしっかり考慮されていてさすがだと思った
  • kube-schedulerによるPodの割当
    • Podが要求するリソース量やデータの局所性など色々な条件を考慮してノード選定をしていることがわかった

構築作業自体が公式ドキュメントを読むモチベーションになったので、こういったカタチでとっかかりになったのは良かったです。

kubeadmという便利な存在を知った

kubeadmは構築に必要な作業を色々やってくれます。kubernetesクラスターをかんたんに構築できます。

kubeadmがやってる作業はかなり多いですが、一部列挙するとこんな感じです。

  • preflight check
  • kubeletの起動
  • 証明書作成
  • コンフィグ作成
  • コントロールプレーン起動
  • etc...

今度これらを手動でセットアップしたいなぁと思いました。

どう利用していくのか?

現在コンテナレジストリと実験用のアプリケーションしか配置してないですが、勉強のために色々やっていきたいと思っています。特にやりたいのは Blue/Green デプロイ化とCRIの差し替えです。 得た知見を社内の勉強会で発表していったりもしたいと思っています。 熟練度が上がってきたらCKAの認定試験を受けてみたいです。

最後に

今回はおうちKubernetesを構築したときの話を書かせていただきました。 おうちKubernetesは構築するだけであれば簡単にできます。ぜひみなさんも一家に一台Kubernetesクラスターを持ってみてはいかがでしょうか?