TT Lab
はじめる
学ぶ 学習パス コース

CNPA — クラウドネイティブプラットフォームエンジニアリングアソシエイト

ゴールデンパスの遵守を診断として提供する

TT Labで続きを見る

目標

ゴールデンパスのルールを値として定義し、それを実際に判定する診断ツールを作り、準拠率を数えて、コミットの前に組み込むところまでを一通り試します。

なぜ重要なのか

ルールをアドミッションだけで止めると、開発者は30分後にようやく、1分で直せる問題を知ることになり、すべてを手前で止めると、人々はプラットフォームを迂回します。そのため、実務のガードレールは2つに分けて配置されます。破ったときにほかの人に被害が及ぶルールは止め、そのサービス自身の問題であるルールは、知らせるだけにします。そのためには、ルールに識別子と重大度と直し方が付いている必要があります。そして、診断ツールは必ず反対方向からも試す必要があります。何も検出できない診断ツールは、準拠率を100%に見せてしまい、ないより悪いものです。

ステップ

  1. /root/cnpa-devex/rules.jsonにルール5つを配列として書いてください。各要素はid、title、severity、fixを持ちます。PR001(イメージタグの固定)とPR002(リソースrequestの宣言)はseverityがblock、PR003(標準ラベルapp.kubernetes.io/nameとapp.kubernetes.io/part-of)、PR004(readinessProbe)、PR005(replicasが2以上)はwarnです。fixは8文字以上で書きます。
  2. /root/cnpa-devex/check-paved-road.shを作成し、実行権限を付けてください。引数として受け取ったマニフェストを読み、違反したルールのidを1行に1つずつ出力します。このステップでは、PR001とPR002だけを判定すれば構いません。PR001は、最初のコンテナのイメージにタグがない、またはタグがlatestのとき、PR002は、最初のコンテナにresources.requests.cpuまたはresources.requests.memoryがないときです。
  3. 残りの3つのルールを実装してください。PR003は、metadata.labelsにapp.kubernetes.io/nameまたはapp.kubernetes.io/part-ofがないとき、PR004は、最初のコンテナにreadinessProbeがないとき、PR005は、spec.replicasがない、または2より小さいときです。違反が1つもなければ終了コード0、1つでもあれば1で終了する必要があります。
  4. /root/cnpa-devex/services/checkout.yamlに、5つのルールをすべて守るDeployment checkoutを作成してください。ファイルには、Deploymentを1つだけ入れます。
  5. /root/cnpa-devex/services/reports.yamlにDeployment reportsを作成してください。PR001とPR005だけを破る必要があります。/root/cnpa-devex/services/billing.yamlにはDeployment billingを作成し、PR004だけを破るようにしてください。
  6. 診断ツールに--jsonモードを追加してください。check-paved-road.sh --json <파일>(プレースホルダーはファイル名です)は、{"file": "<받은 경로>", "violations": ["PR001", ...], "pass": true 또는 false}(プレースホルダーは受け取ったパスで、韓国語の接続詞は「または」という意味です)の形のJSONを、1つのまとまりとして出力します。passは引用符なしのブール値で、違反がなければviolationsは空の配列です。
  7. /root/cnpa-devex/services/のマニフェストすべてに診断ツールを回して、/root/cnpa-devex/adoption.jsonを作成してください。キーはtotal(検査したファイル数)、passing(違反のないファイル数)、rate_pct(準拠率、小数第1位)、by_rule(5つのルールそれぞれの違反ファイル数。0のルールもキーを置きます)です。
  8. /root/cnpa-devex/repoにgitリポジトリを作成し、services/ディレクトリを置いてください。.git/hooks/pre-commitを作成して実行権限を付け、ステージされたservices/*.yamlを診断ツールで検査するようにしてください。blockルールを破ったファイルがあれば、ルールidを出力して0以外のコードで終了し、コミットを止めます。warnルールだけを破った場合は、案内を出力するだけで、コミットを通します。止められるコミットを1回試して、その出力を/root/cnpa-devex/blocked-commit.txtに保存してください。

参考

ルールを値として定義する

/root/cnpa-devex/rules.jsonにルール5つを配列として書いてください。各要素はid、title、severity、fixを持ちます。PR001(イメージタグの固定)とPR002(リソースrequestの宣言)はseverityがblock、PR003(標準ラベルapp.kubernetes.io/nameとapp.kubernetes.io/part-of)、PR004(readinessProbe)、PR005(replicasが2以上)はwarnです。fixは8文字以上で書きます。

ルールごとに、識別子・タイトル・重大度・直し方が必要です。重大度は、「破ったときにほかの人に被害が及ぶか」で分けます。

診断ツールの骨組みと2つのルール

/root/cnpa-devex/check-paved-road.shを作成し、実行権限を付けてください。引数として受け取ったマニフェストを読み、違反したルールのidを1行に1つずつ出力します。このステップでは、PR001とPR002だけを判定すれば構いません。PR001は、最初のコンテナのイメージにタグがない、またはタグがlatestのとき、PR002は、最初のコンテナにresources.requests.cpuまたはresources.requests.memoryがないときです。

マニフェストの値はyqで読みます。ない値は文字列nullとして出るので、それを判定条件に使えばよいです。実行権限を忘れないでください。

5つのルールをすべて判定する

残りの3つのルールを実装してください。PR003は、metadata.labelsにapp.kubernetes.io/nameまたはapp.kubernetes.io/part-ofがないとき、PR004は、最初のコンテナにreadinessProbeがないとき、PR005は、spec.replicasがない、または2より小さいときです。違反が1つもなければ終了コード0、1つでもあれば1で終了する必要があります。

ラベルはドットを含むキーなので、yqでは引用符で囲む必要があります。レプリカは、値がないときと1のときの両方を検出する必要があります。

準拠するサンプル

/root/cnpa-devex/services/checkout.yamlに、5つのルールをすべて守るDeployment checkoutを作成してください。ファイルには、Deploymentを1つだけ入れます。

5つのルールをすべて守るDeploymentを1つ作成します。診断ツールは何も出力せず、0で終了する必要があります。

わざと違反させたサンプル

/root/cnpa-devex/services/reports.yamlにDeployment reportsを作成してください。PR001とPR005だけを破る必要があります。/root/cnpa-devex/services/billing.yamlにはDeployment billingを作成し、PR004だけを破るようにしてください。

指定されたルールだけを正確に破る必要があります。ほかのルールまで破ると、診断ツールが正しくても、採点は通りません。

機械が読める出力

診断ツールに--jsonモードを追加してください。check-paved-road.sh --json <파일>(プレースホルダーはファイル名です)は、{"file": "<받은 경로>", "violations": ["PR001", ...], "pass": true 또는 false}(プレースホルダーは受け取ったパスで、韓国語の接続詞は「または」という意味です)の形のJSONを、1つのまとまりとして出力します。passは引用符なしのブール値で、違反がなければviolationsは空の配列です。

同じ判定を、JSONの1つのまとまりとしても出力します。passは引用符なしのブール値である必要があり、違反がないときviolationsは空の配列である必要があります。

準拠率の計算

/root/cnpa-devex/services/のマニフェストすべてに診断ツールを回して、/root/cnpa-devex/adoption.jsonを作成してください。キーはtotal(検査したファイル数)、passing(違反のないファイル数)、rate_pct(準拠率、小数第1位)、by_rule(5つのルールそれぞれの違反ファイル数。0のルールもキーを置きます)です。

サービスのディレクトリを走査して診断ツールを回し、その結果を数えればよいです。数字を直接書かず、計算した値を入れてください。

コミットの前に組み込む

/root/cnpa-devex/repoにgitリポジトリを作成し、services/ディレクトリを置いてください。.git/hooks/pre-commitを作成して実行権限を付け、ステージされたservices/*.yamlを診断ツールで検査するようにしてください。blockルールを破ったファイルがあれば、ルールidを出力して0以外のコードで終了し、コミットを止めます。warnルールだけを破った場合は、案内を出力するだけで、コミットを通します。止められるコミットを1回試して、その出力を/root/cnpa-devex/blocked-commit.txtに保存してください。

フックは、実行権限がないと動きません。ステージされたファイルの一覧はgitが教えてくれ、フックはblockルールのときだけ0以外の値で終了する必要があります。