shibatch's journey

日々考えていることをつらつら書くだけです

SREの探求(書籍)のセルフサービスの話が興味深かった

最近、社内で【SREの探求】の読書会をしています。

www.oreilly.co.jp

この本はSREについて系統立てて書いている本ではなく、各章ごとに別の人がSREについて書いた本で、 (章により統一感はないものの)非常におもしろい内容です。

今行っている読書会は章ごとに担当を割り当てて内容を説明すると言う形式をとっているのですが、 私が担当した章が非常に興味深い内容でした。

ざっくりとした内容の概要

10章は【大企業でSRE導入の道を開く方法】という章題で表むきは硬直した大企業に向けてSREの組織をどう浸透させていくか、ということを重点的に書いています。ざっくりとした論法はこうです。

  • 大企業ではSREの概念が乏しい
  • トイルについて、あらためて紹介
  • 大企業ではトイルは発生しやすい
  • サイロ化した組織で、チケットを用いた組織間での業務の処理がトイルになっている
  • チケットを用いた方式はやめよう
  • 代替策として「引き継ぎは可能な限りなくす」
  • そのために機能横断的な組織をつくろう
  • 機能横断的な組織でもなくせない引き継ぎは、セルフサービスに置き換えよう
  • エラーバジェット、トイルにかける時間を制限する

大企業にかぎらず、どのような組織にも当てはまる内容「そやな」って感じで読み進めていけるんだけれども、太字で書いた「セルフサービス」の考えは意識したいなぁって思いました。

セルフサービスとは

セルフサービスというのは業務を依頼される側が、GUIAPIやツールを提供することで、依頼する側だけで(依頼することなく)業務が完結するって方法。 これはつまり割り込みが発生しないし引き継ぎも発生しないので依頼していた側/依頼されていた側双方でトイルが発生しない方法ということ。

パッと思いつく「セルフサービス化」は例えばSlackBotやGitHub Actionsをつかってdeployするようなものかなと また、運用の一部をGitHub Actionsに置き換えて誰でも実行できるようなものもできそう。

こと自分の中でトイル削減とは自分の中で発生、完結するような業務を自動化することに重点を置いていたけれども、他者から依頼される業務の自動化もセルフサービスだなと新たな視点を持てました。

マルチクラウドのKubernetesでVPAを導入した(メモ)

最近のお仕事の話をしたい。

GoogleKubernetesEngine(GKE)とOpenStack上のプライベートクラウド環境に垂直Podスケーリング(VPA)を入れました。

VPAはPodでのCPU / Memoryリソースでどのくらいリクエストするのが良いのかを測定してくれたり、自動的に調整してくれる機能ですね。

これがGKEとOpenStackでちょっと導入方法が違ったのがおもしろかったので書き留めです。(リソースの設定ファイルの内容は同じものでOK。)

なお、ふんわりした知識で導入しているので詳細は誤っているところもあるかもしれません:bow:

GKEでVPAをenableにする

ドキュメントが公開されているのでこの通りやればOK。 GKEだとgcloudコマンドでONにする、もしくはコンソール上からONにします。 (コントロールプレーンの再起動が走ります)

gcloud container clusters update <cluster name> --enable-vertical-pod-autoscaling

f:id:shibatch:20220321175002p:plain
コンソール

おおよそ5分くらいでVPAがONになりました。

gcloud container clusters describe <cluster name>
<snip>
verticalPodAutoscaling:
  enabled: true

GKEはコントロールプレーンにPodを配置しており、get pod のようなコマンドで確認は(自分の知る限り)できませんでした。

プライベートクラウド上のKubernetesクラスタでVPAをenableにする

こちらも手順は公開されているのでこの通りやればよいです。 AWS EKSでも手順が公開されてますがほぼ同様の手順でした。

リポジトリを取得して以下のコマンドを投入するだけ。これでpodが展開されてvpaが起動します。

./hack/vpa-up.sh

以下のエラーがでたのですが

ERROR: Failed to create CA certificate for self-signing. If the error is "unknown option -addext", update your openssl version or deploy VPA from the vpa-release-0.8 branch.
deployment.apps/vpa-admission-controller created

これはドキュメント内に対処方法が書いてあって、実行している端末のOpenSSHのバージョンを上げればよいです。 私はMacなのですがMacは純正のOpenSSHでないので純正のものをインストールして再度実行したらVPAが入りました。

shibatch@aa vertical-pod-autoscaler % k get pod -n kube-system | grep vpa
vpa-admission-controller-58cf99779c-bdwsv   1/1     Running     0          63m
vpa-recommender-678f4f6d4b-ttlp2            1/1     Running     0          63m
vpa-updater-64ddd67787-4bw7g                1/1     Running     0          63m

VPAをONにする

ここからは環境による差異はありあません。VPAのリソースをapplyします。リソース内で取得したいpodがあるdeploymentを指定します。

shibatch@aa  % cat vpa.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: hoge-vpa
  namespace: default
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: fuga
  updatePolicy:
    updateMode: "Off"
shibatch@aa  % k apply -f vpa.yaml
verticalpodautoscaler.autoscaling.k8s.io/hoge-vpa created

ここで updateMode: "Off"としています。つまりRecuestの推奨値は出すけれども自動でスケーリングするような動作はしない設定です。 VPAを導入する場合はまずはこの状態から初めて十分に検証できたら他のモードに移行することがベストプラクティスとされています。

しばらくすると取得されだします。

shibatch@PMAC952S production % k get vpa hoge-vpa
NAME        MODE   CPU    MEM          PROVIDED   AGE
hoge-vpa   Off    920m   9616998332   True       3m33s

describe vpa するとコンテナごとのRecuestを出してくれますね!

shibatch@PMAC952S ~ % k describe vpa hoge-vpa
Name:         hoge-vpa
Namespace:    default
<snip>
Status:
  Conditions:
    Last Transition Time:  2022-03-11T08:50:53Z
    Status:                False
    Type:                  LowConfidence
    Last Transition Time:  2022-03-11T08:50:53Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  front
      Lower Bound:
        Cpu:     1m
        Memory:  9437184
      Target:
        Cpu:     2m
        Memory:  11534336
      Uncapped Target:
        Cpu:     2m
        Memory:  11534336
      Upper Bound:
        Cpu:           2m
        Memory:        12582912
      Container Name:  api
      Lower Bound:
        Cpu:     355m
        Memory:  6951010304
      Target:
        Cpu:     900m
        Memory:  8825864192
      Uncapped Target:
        Cpu:     900m
        Memory:  8825864192
      Upper Bound:
        Cpu:     1155m
        Memory:  9171894272
Events:          <none>

基本的にTarget の項目を参考にすればよさそう

HPA と VPAの組み合わせ

VPAと違うアプローチのスケーリングの概念として、水平ポッドスケーリング(HPA)があります。 こちらはリソースの使用状況をみてPodを増減する、横方向へのスケーリングですね。

これらは組み合わせて使うことは推奨されていないようです。 なんとなく理由はわかりますね。HPAでPodが増減すると使われるリソースが増減するので適切な設定値にならない恐れがあるんだと思います。 ただ、前述したupdateMode: "Off" の設定だとOK。私はHPAも活用しているのでこのモードで動かして、リソースの推奨値がでたらRecuestを変更する形にします。 これでもあてずっぽで設定するようなRecuestより幾分無駄がないはずです。


こんな感じで手探りしつつVPAを導入しました〜 最近やっとKubernetes触ってて楽しいと思えるようになってきた。いいことだ。

このHPA / VPAのスケーリングの概念ってとっても大事だと思うんだけどCKA受験したときはまったく範囲ではなかったと思う。重要な概念だと思うので試験範囲に含めてよいと思うけどなぁ。

2021年ふりかえり

仕事

今年印象に残っている仕事はDNSの移設作業。PowerDNSをNLB + EC2 + Auroraで立てる経験はなかなかエキサイティングなものでした。準備時間をたっぷり取らせていただいて、おもしろいことができたのは幸運だなーって思いますね。

あと印象に残っているのはRDS PrimaryをMySQL5.6->5.7へバージョンアップした作業。リスクはそこまで高くないだろうと踏みながらもやはりどきどきしましたね。

あと、新しいメンバーや自分の配置換えもあり、そのたびにどう振る舞うのがよいだろうか?と問い続けた一年だったと思います。ここまで環境がいろいろ変化した年も転職以来はじめてでした。来年も模索はし続けますが、やりたいことはたくさんあるのでひとつひとつやって行けたら良いなと思っております。

あと、CKA/CKADを取得したのもトピックですね。5月ごろCKAを受けて落ちて、一旦期間を置いてから10月に取得、そのままCKADを11月に取得できました。これは自身の勉強のパターンを見つけることができたのが大きいです。来年も興味のある資格は意欲的に挑戦したいなーって思ってます。

旅行

コロナも2年目でしたが工夫して国内旅行ができたと思います。4月の自分の誕生日にはひたちなかへ日帰り旅行。その後、ワクチンが行き渡ったのもあり、昨年よりも旅行しやすい環境になったのを見計らって、8月に札幌/洞爺湖、9月末に金沢へ旅行へ行きました。最近は日帰りで熱海方面へ。来年ももうちょっとどっか行けたらいいなぁ。

そのほか

1月に親知らずの抜歯をしたんですがちょーーーー大変でした。大学病院で3時間くらいかかったかな…治りが遅くてめっちゃ焦りました…今はだいぶ収まっていて手術してくれた先生に感謝ですね。

あと、8月だったか自分の家の前で財布を落としました…いまだに見つからず。悲しい。今年嫌だったな、って思った唯一のできごとですね…

今年は公私共にけっこう良い年だったなーって思ってます。それもこれも人や環境に恵まれているからですね。来年も楽しく穏やかに過ごして行けたらなーって思っております。今年もお世話になりました。来年もよろしくお願いします。

bashスクリプトではテキストを1行ずつ読むループ処理ではパイプを使うことは避ける

先日久しぶりにbashスクリプトを書いたときにレビューで指摘いただいて初めて知ったことなので書き留めておく。

bash スクリプトで1行ずつ読み込んでwhile read lineを使うときの構文。

今までこのように、while read lineの前に変数やテキストファイルを展開して読ませていました。

$ cat front.sh
#/bin/bash

LIST="aaaa
bbbb
cccc
dddd"

echo "${LIST}" | while read line     👈ここに注目!
do
  echo "====LOOP====="
  echo "$line"
  DEFINE_IN_LOOP="TEST"
done

echo "$DEFINE_IN_LOOP"

さてこれを実行すると以下の通りになります。

====LOOP=====
aaaa
====LOOP=====
bbbb
====LOOP=====
cccc
====LOOP=====
dddd

echo "$DEFINE_IN_LOOP" の結果が出てきません。これはパイプでLISTの内容を渡しているのでサブシェルでループが走り、ループを抜けると中で定義された変数はなかったことにされるからですね。

なのでパイプを使わずにこう書くのがよさそう。

$ cat back.sh
#/bin/bash

LIST="aaaa
bbbb
cccc
dddd"

while read line      👈パイプを使わないように変えた
do
  echo "====LOOP====="
  echo "$line"
  DEFINE_IN_LOOP="TEST"
done < <(echo "${LIST}")

echo "$DEFINE_IN_LOOP"

これであればループの中で定義した変数をループから抜けても取り出せます。

====LOOP=====
aaaa
====LOOP=====
bbbb
====LOOP=====
cccc
====LOOP=====
dddd
TEST

この記法はbashじゃないとできないことに注意(shではできない)

 sh back.sh
back.sh: 行 13: 予期しないトークン `<' 周辺に構文エラーがあります
back.sh: 行 13: `done < <(echo "${LIST}")'

★追記 コメントいただきました🙏

というわけで確かめてみます。 ループ処理の中にsleepを入れてps で確認。

こちらがパイプを使っているほう

vagrant   6345  0.0  0.2 157044  2616 ?        S    12月27   0:00      \_ sshd: vagrant@pts/0
vagrant   6346  0.0  0.2 115688  2160 pts/0    Ss   12月27   0:00          \_ -bash
vagrant  24285  0.0  0.1 113280  1360 pts/0    S    01:20   0:00              \_ bash front.sh
vagrant  24287  0.0  0.0 113284   644 pts/0    S    01:20   0:00              |   \_ bash front.sh
vagrant  24288  0.0  0.0 108052   360 pts/0    S    01:20   0:00              |       \_ sleep 5
vagrant  24293  0.0  0.1 155600  2012 pts/0    R+   01:20   0:00              \_ ps auxfww

こちらがパイプを使わないほう

vagrant   6345  0.0  0.2 157044  2616 ?        S    12月27   0:00      \_ sshd: vagrant@pts/0
vagrant   6346  0.0  0.2 115688  2172 pts/0    Ss   12月27   0:00          \_ -bash
vagrant  24362  0.0  0.1 113284  1404 pts/0    S    01:22   0:00              \_ bash back.sh
vagrant  24371  0.0  0.0 108052   360 pts/0    S    01:22   0:00              |   \_ sleep 5
vagrant  24372  0.0  0.1 155600  2012 pts/0    R+   01:22   0:00              \_ ps auxfww

確かに、パイプを使わないほうはサブシェルが起動されていないことがわかります。

推し界隈の誕生日を通知してくれるbotをAWS Lambda + Pythonでつくった話

この記事はGMOペパボエンジニア Advent Calendar 2021の7日目の記事です。 昨日はRyo Nakamine (@r_nakamine) | Twitter さんの Goを用いてTCPソケット通信を学ぶでした! TCPの通信、メタルの時代からk8sに至るまで、ず〜っと使える知識なので私も整理して学んでいきたいです…!!


何をやったか

さて今日は最近やっている業務の話を書こうかなーとおも思ったのですが、ちょっとすぐに出せそうにないので(社のテックブログにしたい…)趣向を変えて、ちょっと前につくったTwitter botを紹介します。

何をするbotかというと、1日に1回、推し界隈(プリキュア)のキャラクターの誕生日まで何日かを教えてくれるbotです。こんな感じ。

あと、誕生日10分前に煽りのツイートをして、

当日はちゃんと祝ってくれます🎉

これをAWS Lambda + AWS EventBridge + Pythonで作った話をします。

なんで作ったか(読み飛ばしていい部分)

みなさまプリキュアってご存知ですかね…日曜朝8時30分から放映している戦うヒロインのアニメです。2004年から始まって17年やってる長寿アニメですね。で、17年やっているけれどもほぼ毎年シリーズが変わるので違うキャラが出てくるのです。その数ざっと70人ほど。

このプリキュア界隈、各キャラに固定ファンがいて、誕生日を盛大に祝ったり、この誕生日に向けてイラストを作ったりする人がけっこういるのです。私は固定のファンはないんですが、傍目からみてこの誕生日をカウントするbotはまぁまぁ需要があるのではー!?と思って作ることにしました。

作ったものの概要

技術的には簡単シンプルで、1日に1回、AWS EventBridgeでcronでLambdaでTwitter APIを叩いてツイートするだけです!

f:id:shibatch:20211207225656p:plain
ちょー簡単な図

なお、さきほど紹介したときにあった通り、このbotは3つの機能で成り立ってます。

  • 誕生日までの日数をカウントしてツイートする機能
  • 誕生日の10分前にツイートする機能
  • 誕生日にツイートする機能

今回はざっくり大まかにどういうことをやるのかを紹介します。

最初にやること

最初にやることは

で、これがなかなかめんどくさいです…コロコロ申請画面も変更されたりして一筋縄ではいかないんですよね…いろいろな方が紹介しているので省きます。

EventBridge

EventBridgeではさきほど言った3つの機能をそれぞれを定義してやります。cronで別々のタイミングで起動するようにしていますね。設定はUTCなのでそこは考慮した時刻で設定します。

f:id:shibatch:20211207230313p:plain
EventBridge

また、EventBridgeでは「入力」というものを定義できるので、ここで何の機能を呼び出すか定義します。

f:id:shibatch:20211207231140p:plain
event

EventBridgeでやることはこれだけです。

Lambda

さてLambdaですが、Lambdaではいちばん初めにLambda_function.py という名前のファイルが叩かれるので、この名前のファイルにコードを書いていきます。

import config, json, tweepy, time
from datetime import datetime, date
import birthdaylist
from operator import attrgetter
import sys
from dateutil.relativedelta import relativedelta


def lambda_handler(event, context):
    today = datetime.date(datetime.today() + relativedelta(hours=9))

    if event["event"] == 'howmanydays':
        howmanydays(today)
    elif event["event"] == 'isitbirthday':
        isitbirthday(today)
    elif event["event"] == 'tenminafterbirthday':
        tenminafterbirthday(today)

まず今日は何日なのかをJSTで取得した後に、どの機能を使うかを選んでますね。EventBridgeで渡された値で起動する処理を分けてます。今回はいちばんキモの「誕生日までの日数をカウントしてツイートする機能」をみてみます。

これですね

def howmanydays(today):
    text = str(today.year) + '年' + str(today.month) + '月' + str(today.day) + '日\n'
    i = 0
    for num1 in range(len(birthdaylist.precurelist)): # precurelistを上から1行ずつ評価する
        if today > date(today.year,birthdaylist.precurelist[num1].month,birthdaylist.precurelist[num1].day): # 今年の誕生日を過ぎているか
            year = today.year + 1
        else:
            year = today.year

        later = (date(year,birthdaylist.precurelist[num1].month,birthdaylist.precurelist[num1].day) - today).days # 誕生日までの日数を割り出し
    
        if 0 < later < 31: #誕生日が30日以内の人を抜き出す
            newdata = birthdaylist.Precure_later(later,birthdaylist.precurelist[num1].month,birthdaylist.precurelist[num1].day,birthdaylist.precurelist[num1].name,birthdaylist.precurelist[num1].precurename)
            birthdaylist.precurelist_new.append(newdata)
            i = i + 1
        else:
            continue

    if 0 < len(birthdaylist.precurelist_new):
        tweet_taisho = sorted(birthdaylist.precurelist_new, key=attrgetter('later'))
    
    for num2 in range(len(tweet_taisho)):
        
        if 0 < tweet_taisho[num2].later < 4:
            text = text + '❤️<200d>🔥'
        elif 3 < tweet_taisho[num2].later < 15:
            text = text + '💛️'
        else:
            text = text + '💚'

        text = text + str(tweet_taisho[num2].name) + '/' + str(tweet_taisho[num2].precurename)  + 'の誕生日(' + str(tweet_taisho[num2].month) + '/' + str(tweet_taisho[num2].day) + ')まであと' + str(tweet_taisho[num2].later) + '日\n'

        if 2 == num2 % 3 or num2 + 1 == len(tweet_taisho):
            tweet(text)
            text = str(today.year) + '年' + str(today.month) + '月' + str(today.day) + '日\n'

コメントにちまちま書いていますが、precurelistという別のファイルを読んでいます。 これには各キャラの誕生日が1行に1キャラずつ書いてあるんですが、

  • 1行ずつ評価して今日から誕生日までの日数を割り出す
  • 30日以内だったら別のリストに格納
  • 誕生日から近い順にソートする

ということをやってます。

あとは体裁をととのえてツイート!

tweepyというライブラリを使っています。この手のライブラリではおそらくだいぶメジャーなものです。

def tweet(text: str):
    auth = tweepy.OAuthHandler(config.API_KEY, config.API_SECRET)
    auth.set_access_token(config.ACCESS_TOKEN, config.ACCESS_TOKEN_SECRET)
    api = tweepy.API(auth)
    api.update_status(text)
    print(text)

これで毎日通知してくれます。ぱちぱちぱち。

Lambdaを使うメリット

世の中には簡単にTwitterBotを作るサービスがあったりします。いちばん有名どころだとtwittbot になります。なぜわざわざこのようなサービスを使わず、Lambdaを使うのかというとちゃんとメリットがあります。

安定性がばつぐんによい

Lambdaですがほんっとうに落ちません!簡単な処理しかしていないから、というのも大きいと思いますが「あれ?ツイートしてないな?」ということがまったくないのです。

だいたい無料でできる

Lambdaは公式に以下の説明があるんですが、

AWS Lambda の無料利用枠には、1 か月あたり 100 万件の無料リクエストと、1 か月あたり 40 万 GB-s のコンピューティングタイムが含まれており、x86 および Graviton2 プロセッサの両方を搭載した機能を利用できます。

正直趣味でやるぶんには十分すぎるほどの無料枠があります。使いきれません。

まとめ

Lamba でTwitter botを作る方法をざっくり具体例で紹介しました。わりと簡単にできますし、安定性も抜群、しかも普通に使う分には無料です。

あと、そこそこ需要のあるbotだとほぼ自動でいいねをもらえて承認欲求が満たされます(?)

それは冗談だとしても、なかなかいろいろ使い道のある方法だと思います。自分専用にToDoを通知してくれるbotとか、アイディアはいろいろ湧いてきますね!

個人的にはこの手のbotは需要があると手応えがあるので、別界隈への横展開も考えています。ラブライブなど。いちばんめんどくさいのはTwitter APIの申請です…やるだけなんですけどね。

明日は mafさんです!よろしくお願いしますー!

CKAD合格した

CKA取得に引き続き、CKADも取得しました。

f:id:shibatch:20211127131936p:plain
お馴染みのバッジ
CKA合格直後から勉強は始めたんですが、平日はほぼやらず、休日に勉強していた感じになります。

受験しての感想

「CKA合格しているならばそんなにがんばらなくても合格できるな」ってこと。範囲がだいぶ似ていて、CKADのほうがちょっと狭めです。あと、直前に見直ししていない分野(具体的にはHelmの使い方)があった(直前に気付いた)けれども出題されなかったのは幸運だったかも。

勉強時間と勉強法

勉強法はUdemyの講義に付いている演習(KodeKloud)を一通りやる方法を採りました(講義自体は聞いてないです) 。これ以外は何もやってません。CKA受験の際にKubernetes完全ガイド第2版を一通り読んでいるならば、追加で何か知識を入れる必要はないと思います。

www.udemy.com

基礎的な問題はCKAと重複しているので「これはやらなくてもいいかなー」と思ったものもあったんですが、まぁ範囲漏らすと嫌なので一応すべてやりました。ざっくり勉強記録を見返すと、10/30, 11/6, 11/7, 11/13, 11/20, 11/23 に4〜5時間ずつくらい勉強していました。このUdemyのKodeKloudの内容、Mock Exams(模擬試験)がちょっと簡単な内容で「これが解けるだけでは合格できないのではー?」と思いましたが、その直前にあるLightning Labsというものがまぁまぁ骨がある問題で、これとUpdates for Sep 2021 Changesの章が特に役にたったなーと思います。

試験内容

17問を2時間で解き切る内容。一問が4点or8点の問題で、CKAのように最終問題が13点!といったムラのある傾斜配点じゃなくてよかったです(CKAはこれに苦しめられた)。CKAのようにホストをsshでいったりきたりする必要がなく、私にはCKAより難易度は優しめに感じました。100点満点中93点だったのでまぁまぁ余裕をもてました…

間違えた問題は点数的には1問+部分点って感じぽいですね。意味が分かりにくい問題があったのですが、きちんと確認する方法がコマンドで示されていたりしたので、そのコマンドで出力される内容から逆算してこう言うものを作ればいいんだな、と推理する感じのものもありました(わかりにくい説明ですみません…)

ハプニング(と、英語受験の知見)

このLinux Foundationの資格、CKA受験1回目は試験監督が30分遅刻、CKA受験2回目は画面が固まってしまって試験中断した、と色々ツイている試験なんですが、今回は「試験監督が英語しか話せない」というハプニングに遭遇しました…

もともとCKADは申し込む際に「CKAD」と「CKAD-JP」の2種類があって、試験監督と日本語でチャットしたい場合は「CKAD-JP」を選ぶわけです。ちなみに問題内容はどちらも英語日本語切り替えられるので、本当にチャットを日本語にしたいかどうかだけの違いです。私はCKAを日本語試験監督にしたので今回もCKAD-JPにしました(こっちのほうがちょっと高いです!)。ただ現れた試験監督はしれっと英語しか話せない人でした…あれ?と思ったのですが、試験監督替えてくれと言うのもめんどくさいのでそのまま開始しました(Noと言えない日本人ですね🙃)

ただそのおかげでわかったことがあります。翻訳用にはGoogle翻訳のChromeの拡張機能が使えます。試験開始直前に急いで入れました。「DeepLの翻訳使わせてくれ」と言ったら「別のタブを開くものはあかん」と遠回しに却下されました笑

英語の試験監督でも困らなさそうなことがわかったので、次受けるならば日本語の試験監督のものにはしないかもしれません。

あと、マイクはOFFにするのがいいです。ハウリングするからがいちばんの理由なんですが、試験中に思わず独り言をつぶやいたり、外がちょっと騒がしくても試験監督に咎められたりしないので…

ちょっと思ってること

CKADってちょっと不思議な資格なんですよね…Kubernetesのアプリケーションレイヤをばりばり使うための試験というイメージがあったんですが実際imageではnginxとredisとbusyboxしか使ってない…中立性の問題かな。どうもLinux Foundationが考える実践的な内容というのはblue green deployとか、probeの設定とか(もちろんそれも重要だとは思いますが)、作りたいものがあった上でKubernetes上でどう実現するかって感じなのかなぁ。これを取得したからと言ってKubernetesわかったぜ!って感じにあまりならない…スタートラインって感じですかね。

これから

とりあえず年内はこれ以上がんばりません。次はCKSだ!とも思ってません。AWSの資格に興味があるんで来年はそっちかな〜って思ってます。具体的には「AWS Certified Database Specialty (DBS-C01)」ってやつ。データベース知識が紙レベルしかないので…あと、「AWS Certified Solutions Architect – Associate」が来年で切れちゃうので、上位資格のProfessional挑戦するかもしないかも

CKA受験記録をやらかしたことを中心に書く

CKAという資格を取りました。

f:id:shibatch:20211029001520p:plain
これは資格のバッジ

資格取得は約1年10ヶ月前のAWS ASS以来ですね。そのときの顛末は AWS認定ソリューションアーキテクト (アソシエイト)受験記録と合格したのにやらかしたこと - shibatch's journey に書きました。随分資格取得、ごぶさただったんだなぁ。

今回の資格取得はえらい苦労しました。この資格は自分とたぶん相性が悪い。(相性が悪いと言えるのは合格できたからだけれども…不合格のままだとただの言い訳になってしまうので…)いろんな人の合格体験ブログを読むと「楽勝でした〜✌️楽しかった〜🙌」みたいな記事がたくさんあるけどまぁまぁ苦労した経験は残しておく価値はあるんじゃないかと思って書くことにします。

そもそもCKAって何

検索でこの記事にたどり着いた人には釈迦に説法だけれどもかんたんに書きます。読み飛ばしていいよ。 CKAは正式名称はCertified Kubernetes Administrator で、日本語では「認定Kubernetes管理者試験 」です。コンテナオーケストレーションツール「Kubernetes」に関する資格で、その中でもAdministratorとついているようにKubernetesクラスタの管理をする人向けの資格です。姉妹資格として「CKAD」「CKS」があります。それぞれKubernetesでのアプリケーション開発者、セキュリティの資格となっております。

なぜ受けることにしたのか

業務でもKubernetesを多く活用するようになってきており、自身はSREの立場から網羅的な知識の獲得の必要性を強く感じたから。

勉強方法

巷でよく言われているような勉強法ですね、かんたんには以下になります

  • Kubernetes完全ガイド第2版をひと通り読む
    • 「ひと通り」読んだけれども、CKAにおいて特に重要な章は4章〜13章、19章あたり
  • udemyのCertified Kubernetes Administrator (CKA) with Practice Tests の問題を解く
    • (Mock Exams(模擬試験) はこの時点では解かない)
    • 理解度が不安なセクションは控えておく
  • 理解度が不安だった箇所についてKubernetes完全ガイドを再度読む
    • 自分の場合はService, Ingress, Network Policyあたりが怪しかったのでもう一度読んだ
  • udemyの問題で理解度が怪しかったところを再度解く
  • udemyのMock Examsを解く

こんな感じ。 あと、他の合格記でよく言及されているkubernetes-the-hard-wayはやりませんでした。これは別にやらなくてもよさそうです。

1回目受験して不合格だったときの失敗談

まず前提なんですが一発合格していません。5月に一度受験して不合格になり、一旦距離を置いてから10月に再度勉強を始めて再受験、合格しました。この資格のいいところ(?)は1回は不合格でも再受験できるんですよね。うまく活用できました。

5月受験したときはudemyを講義含めて一通り解いた後、Mock Examsを繰り返し解く勉強法でした。この方法があんまし良くなかった。講義は英語で、まぁ聞き取りやすいし字幕もあるし動画が豊富なので「だいたい分かった」って感じになっていました。その状態でミニテスト、Mock Examsを繰り返し解いてほぼ全問正解できる状態になっていたまま受けたのですが50点ちょいしか取れない。合格点数は100点満点の66点です。思い返してみてダメだった理由を書きますと

  • Mock Examsを繰り返し解きすぎたせいで問題を覚えるレベルになってしまっていた。模擬試験ですべての知識を網羅しているわけではないので少しでも問われる角度が異なると柔軟に対応できなくなっていた
  • Kubernetes完全ガイド第2版はななめ読みした程度だった。細かいところの理解度が足りなかった
  • (これは言い訳だけれども) 試験開始時間になっても監督官が来ず、「え?このまま試験遅れて始まって短い時間で終わったらどうしよう!?!」となった。メールや電話で緊急連絡先に連絡しても音沙汰なしでパニックになった。結局15分後に試験官が何食わぬ顔でログインしてきたけれども精神的にやられた。
  • 補足するとこの試験は試験時間2時間で17問解くもので、だいぶ短いので、冷静に問題の難易度を見極めて解きやすい問題から解いていかないと効率よく点数がとれないのでsy…

こんな感じです。だいたい3週間くらい、業務の合間を縫う+休日を使って勉強したと思います。まぁ勉強不足はありました

不合格後、合格するまで

ここで一旦疲れたので距離を置きました。自分の経験則で、資格って一発で取得しないとズルズル不合格を重ねちゃうってのがあったので一旦離れたのです。その後、9月末に家族旅行へ向かう途中の新幹線の中でふと「さすがにこのままではいかんのでは〜?」と思い直し試験の予約を新幹線の中で行い、旅行から帰った一週間後から勉強を再開。また3週間くらい上に書いた「勉強方法」の内容で勉強して、無事合格とあいなりました。

冒頭でこの資格、「相性が悪い」って書いたけれどもなぜそう思うかと言うと、試験時間が短いので問題を正確に把握する能力が問われ、しかも問題の難易度はまちまちなので、途中の問題で詰まったらさっさと次の問題に進むのがいいのはわかってるんですが、ただ自分のクセで最初の問題からクソ真面目に解きがちで、1回目に受けた時は前述の通りパニックに陥っていたのもあり時間足りない〜終了、という悪いパターンにはまったためです。問題を解く順序はとても重要な試験だと思います

その他Tips

  • 不合格になった場合(そんな人自分以外にあんましいないのかもしれませんが)、間はあまりあけないほうが良いです。当たり前ですが。知識は揮発するのでもう一度勉強し直すハメになりますね。
  • 試験で使うPCは当日一度再起動しておいたほうが良いかもです。2度目の受験のとき、ブラウザが固まってしまって何も入力を受け付けなくなってしまいました…しばらくしたらブラウザは動くけれどもブラウザ上に表示されているターミナルが動かない状態に。監督官にブラウザを再起動してください、と言われたので「本当にやっていいの?セッション切れちゃわないの?」と半信半疑になりながら再起動したら戻りました。焦った。…というわけでこういうリスクを少しでも減らせるよう、PCの再起動くらいはやっておいても良いかもしれません

これから

問題範囲が似通っているCKADを取得したいです。おカネは払った。まだ受験日程は決めてないですが11月中には1度受けます。合格したいなぁ。