サイバーエージェントの「おうちKubernetesインターン」に参加しました!

公開:2020/10/02
更新:2020/10/09
4 min読了の目安(約4400字TECH技術記事

こんにちは、Lapi(@dragoneena12)です。

9/24-30で行われた 2020年おうちKubernetesインターンに参加してきたので、内容や感想を紹介したいと思います。

おうちKubernetesクラスタ

参加するまで

僕自身これまでインターンに参加したことがなかったのでそろそろ参加してみたいと思い探してみたところ、こちらのKubernetesインターンが目に止まりました。前々からインフラは好きで自宅サーバー等構築してはいたのですが、Kubernetesとなるとクラスタ環境を用意するなど費用がかかるということでなかなか踏み出せずにいました。そこで RaspberryPi4を3台ももらえるというこのインターン内容に惹かれて応募しました。

DockerやDocker-composeは好きで前々から使っていましたが、KubernetesはKの字も知らない初心者だったので事前にKubefest Tokyo 2020のスライドを眺めたりしてある程度潮流を勉強しておきました。そんな中でKubernetes-nativeなCI/CDに興味が出たので、インターンではそれをやろうと思っていました。

やったこと

やったこと集

day1

メンターとして漆田さんについていただき、Kubernetesを1ミリも知らない僕はアーキテクチャから覚えたいと思ってKubernetes-the-hard-wayにチャレンジしました。自宅サーバー構築なんかでLinuxの操作にはぼちぼち慣れていたので、全体の中でもかなりの速さで構築できたみたいです。ときどき資料の微妙な不備もあったりしましたが指摘したら改善してくれましたw

day2

HardWayの構築が終わり、アプリケーションを載せてもよかったですが単一障害点がチラついて仕方なかったのでMulti-masterのHA構成を作ることにしました。手順としてはまずetcdをクラスタ化して、全ノードにControlPlaneをインストールしてKube-apiserverをロードバランシングする感じです。ここまで割と順調にできたのですが、最後の最後でDNSサーバーが動かないなど微妙な問題が起きてトラブルシューティングに手間取ってしまいました。

最終的に作った構成は↓みたいな感じです。ここまで冗長化していた人は少なかった気がします。

KubernetesクラスタHA構成

day3

クラスタ全体を再起動かけたらなぜかDNSサーバーが動かない問題が解決したので、当初やりたかったCI/CDの導入を進めることにしました。まずはGitOpsの要となるArgoCDを導入することからはじめました。最初は愚直にチュートリアル通りに進めてみましたが、イメージがARM64に対応していなかったためにコケました。調べてみると alinbalutoiu/argocd というARM64対応のイメージがあったのでyamlをこちらに書き換えて動作しました。しかし実際にリポジトリを追加する段になって下記のエラーが出て、原因が全くわからず座礁してしまいました。ここから闇のArgoCDとの戦いが始まります…。

# 闇のエラー
Unable to create application: application spec is invalid: InvalidSpecError: repository not accessible: Get "https://github.com/argoproj/argocd-example-apps.git/info/refs?service=git-upload-pack": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

day4

闇のエラーが出ている背景で、クラウドが下記のようにいくつかおかしな挙動をしていることを確認していました。

  • argocd-redispodがImagePullErrを起こして動いていない。
  • Pod内からの名前解決ができたりできなかったりする。
  • argocd-serverpod内から github-repositoryをcloneできない。

調べてもあまり情報が出てこないようなエラーが多発していて、コンフィグの設定ミスなどの影響が考えられたので一度クラスタを再構築することにしました。この過程で二度同じことをするのが嫌だったのと絶対にコンフィグ設定を間違えないためにHardWayの構築過程をAnsible-playbookですべて書きました。下にこのAnsible-playbookを置いたリポジトリを貼っておくのでよければ参考にしてください(バイナリを消したりしたので適宜いじってください)。

SDカードから焼き直してクラスタをAnsibleで再構築したところ、先述したエラーは消えてクラスタはすこぶる健康に動きはじめました!(さっきのエラーはなんだったんだ。。。)。構成管理ツールの偉大さを思い知りました。みんなKubeadmとかKubesprayとか使おうな。

しかし先述のArgoCDのエラーはここまでやっても直らずじまいで、暗礁に乗り上げてしまいました。ArgoCDをあきらめようにも僕がやりたいKubernetes-native CI/CDにおいてArgoCDは割と重要な存在だったので見捨てられず、とても困りました。メンターさんと一緒にだいぶ長い時間かけてトラブルシューティングしていたと思います。たくさんみていただき本当にありがとうございました。

day5

day4後の夜にメンターさんがふと言っていた「httpsじゃなくてsshだったらできるかも?」という言葉を思い出してsshからArgoCDを動かしてみたらなんと何の問題もなく動作しました!結局httpsだとうまくいっていない理由はわからずじまいでしたが(誰かわかったら教えて欲しいです)、ひとまずArgoCDが動いたのでいろいろなアプリをデプロイしてみました。

まず最初にデプロイしてみたのはPassboltです。入れた理由は友達が使いたいと言っていたという単純な理由ですw
PassboltにもARM64版イメージがなかったのですが、Dockerfileが用意されていた(https://github.com/passbolt/passbolt_docker )のでちゃちゃっとビルドして動作させることができました。ビルドしてDockerHubに上げたものとKubernetesマニフェストも下に貼っておきます。

他にもHelmChartからのデプロイも試してみたかったのでPrometheusとGrafanaのHelmChartをArgoCD経由でデプロイしてみました。両者ともARM64に(kube-state-metrics以外)対応していたので、一瞬でこれらのサービスを動かすことができました。嫌いになりかけていたArgoCDが大好きになりました。

本当はもっといろいろやりたいことがあったのですが、時間が足りなくなりここで終了になりました…。ArgoCDにハマりまくったのが悔やまれます。

ArgoCDたのしい!

インターンを終えて

僕にとっては初めてのインターンで、ちゃんと会社の人と一緒に開発するという経験自体新鮮なものでしたが、本当に楽しいインターンだったと思います。Kubernetesの経験がなくても(僕もこのインターンでkubectlコマンドを初めて叩きましたw)Dockerとかクラウドとかが好きな人なら絶対に熱中できると思います。
今回のインターンでは実は最優秀賞のぬいぐるみ狙いで結構頑張っていたのですが(笑)、残念ながら最優秀賞は逃してしまったものの「Growth Up賞」として表彰していただけました。

念願のおうちKubernetes環境を手に入れることができたので、今後もこの環境をどんどんつよつよにしていきたいと思っています。まずはTektonをARM64対応させます。

インターンでお会いしたみなさん、1週間ありがとうございました!

追記

他のインターン参加者の記事を載せておきます!
https://taketakeblog.hatenablog.jp/entry/2020/10/06/181423