MoTLab -GO Inc. Engineering Blog-MoTLab -GO Inc. Engineering Blog-

MoTオリジナルのK8sコマンドについて

ServerSideK8s
September 10, 2021

みなさん、こんにちは。

タクシーデリバリーアプリ「GO Dine」のバックエンドエンジニアをしている平井と申します。

MoT TechTalk #6の中でも触れたのですが、弊社では、Amazon EKS上にKenos(ケノス)と呼んでいるK8sがベースとなっているインフラ基盤をSREチームが構築し、プロダクト開発に活用しています。


過去の記事ですが、こちらに概要説明があります。

※2020/4/1の事業統合後、サービス名がKenosに変わっていますが、設計思想は記事の通りです。

Kenosには、エンジニアリングをサポートする、開発者向けのオリジナルコマンドが用意されています。

今回は、この中でよく使うものについてご紹介をさせてください。

凡例について

{ENVIRONMENT}は、devやprodなどの値が入ります。

{PORT_NO}は、1234など、Kenos側で定められているポート番号が入ります。

{stacktrace}は、スタックトレース情報が入ります。

DBのプロキシ

背景や利用目的

各環境のDBにローカルのPCから接続するには、直接接続はできず、プロキシ経由で接続するようになっています。以下のコマンドを利用して接続しています。

コマンド例

kns {ENVIRONMENT} proxy -f {PORT_NO}

サーバーのログ確認

背景や利用目的

サーバーのログは、BigQueryに溜まってはいるのですが、サクッとログを確認したい場合に利用しています。

コマンド例

kns {ENVIRONMENT} logs

{"level":"info","time":"2021-09-03T05:04:55.144145584Z","msg":"http request success","host":"redacted","protocol":"HTTP/1.1","referer":"","bytes_in":"1728","bytes_out":"108161","type":"log","fp":{"id":"968633af-5b24-4088-9723-a19fe02630c1","ct":"2021-09-03T05:04:55.136251943Z"},"request_id":"faeeb1f62941e6637ef4987601dbc329","in_request":{"ctx":{"ua":"node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"},"type":"http","service":"main","method":"POST /v1/graphql","start_time":"2021-09-03T05:04:55.136270432Z","duration_ms":7.838,"status_code":"200"}}
{"level":"info","time":"2021-09-03T05:22:00.118039403Z","msg":"http request success","host":"redacted","protocol":"HTTP/1.1","referer":"","bytes_in":"1728","bytes_out":"108161","type":"log","fp":{"id":"f3113410-6f36-401a-8184-cdc55f190342","ct":"2021-09-03T05:22:00.109905669Z"},"request_id":"65ae632b8c7f535ea3ad534fd8c65df9","in_request":{"ctx":{"ua":"node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"},"type":"http","service":"main","method":"POST /v1/graphql","start_time":"2021-09-03T05:22:00.109928302Z","duration_ms":8.07,"status_code":"200"}}
{"level":"info","time":"2021-09-03T05:33:52.315674292Z","msg":"http request success","host":"redacted","protocol":"HTTP/1.1","referer":"","bytes_in":"1728","bytes_out":"108161","type":"log","fp":{"id":"513f755f-314c-4f44-b101-7c51879c9c73","ct":"2021-09-03T05:33:52.308182634Z"},"request_id":"062bfe99fb54b05701cb816c60304567","in_request":{"ctx":{"ua":"node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"},"type":"http","service":"main","method":"POST /v1/graphql","start_time":"2021-09-03T05:33:52.308201099Z","duration_ms":7.425,"status_code":"200"}}
{"level":"info","time":"2021-09-03T05:48:54.710698283Z","msg":"http request success","host":"redacted","protocol":"HTTP/1.1","referer":"","bytes_in":"1728","bytes_out":"108161","type":"log","fp":{"id":"eb483320-2c4f-4f6a-b9bc-ebcb4f7a5226","ct":"2021-09-03T05:48:54.701508692Z"},"request_id":"d4f86843ef2a501715f82c3f6cea822c","in_request":{"ctx":{"ua":"node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"},"type":"http","service":"main","method":"POST /v1/graphql","start_time":"2021-09-03T05:48:54.701533454Z","duration_ms":9.099,"status_code":"200"}}

コマンド例( 少し応用篇)

kns dev logs | grep ERROR | jq .
{
  "level": "error",
  "time": "2021-09-06T03:48:50.203814896Z",
  "msg": "domain error",
  "error": {
    省略・・・
  },
  "fp": {
    "id": "ec7f8355-d688-4b94-ae20-f0ad4079420e",
    "ct": "2021-09-06T03:48:50.101055334Z"
  },
  "request_id": "91bfb0bdc3cc210d8db6daf34c1288b3",
  "in_request": {
    "ctx": {
      "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
    },
    省略・・・
  },
  "local_ctx": {
    "viewer_id": "a0eda9e8-39c9-438e-8933-8eac8fffc5b7"
  },
  "type": "log",
  "stacktrace": "{stacktrace}"
}
{
  "level": "error",
  "time": "2021-09-06T03:48:50.323417767Z",
  "msg": "domain error",
  "error": {
    省略・・・
    }
  },
  "fp": {
    "id": "f012d80e-6415-4f4e-bc44-43b29b6ea652",
    "ct": "2021-09-06T03:48:50.094455262Z"
  },
  "request_id": "8d0254f9e81eb2f968d6cac2a48409ca",
  "in_request": {
    "ctx": {
      "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
    },
    省略・・・
  },
  "local_ctx": {
    "viewer_id": "a0eda9e8-39c9-438e-8933-8eac8fffc5b7"
  },
  "type": "log",
  "stacktrace": "{stacktrace}"
}

※機密情報に関する部分は省略しています。

ポートフォワード

背景や利用目的

プライベートサブネットにあるPodにローカル環境から接続するために使います。

コマンド例

kns {ENVIRONMENT} forward -f {PORT_NO}

手動デプロイ

背景や利用目的

通常は、GitHubのブランチをマージしたタイミングで、CI/CD経由で自動デプロイされるようになっています。デプロイ後にサーバーの環境変数などを更新した場合、その設定を反映する際に利用しています。

※CIからデプロイリクエストを投げることも可能ですが、このコマンドを使うことにより、再デプロイが高速に行えるメリットがあります。

コマンド例

kns deploy -e {ENVIRONMENT} -a {アプリケーション名} --version {デプロイバージョン番号} --execute

We're Hiring!

📢
Mobility Technologies ではともに働くエンジニアを募集しています。

興味のある方は 採用ページ も見ていただけると嬉しいです。

Twitter @mot_techtalk のフォローもよろしくお願いします!