コンテナの疲れをk3sとRemoで癒やした話

f:id:kenev:20190316002715p:plain

Cloud Native Kansai #02 に参加してきました!

cnjp.connpass.com

そしてこの記事の題名にもあるように「コンテナの疲れをk3sとRemoで癒やした話」という題名でLTもやらせていただきました。

発表資料

ストーリー

コンテナに限らずですが技術の進化が早すぎ&自分の守備範囲が比較的広いため、様々な分野にキャッチアップしていくのが年々大変になっていってる気がします。「手を出しすぎなだけでしょ?」と言われてしまえばそうなのかもしれないですが、無知であることが怖いと思うところもあってついつい手を出してしまうのです。

いろいろあってなんだか最近「追われながら学習している」ことが多い気がするので、純粋に技術を楽しもうと思って家にある「ラズパイ」、「Nature Remo」を使ってお家ハックしてみました!「開発の疲れは開発で癒やす」と昔先輩に教えてもらったので、「コンテナの疲れはコンテナで癒す」を実践しました(笑)

出来上がるとラズパイ1台で、 k3s で作ったk8s上のPrometheus, Grafanaを使って次の画面が作れるようになります!

注意:Grafanaのグラフは自分で設定する必要があります

f:id:kenev:20190313220955p:plain
GrafanaでRemoのデータを可視化

家のラズパイで試してみたい人は以下リポジトリの手順に従ってぜひ構築してみてください!

github.com

まとめ

  • コンテナの疲れはコンテナで癒やす
  • 純粋にテクノロジーを楽しむのも大事
  • アプリエンジニアと言えど守備範囲は広めよう
  • 「パパすごい」は最高の癒やし(褒め)言葉

余談

Clean Architectureに気づいてくれる人がいた

Cloud Native Meetupだけど、スライドに入っている図から以下を共感してもらえたことが実はすごくうれしかった。

armとamdで同じイメージパスを指定

おまけ情報ですが、今回のお家ハックを通してarmとamdアーキテクチャが違っていても、Docker HubのURLを同じものとして使える方法について知ることができました。参考になるのは以下のGrafanaのPR。これで、ラズパイ(arm)だろうがmacbookamd)だろうが、同じ grafana/grafana:latest イメージを指定することができます! kenfdev/remo-exporter も真似をして、同一のイメージパスを指定できます!

github.com

参考

  • 基盤には前回の記事でも紹介したk3sを使っています

kenfdev.hateblo.jp

  • ダッシュボードの雰囲気は以下記事を参考にしています

qiita.com

k3sをラズパイで起動するまでにやったこと

LightweightなKubernetesとして最近話題に上がっているk3s。僕もミーハーなのでさっそく家のラズパイに入れてみました。

k3s.io

k3sがなんなのか、という点についてはQiitaの以下の記事が簡潔によくまとまっています。

qiita.com

我が家には半年ほど前にkubeadmで構築したラズパイが放置されていたので、初期化してk3sを入れてみました。なんだかんだでいつも同じようなページをググりながらセットアップするので以下に手順を残しておきます。

【注意】この記事ではPodを動かしたりしません。あくまでラズパイをセットアップしてk3sでノード情報を取得(kubectl get nodes)するところまでをゴールとしています

MicroSDの準備

Raspbian Stretch Liteを使うので公式サイトからダウンロードします。

www.raspberrypi.org

これをMicroSDに焼きたいのでbalenaEtcherというソフトを使います。以下からダウンロードしておきます。

balenaEtcher - Home

これを使ってMicroSDにRaspbian Stretch Liteが入れられます。

ラズパイ用のディスプレイは持っていないのでsshできるようにしておきます。これはMicroSDのルートに ssh というファイルを置いておけばOK。おそらく boot というボリュームでマウントされているのでほとんどの場合次のコマンドでOKです。

$ sudo touch /Volumes/boot/ssh

あとはMicroSDをラズパイに差し込んで完了!

ラズパイの下準備

ラズパイを起動したらIPアドレスルーターなりで調べて ssh で繋ぎます。デフォルトユーザーは pi でパスワードは raspberry です。どのみち家でしか使わないのと、またすぐ破壊する環境なのでここらへんは特に変更しません。

$ ssh pi@192.168.11.4

ホスト名を変更

この手順は任意ですが、わかりやすいようにホスト名を変更しておきます。これには raspi-config を使用。

$ sudo raspi-config

次の画面が出てくるので 2 Network Options を選択。

f:id:kenev:20190311090918p:plain
raspi-configトップメニュー

続いて N1 Hostname を選択します。

f:id:kenev:20190311091018p:plain
raspi-config ホスト名変更

k3s-master とでも設定しておきます。

f:id:kenev:20190311091108p:plain

決定すると再起動するか聞かれるので再起動します。

cgroupの有効化

再起動後に再度 ssh して、次はRaspbianで cgroup を有効にしておきます。 この手順を忘れるとk3sの起動時にエラーとなる ので要注意です。

# 好きなエディタで開きます
$ sudo vi /boot/cmdline.txt

次の値を 行の末尾に追加します

 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

新しい行に追加しちゃダメです。 必ず 末尾 に追加してください。 追加したあとは↓のようになります。(わかりにくいですが1行です)

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=9cdfde31-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

保存したら再起動しましょう。ラズパイの下準備はこれでOKです。

$ sudo reboot

k3sのインストールと起動

ラズパイに再度 ssh して次のコマンドを叩くだけでk3sの

  • 最新版のダウンロード
  • systemdへのサービス登録
  • 起動

まですべて完了します!

$ curl -sfL https://get.k3s.io | sh -

シェルの中身が気になる人は以下にアクセスすれば中身チェックできます。

https://get.k3s.io

関数の名前からも何をやっているかはなんとなくわかります。

# --- run the install process --
{
    verify_systemd
    setup_env ${INSTALL_K3S_EXEC} $@
    download_and_verify
    create_symlinks
    create_uninstall
    systemd_disable
    create_env_file
    create_service_file
    systemd_enable_and_start
}

kubectl get nodes をk3sで実行してみましょう。通常の kubectl の先頭に k3s をつければOKです。

$ k3s kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k3s-master   Ready    <none>   8d    v1.13.4-k3s.1

正常に実行できているのが確認できます。

k3s kubectl 毎回入力するので kalias 貼っておきます。

$ vi ~/.bashrc

末尾に以下を追加しておきました。

alias k='k3s kubectl'

これで k get nodes のようにもっと省略してコマンド打てるようになるのですっきり!

おわりに

以上でラズパイ上での k3s のセットアップは完了です!ほとんど同じような手順でクラスタにノードを追加していけるのですが、その話はまたの機会にします。

k3sで「お家ハック」もしていけると、モチベーション維持しながらkubernetesの経験も積んでいけるので引き続き共有していきたいと思います!

AWS SAA再認定のために5日間頑張ったこと

昨日AWSソリューションアーキテクト・アソシエイト(以下SAA)に再認定されました。3月中に取得しないといけないというミッションがあったので慌てて先週申し込みました。試験会場の関係で試験日まで5日しか無かったのですが、合格できたので備忘録を残しておきます。

TL;DR(まとめ)

  • 背景
    • 昨年12月にSAAの有効期限が切れました
    • 半年ほどAWSは触っていません(ほとんどコード書いてました)
    • 3月中に取得しないといけないのに、試験日は一番後ろにしても5日しか猶予がなかったです
    • 確保できた勉強時間は13時間くらいです
  • 『最短突破 AWS認定ソリューションアーキテクト アソシエイト 合格教本』を読みました
  • Whizlabsの模擬試験をやりました(7個中4個しかやれる時間はありませんでした)
  • Whizlabsのセクションテストをやりましたが、以下しかやれる時間はありませんでした
  • 模擬試験を英語で受けたので本番も英語で受けました
  • 自信をもって答えられたのは75%くらいです。結果をみたら905/1000点だったので、迷った選択肢は良い方向に転んでくれていた様です

背景

まず僕が何者なのか、というところですが毎日AWSを触るような業務は最近になるまでやってませんでした。普段はコードを書いている(JavaScript, PHP, Goなど)ことが多く、インフラに関連することをやるのはコンテナを触るときくらいです。

SAAをとったのは2年以上前で、そのときは結構ガッツリ勉強しています。ただし合格してからもそれほどAWSを使う機会はなく、使ってもELBとEC2くらいでした。ここ1年ほどはAWSのホットな情報にはほとんどついていけてないです。

ここまでは割と意識低い系に捉えられそうですが、割と重要なポイントとして僕は「インフラが好き」です!得意ではないのですが、好きです。なのでインフラに関連することを勉強するのは苦ではないタイプです。

試験申し込み

試験申し込みにはAWS認定アカウントが必要で、このサイトから試験会場が選べます。同僚からは「Webカメラでリモート監視員に監視されながらテスト受けた」と聞いていたため、この2年の間で試験の方法が変わったのかと思っていました。ところがそうではなく、「キオスク」タイプとそうでないタイプに分かれているようです。試験会場に「K」や「キオスク」と書いてあるものが、リモート監視員による監視のもと、専用端末で試験を受けるタイプの様です。僕は2年前同様、普通の端末でWebカメラでの監視もなく試験を受けました。

もう1つ再認定の特に重要なのは、「特典」を使用することです。AWS認定アカウントの「特典」のページに行けば、クーポンが発行できるので、試験申し込み時にこのクーポンを使うことで半額(執筆時点では16200円/2=8100円!)で試験を受けられます。 また、通常であればRecertificationという試験も受けられるはずです。この試験は試験時間が90分と書かれていましたが、試験の期限が2019年3月3日に設定されていて、2月28日に申し込んだ僕としては準備期間が少なすぎるので断念しました(たぶん昨年SAAが刷新されたことと関連している)。 よって、通常の試験を申し込んでいます。半額のクーポンは使えるのでご安心ください。

試験勉強でやったこと

とはいえ、日常でさほど触っていないAWSの試験を受けるので、僕も結構プレッシャーを感じました。試験までは「土、日、月、火、水」と5日しかなくて、確保できた勉強時間は13時間ほど。何をしたかというのは以下の通り。

  • 土(3時間)
  • 日(3時間)
  • 月(2時間)
    • WhizlabsのセクションテストでVPC, API Gateway, ECS, EBSを実施しました。全部不合格(正答率50%くらい)!
    • WhizlabsのPractice Test 1(本番同様65問の模擬試験)を実施しました。合格(正答率81.54%)
    • 解説を読んで復習しました。Whizlabsの解説はAWSへのドキュメントのリンクがあったりしてかなり丁寧に書いてあるのでわかりやすいです。
  • 火(2時間)
    • WhizlabsのセクションテストでSTS, SNS, SQS, ELBを実施しました。全部不合格!(正答率40%くらい)
    • WhizlabsのPractice Test 2を実施しました。合格(正答率92.31%)
    • 解説で復習しました。
  • 水(3時間)
    • WhizlabsのPractice Test 3を実施しました。合格(正答率87.69%)
    • WhizlabsのPractice Test 4を実施しました。合格(正答率80%)
    • 解説で復習しました。
    • 試験当日

アドバイス

  • 試験の長さ(65問・130分)に慣れるためにも模擬試験を数こなしたほうが良いです。集中力の持続力が合否を分けるような気がします。
  • WhizlabsのセクションテストとPractice Testの難易度が違いすぎる気が。。。(セクションテストは1個も合格できなかった。。。)
  • WhizlabsのPractice Testは全部合格だったので、解説を読むのを怠りそうになったのですが、間違えたところちゃんと復習しましょう。復習しなかったところが問題に出ると超後悔します。
  • ↑にも関連するのですが、思ったより見慣れた問題がなくてちょっと焦りました。
  • 英語がある程度抵抗なければ英語で受験するのもありです。Whizlabsで英語に慣れている場合、当日日本語の問題にあたったときに妙な違和感があったりします(僕にとって1回目のSAAがそうでした)

試験当日

  • 僕は運転免許証とクレジットカードで身分証明しました(コピーじゃなくて本物を見せます)。
  • 試験実施する部屋には何も持っていかなくてOKでした(身分証明書も不要)。時計も持ち込めなかったです。ロッカーに全部しまいます。
  • 試験会場でボールペンと紙を5枚ほどメモ用にもらいました。試験が終わると回収されます。
  • WhizlabsのPractice Testは130分ある中、いつも70分ほど余ってたのですが、本番では見直しもしてたら残り3分になっちゃいました。。。やっぱり本番は何かしら心理的にやられてる気がします。落ち着きましょう。

おわりに

合格できたからよかったですが、当日は問題にフラグがつきっぱなしのものが15問ほどあったので、「もしかしたらこれは落ちるかも」と思いました。選択問題を2問までは絞り込めるものの、最後の1つに絞り込む決定的な知識が不足していると痛感しました。運良くそれらの問題が正解に転んでくれたんだとますが、精神衛生上よろしくないのと、そもそも「AWSの実力」的にその状態はどうなんだ、という疑問が残りますね。。。可能であれば普段からAWSに触れておくことが一番大事でしょう。そうすることで自然と「あの画面にあのパラメータがあったな」みたいなのがインプットされていくはずです。

この記事が、次に受けるときの自分へのメッセージにすることと、僕のように準備期間が少なくとも再認定してもらいたい人の参考になれば幸いです!