Upgrade to Pro — share decks privately, control downloads, hide ads and more …

k8sでJob管理@オレシカナイトVol.10

 k8sでJob管理@オレシカナイトVol.10

506d54f33118160c5d41f73d223544d0?s=128

Wataru Fukunaga

May 24, 2019
Tweet

Transcript

  1. .BZ AbemaTV, Inc. All Rights Reserved LTͰ+PC؅ཧ

  2. 福永 亘 株式会社AbemaTV 広告本部 開発局 マネージャー 2011年株式会社サイバーエージェント⼊社。 「アメブロ」や「ガールフレンド(仮)」、「オルタナティブ ガールズ」などの開発を担当。 2017年9⽉より「AbemaTV」広告本部に参画。

  3. $0/5&/54 1. AbemaTVと広告 2. システム概要 3. Job管理について 4. 課題と展望

  4. AbemaTVと広告 1 簡単な事業紹介

  5. None
  6. ビジネスモデル 広 告 課 ⾦ 放 送 外 収 益

  7. 独⾃のビジネスモデル

  8. 規模感

  9. 広告 ⾼画質 ブランドセーフティ ターゲティング

  10. システム概要 2 広告システム

  11. Ad Insertion ・クラスタ毎に異なる広告を配信 ・マルチデバイス、マルチプラットフォーム

  12. システム全体 Media GKE 広告 GKE CM Live Program

  13. 広告システム

  14. 広告システム 2つのリージョン 2つのGKEクラスタ 様々なDBとミドルウェア 6つのLB

  15. 乱⽴するJob JOB名 内容 参照先(コンポーネント) 書き込み先(コンポーネント) vega-ssp-synchrogazer_job.yaml SSPマスタ連携(差分データ) GCS(Abema) ssp-CloudSQL vega-ssp-synchrogazer-full_job.yaml

    SSPマスタ連携(全データ) GCS(Abema) ssp-CloudSQL vega-report-master-ssp_jobs.yaml SSPマスタ連携(cue_point, genre, sub_genre) SSP BigQuery vega-report-master-ganymede_jobs.yaml placement_performance_prediction_stateマスタ連携 Ganymede BigQuery vega-report-master-dmp_jobs.yaml DMPマスタ連携(cluster, cluster_cf, segment_group) DMP BigQuery vega-report-master-callisto_jobs.yaml delivery_setting_stateマスタ連携 Callisto BigQuery vega-report-master-adserver_jobs.yaml Ad Serverマスタ連携(account, ad, etc.) Ad Server BigQuery vega-report-import-tracking-ad_jobs.yaml tracking_adログ取り込み Storage BigQuery vega-report-convert-tracking-ad_jobs.yaml tracking_adログの変換 BigQuery BigQuery vega-report-convert-endad-vega_jobs.yaml end_adログ+vegaマスタ BigQuery(patriot-999, vega-177606) BigQuery vega-report-check-log_jobs.yaml ログ件数の⽐率チェック BigQuery Slack noti vega-pluto-nix_jobs.yaml ユーザーごとの視聴データを取得し、デモグラを類推する BIgQuery GCS vega-hydra-dataflow_jobs.yaml GCSからDataflowをキックするためのjob GCS Bigtable(dmp-instance) vega-ganymede-prediction_jobs.yaml 予測 CloudSQL、BigQuery、BigQuery(patriot-999)、SSP ganymede-CloudSQL、SSP vega-ganymede-achievement_jobs.yaml 実績値作成 BigQuery ganymede-CloudSQL vega-callisto-teppeki_jobs.yaml 空いてるキューポイントの確認 adServer,ssp,dmp callisto-cloudSQL vega-callisto-simple-placement_jobs.yaml 開発本部向けにstgを埋めるバッチ adServer,ssp,dmp,ganymede callisto-cloudSQL vega-callisto-placement_jobs.yaml プレースメントのバッチ adServer,ssp,dmp,tokenServer,ganymede callisto-cloudSQL vega-callisto-placement_every_hour_0m_jobs 毎時0分に起動する1時間おさえる⽤のプレースメントのバッチ adServer,ssp,dmp,tokenServer,ganymede callisto-cloudSQL vega-callisto-placement_every_hour_30m_jobs 毎時30分に起動する1時間おさえる⽤のプレースメントのバッチ adServer,ssp,dmp,tokenServer,ganymede callisto-cloudSQL vega-callisto-placement_half_day_jobs 半⽇分おさえる⽤のプレースメントのバッチ adServer,ssp,dmp,tokenServer,ganymede callisto-cloudSQL vega-callisto-cmchannel-placement_jobs.yaml CmChannelを埋める⽤のバッチ adServer,ssp,dmp callisto-cloudSQL vega-ad-batch_jobs.yaml フィラーが起こらないように配信のフラグチェック Ad server Slack noti vega-third-party-reporter_job.dig 調査会社連携 BigQuery, Ad Server GCS
  16. ⼤量のJob 様々なタイミング 障害も起きる

  17. Job管理 3 k8sでどう実現したか

  18. k8sのCronJob

  19. 広告プレースメント CMキューポイント CMキューポイント CM(酒) CM(⾞) CM(化粧品) CM(EC) CM(教育) 1時間毎にプレースメントを実施

  20. ユースケース CMキューポイント CMキューポイント CM(酒) CM(⾞) CM(化粧品) CM(EC) CM(教育) 1時間毎にプレースメントを実施 ⾶び込みで編成変更

    プレースメントを再実⾏したい
  21. CronJob apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule:

    "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure
  22. 配信レポート作成 ログ取り込み ログ加⼯ ⼀次集計 外部会社連携 Excel作成 パワポ作成

  23. ユースケース ここでコケた ログ取り込み ログ加⼯ ⼀次集計 外部会社連携 Excel作成 パワポ作成

  24. Job管理ツール

  25. 重要視したこと 履歴管理 再実⾏性 実 績

  26. digdagを採⽤

  27. digファイル timezone: Asia/Tokyo schedule: cron>: 5 0 * * *

    sla: duration: 02:00:00 +notice: slack>: longtime-template.yml _export: !include : 'includes/slack.dig’ target_yaml: /vega-kubernetes/${k8s_cluster}/vega/placement_half_day_jobs.yaml +login: sh>: ./gke-login.sh +check-git: sh>: ./check-git.sh +create-job: sh>: "kubectl apply -f ${target_yaml}” +check-job: sh>: "cat ${target_yaml} | ./check-job.sh - placement-half-day-jobs” _error: sh>: "kubectl delete -f ${target_yaml}” +delete-job: sh>: "kubectl delete -f ${target_yaml}” _error: slack>: danger-template.yml
  28. 事前処理 timezone: Asia/Tokyo schedule: cron>: 5 0 * * *

    sla: duration: 02:00:00 +notice: slack>: longtime-template.yml _export: !include : 'includes/slack.dig’ target_yaml: /vega-kubernetes/${k8s_cluster}/vega/placement_half_day_jobs.yaml +login: sh>: ./gke-login.sh +check-git: sh>: ./check-git.sh
  29. 起動から終了 +create-job: sh>: "kubectl apply -f ${target_yaml}” +check-job: sh>: "cat

    ${target_yaml} | ./check-job.sh - placement-half-day-jobs” _error: sh>: "kubectl delete -f ${target_yaml}” +delete-job: sh>: "kubectl delete -f ${target_yaml}” _error: slack>: danger-template.yml
  30. 稼働チェック #!/bin/bash CMDNAME=`basename $0` if [ $# -lt 1 ];

    then echo "Usage: $CMDNAME jobfile [container]" 1>&2 exit 1 fi eval `kubectl describe -f $1 | awk 'NR==1{printf("jobName=%s",$2)}'` while : do eval `kubectl describe jobs $jobName | grep "Pods Statuses:" | awk 'NR==1{printf("Running=%d;Succeeded=%d;Faild=%d",$3,$6,$9)}'` if [ $Running = 0 ]; then if [ $Succeeded = 0 ]; then echo Job Faild. kubectl logs "jobs/$jobName" $2 exit 1 fi echo Job finished. kubectl logs "jobs/$jobName" $2 exit 0 fi echo Job running... sleep 5 done
  31. UI

  32. digdagを採⽤ スクリプト管理 リッチなUI

  33. 課題と展望 4

  34. 誤検知 k8sのlog digdagの管理

  35. cloudnative マネージド 教えてください︕

  36. ご清聴ありがとうございました