見出し画像

2018-12-05 JapanContainerDays v18.12 Day2

2018/12/05 に開催された JapanContainerDays v18.12 Day2 のイベントレポートです。

●イベントのテーマ
JapanContainerDays(JKD)はコンテナ活用/クラウドネイティブの現状をひとまとめにした開発者のためのイベントです。コンテナエコシステムを形成する数多くの技術やソリューションを歓迎します。

■Kubernetesではじめる深層学習♥推論環境構築ハンズオン

阿佐 志保さん ほか数名(日本マイクロソフト)

●コンテナの利用シーン
・Lift and Shift
・Microservices
・Machine Learning
・IoT

●K8sの基本(この概念は理解しよう)
・Pod
  k8sの最小管理単位
  複数コンテナ
  1ホストで動く
・ReplicaSet
  Podのレプリカのグループ
  指定数だけ起動を保持
・Deployment
  ReplicaSetの世代管理
  ローリングアップデート、ロールバック

●深層学習のタスク
・データの準備 > モデル構築/ガウク集 > 推論デプロイメント
・推論環境もアプリと同様にデプロイが必要です!

●AzureのCustomVision
・オリジナル画像で画像認識アプリを作成するSaaS
・Dockerfileとして学習済みモデルをエクスポートできる!

●ハンズオン
・MSアカウント作成
・AzurePass有効化
・手順
  https://github.com/asashiho/ContainerDays1812

●QA
・深層学習 & Dockerfile の運用イメージ
  Containerに学習済みモデルを含める
  学習済みモデル と Container image のバージョンを揃える
# ハンズオンの再接続時に必要だった環境変数

RES_GROUP=AKS-HandsOn
LOCATION=eastus
AKS_CLUSTER=akscluster

# from Deployment.yaml
ACR_NAME=acrregistry99999

CLIENT_ID=$(az aks show -g $RES_GROUP -n $AKS_CLUSTER --query "servicePrincipalProfile.clientId" -o tsv)
ACR_ID=$(az acr show -n $ACR_NAME -g $RES_GROUP --query "id" -o tsv)

# from ConfigMap.yaml
BLOB_ACCOUNT=blobstorage999990

■GitLabによるコンテナCI/CDパイプラインのこれから

北山 晋吾さん(GitLab Tokyo)

●GitLabのビジョン
・開発チームがToolchainを維持する工数をなくす
・開発に注力してほしい

●Concurrent DevOps
・Traditional DevOps
  Plan > Create > Verify > Package > Release > Configure > Monitor
  多くの企業はDevOpsパイプラインに 3~6個のツール雨を利用している
  連携が大変!
  社内統制が取れない
  → GitLab の Complete DevOps
・Concurrent DevOps

●Container CI/CD with GitOps
・これまでのCI/CD
  AppCode Repository > CI > Application Packages
   > Application Deploy > Maintenance > Release > alert
・Container CI/CD
  AppCode Repository > CI > Application Packages
   > Manifest Repository
   > Container Deploy > Maintenance > Release > alert
・SREの負荷が高まる
  デプロイ承認の負荷
  デプロイ運用の負荷
  →GitOps
・GitOps
  Application CodeだけでなくManifest運用も、MergeRequestで!
  Manifest用リポジトリはApplicationと分ける
・GitOpsでの動的な運用
  「動いている設定」と「管理している設定」
   自動でDiff Check & 同期
   -> Weave Flux
     katacodaがついている
     GitLab と Weave Flux で GitOps してみた のスライド

●Auto DevOps
・対象領域
  CI/CD, Security, Monitoring, Alert...
  Kubernetesがやってくれないこと
・ステージ
  AutoBuild
  AutoTest
  AutoCodeQuality
  AutoSAST
  AutoDependencyScanning
  AutoLicenseManagement
  AutoContainerScanning
  AutoReviewApp
  AutoDAST
  AutoDeploy
  AutoBrowserPerfomanceTest
  AutoMonitoring
・構成
  GitLab Instance
  KubernetesCluster
    gitlab-managed-apps
    project-name
      ブランチごと

●できること
・GKEならクラスタも作れる
・デプロイ可能なアプリ
  JupyterHub
  Knative
  も
・環境ごとにnamespaceも分けられる
・自動デプロイ と 手動デプロイ も切り分けられる
・helmの設定も作ってくれる
・静的解析もかかる
・レビュー用のアプリケーションをデプロイ
・sitespeed.io: パフォーマンスチェック
・prometheus: モニタリング
・MergeRequest に指摘事項も入れてくれる
・OWASP ZAP: 動的なテスト
・clair: コンテナスキャン

●まとめ
・DevSecOpsのToolchainが全部入り
・GitLab Meetup Tokyo #12 が 12/20にあるよ!
・クリエーションラインで学べるよ

※Weave Fluxの参考スライド

■改めてDockerfileのベストプラクティスを振り返ろう

林 如弥さん(オイシックス・ラ・大地)

※mobyのmulti stage buildに対応したコミットが勉強になるよ!

●Dockerfileとは
・docker imageをつくる設定
・17個の命令

●ベストプラクティスをふりかえる
・docs.docker.comで公開されている
・26分では読めないw
・章立て
  一般的なガイドライン
  命令語について
  オフィシャルなサンプル
  追加情報へのリンク

●一般的なガイドライン
・ステートレスなコンテナを創るべし
  停止=データは削除
  バージョンアップ
  12 factor apps
・docker build時にどこでビルドされるのかを理解
  ビルドコンテクスト
  デフォルトはカレント
  -fで指定できる
  contextと Dockerfileの管理でディレクトリを分けられる
・dockerfileを作成しなくてもパイプラインでstdoutからdocker buildへコマンドを渡せる
  ヒアドキュメントとか
  リモートのビルドコンテクストにも標準出力からdockerfileを渡せる
・.dockerignoreで除外
・マルチステージビルドを使う
  goなど。ビルド前、ビルド後でステージを分ける
  皇族は、 scratch & 前ステージを参照
・軽くしよう
・1コンテナ = 1アプリが原則
  1コンテナ = 1プロセスではない
  apache, postgresなど
・レイヤ数は可能な限り減らす
  RUN, COPY, ADDがレイヤを増やす
  LABELも創るけどサイズ影響なし
  マルチステージ使ってね
  docker historyでレイヤ数、レイヤの各サイズが見れる
  GitHub orisano/dlayer で更に見れる
・複数行の引数はソートしよう
・ビルドキャッシュを活用する
  上から順にキャッシュされる
    変更されるものは、後ろに書こう
  ADD, COPYはファイルのハッシュをチェックしている
  RUNは文字列でチェック
    apt updateなど気をつけよう

●命令語について
・FROM
  小さいイメージをベースに
・RUN
  可能な限りコマンドをまとめる
  削除を別のレイヤでやっちゃだめ
・CMD
  デフォルトコマンドの指定
  exec formを使う
    環境変数が展開できないから shell -c で!
  毎回同じコマンドなら ENTRYPOINT
・ADD / COPY
  基本はCOPY
  ADDは展開しながら取り込み、URLからも撮ってこれる
・ENTRYPOINT
  docker run
    ENTRYPOINT + CMD
  引数が渡されると CMD が上書きされる

●まとめ
・ADD/COPY, CMD/ENTRYPOINT の使い分けは覚える
・ベストプラクティスは参考程度で
・container builders meetup 面白いよー

■GitOpsではじめるKubernetes CI/CD Pipeline

遠藤 耕平さん(LINE)

●バージョン管理のおさらい
・gir-flow, github-flow, gitlab-flow などアプリのブランチ戦略
  ちゃんとやらないとデグレ頻発
・コンテナだと
  アプリ
  Dockerfile
  Manifest
・manifestもアプリと同様にバージョン管理が必要

●GitOpsとは?
  k8s manifest をクラスタにContinuous Deliveryする手法
・原則
  すべてgit管理
  実行環境で変更しない
  変更をモニタリング
  ※非コンテナと同じ
・CIOps
  CI toolがk8sクラスタに直接展開
  複雑なパイプラインの最後でデプロイ
  クレデンシャルの管理が大変
  CI Toolにクレデンシャル持っていてよいの?
・Developer, CI Tool から k8sにdeployさせない
  これが正解ではないはず
・実現するには?
  すべてをgit管理
  GitOpsを実現するkubernetes operatorを同ニュ
・もたらしてくれること
  継続的で安定したクラスタ運用

●導入するポイント
・gitのリポジトリを分ける
  app + Dockerfile
  k8s manifest
  -> manifestの変更でデプロイできる
・git上のmanifestとk8sで動いている差分をチェック
・Replica吸うの扱い
  manifestに数を指定していると動機が遅れるかも
・機密情報の扱い
  secretをgit管理は危険
  暗号化して管理 sealed-secret など
・リソースの削除(rename)
  残っちゃうことも
・gitブランチとk8sクラスタのデプロイ戦略

●どんなツールがある?
・Argo CD / weave flux / JenkinsX の三つ巴
・ポイント
  WebUI
  差分検知/同期の種類
  manifest削除時の挙動
  対応しているmanifestの形式
・参考
  GitLab と Weave Flux で GitOps してみた ※前述

■MeetUpを活性化せよ! 最強のリアルタイムQA投稿アプリをCloud Nativeに作ってみた

早川 博さん、杉山 卓さん(Cloud Native Developers JP)

●cndjp
  Cloud NativeなOSSスタックを取り上げる勉強会、コミュニティ

●Qicoo
・読み方
  きこー
・URL
  https://qicoo.tokyo
・モチベーション
  せっかくエンジニアが集まるのにインタラクションがないのはもったいない

●やってみてどうだった?
・コミュニケーションの工夫
  ・オンラインのツールを使うと結構行ける
・費用の工夫
  ・開発期間: 3ヶ月
  ・クラウドの料金よりロゴのほうがお金かかった
・技術的な障害を乗り越えるパワーに感銘
・本業を抱えながらOSS開発は難しい
・費用面は意外となんとかなる

●Qicooで利用しているAWSサービス
・EKS, EC2, RDS(MySQL), ElasticCache(Redis)
・CloudFront, Route53, S3, Certificate Manager

●Qicoo Architecture
1. route53で名前解決
2. CloudFrontの静的ファイル & CertificateManagerの証明書
3. ブラウザ上に静的ファイルが表示
4. Route53のExternalDNSでk8sから解決
5. ELB経由でEKSにアクセス & 証明書
6. データストアから取得
7. ElasticCache or RDS
8. ClientにJSONレスポンス

●Qicooの技術要素紹介
・Front
  TypeScript, React, Redux, Bootstrap
・Backend
  Golang
  v1/イベントID/questions?start開始番号&end=終了番号&sort=xxx&order=xxx
・CI/CD
  TravisCI
  Kusomize
  Spinnaker
・Auto UP/DOWN
  HeptioArk, Ansible, Python(Slackbot), CloudFormationなど
・EKSでのサービス公開
  ExternalDNSで任意のFQDNで公開
  k8sでservice, ingressで公開したい名前を指定 -> Route53にAレコード
  手順
    ドメイン購入
    Route53でHostedZone作成
    NSレコードの値を買ったドメインに設定
    Certificate Managerで証明書
    EKSでExternalDNS

●CI/CD深掘り
・GitOpsしてます
・SpinnakerのKayenta(カエンタ)
  カナリアリリース
    Spinnakerでは、数でリクエストを制御
  様々なMetricを比較してくれる
  Defauultでは含まれていない
・手順
  PrometheusOperator
  Halyardで設定
  spinコマンドで、pipeline as a codeできるようになった!
・cndjpのGithub
  github.com/cndjp
・ブランチ戦略
  masterブランチ > productionデプロイ
  releaseブランチ > stagingデプロイ
  featureブランチ
・CI/CDパイプライン
  featureブランチ
    push > TravisCI
    CDなし
    動作確認はlocal
  releaseブランチ
    プルリのmerge > TravisCI
      DockerBuild, push
      バージョン番号-日付
      Kustomizeを実行するrepoをclone
      kustomizeのパラメータを用意
      push > TrabisCI
        image tagを設定
        kustomize build でmanifest生成
        webhook > spinnaker
  masterブランチ
    spinnakerからカナリアリリース
・Spinnakerの所管
  シンプルなら良い
    shell実行でjenkins連携
    外部リソース参照でも制約が多い
  何らかのCI + Kustomize + Spinnakerは相性良さそう
    CI側でKusomize
    Spinnakerはシンプルに

●QA
・AWSとGCPはどう使い分けている?
  metricデータをBigQueryに入れたかった
  slackbotの実行環境
・どうやって図を描いたの?
  cloudcraft
・他の勉強会でも使って良い?
  使って良いものですが、まだ情報揃ってない

■改めて見直すコンテナベースで作るメリット

リクルートテクノロジーズ

●事例のサービス
  ジョブオプLite

●インフラアーキテクト視点
・いきなり全部盛りは事故のもと
  組織にノウハウと文化ができてから

・CloudNative Trail Mapでマイルストーンを決める
  既存の技術スタック
  メンバーの数、習熟度
  開発期間

・インフラ面の要件
1. インフラの提供がアプリ開発うの足かせにならないように
  オンプレ -> パブリッククラウド
2. 何かあっても他の環境で動かせるように
  ECS -> Kubernetes
3. 中期的なコスト削減
  Monitoring
    Prometheus -> Datadog
  CI
    circleci
      1.x -> 2.xの過渡期だった
      ライセンス料
    jenkins
      バージョンアップ辛い
    concourse
      コンテナベース
      機能が豊富
      アドホック排除
  managed service
    SQS, SNS, SESなどを利用した
      コンテナが得意でないもの
      手間を省いてくれるもの vs ロックイン

●アプリケーションエンジニア視点
・CIの役割
  高頻度のテスト実行
  欠陥の早期検出 ※ここが大切

・割れ窓理論
  長期間修理されない割れた窓
  -> ぞんざいな扱いの感覚が植え付けられていく
    -> 割れた瞬間に検出!

・CIに求められること
  信頼性: 環境依存で失敗があると使えない
  短時間: 時間がかかると使えない
  -> 環境差分があると信じられなくなる

・環境差分あるある
  モジュールの初期化順
  並列数に依存
  外界に依存
  ローカルキャッシュに依存
  共用環境で一緒に走っているタスクに影響を受ける
  -> 調査できない

・コンテナとCIの親和性
  ビルドごとに隔離された環境
  CIと同じ環境を、ローカルに持ってくることもできる
  -> 調査が楽。DXが高い!

・コンテナベースのCI
  ビルド/テストをコンテナ上で実行
  ビルドに使ったコンテナは都度push
  プルリ作成でトリガー
  -> CIの信頼性高まった!

・ビルド実行時間の問題
  テスト実行ごとに build / push / pull
  -> 2hかかってしまうことも

・CIの健全化
  失敗させるべきものに早く気づく
    外界に依存しないテストは docker build で失敗させる
    Test Sizes
      Small(外界依存なし) / Medium(localhost) / Large
      テスト名にプリフィックスをつけるルールなど
      大多数はsmallで検出できる

●インフラエンジニア視点
・コンテナベースのCI/CD
  機能はモダン
  非機能で問題

・CIサイクルの長さ
  開発効率が低下: PRのバッチサイズが大きく
  masterブランチが壊れる: 一気に入れて壊れる

・ビルド速度に配慮のないDockerfile
  レイヤキャッシュ
    依存ライブラリのCOPYを分けて、前に持ってくるとか
  CI上でcache
    近いtagのimageを持ってくる
    中間レイヤも持ってくる
  など
  ※詳しくは別スライドで

・安心して開発するために
  アプリ-インフラ間のコミュニケーション
    接続情報は環境変数で、など決める必要がるものは先にルール化
  CD
    モブデプロイして敷居を下げる
    誰でも実施できるように整備

・開発で最初に運用するのはCI/CDサーバ!

●まとめ/これから/残課題
・品質向上
  安全になっているから、別のカイゼンに挑戦できる
  CIのカイゼンはずっと必要!

・アプリ-インフラのコミュニケーション
  これは開発の内側
    -> 経営層などの上位へ
    -> 隣のプロジェクトへ

■NoOpsが目指す未来像とコンテナ技術

岡 大勝さん、川崎 庸市さん(NoOps Japan)

●NoOpsとは
・システムは「価値」と「負担」でできている
  理想: 価値は大きく、負担は軽い
  現実: 価値はそこそこ、重い負担
    負担だらけで身も心も、競争力も消耗

・NoOps = No "Uncofortable" Ops
  運用の"うれしくない"を、なくそう

・攻めのNoOps/守りのNoOps
  王道は守り: SRE
  NoOps最上の索 > 攻め

・Design for NoOps + Less Ops
  Design for NoOps
    Self Healing
    In-flight renewing
    Adaptive Scale

・NoOps のライフサイクル
  監視・検知
  自動構成
  高い回復性: 30秒以内
  正常稼働

●現状
・攻めのNoOpsが実現できるようになってきた
  観点は、自動化 / 抽象化 / 標準化

・コンテナ標準化とガバナンス
  OCI / CNCF の標準化で、ツールがたくさん出てきた!
  -> k8sでのステートフルワークロードを扱う仕組みも出てきた
    まだ、理想には遠い

・コンテナのデリバリサイクル
  コンテナ可搬性
  マイクロサービス
  CI/CDパイプライン

・コンテナセキュリティ
  セキュリティの伴わない自動化に価値はない

・監視/問題検知
  豊富な選択肢から組み合わせで選べるようになってきた

・マイクロサービスが抱える問題
  Commuunication
  Discovery
  Observability
  Security ※重要!

・Service Mesh
  Control Plane と Data Plane
  ネットワーク抽象化レイヤ
    アプリ変更なしでネットワーク周りをいろいろやってくれる

・k8s + Service Mesh をベースにしたアプリのライフサイクルを抽象化

●未来
・シナリオ
  ・想定を遥かに越えたアクセスが来ようが
   リージョン、クラウドサービス全体が落ちようが
   どんな状況でも安定稼働
  ・リリース、パッチ、アップデート、設備更改などの
   システム運用を無停止で実施

・鍵は、動的な資源管理
  取り回しの軽さで直ぐに回復

・無限のリソース雨を、ミリ秒単位で架空補できるならどう設計するか
  -> 構造的にOps不要にするならどう設計する?

・インターネットをひとつのコンピュータとして考えてみる
  高台でフラットなリソースプール
  自律的なリソースの割り当て、開放、リソース
  統一されたリソースAPI

・The Network is the Computer.
  42億のノードがデプロイ候補
    システム構成を投げ込むと世界のどこかにデプロイしてくれる
    不具合に気づいてglobalにリカバリ
  過去の知見が生かされて、実現されてきている

・足りないシナリオ: セキュリティ
  システム外部からの攻撃、ウィルスの混入、不正行為など
  42億のノードをどう守る?

・Zero Trust Network
  境界線 vs. Zero Trust
    Vnet, VPCの中で、という発想は境界線側の発想
  ネットワークのどこに置いても保護される

・Service Meshは、Zero Trust Architectureの実装
  k8s + Service Meshで、コンテナアプリをマルチクラウドに

・Design for NoOps を今日更新
  Self Healing
  In-flight renewing
  Adaptive Scale
  Safety Everywhere ←追加!

・限りなくBroundaryのない世界
  オンプレ、クラウド、クラウドベンダーを選ぶ > toilだね

・コンテナ技術の延長に未来がある
  KeyTech は Mesh と その相互互換性
  中でもService Mesh Proxyの進化
  datastoreはまだ見えない。要チェック

●今から着手すべきこと
・コンテナを「回復性」に着目して使いはじめる
  5秒で回復するならどう設計する?
・ネットワークを小刻みにせず、できるだけ広くとる
・境界線主義のセキュリティとサヨナラ
  -> The Network is the Computer を見据える

●NoOps = No Boundary
・意図的な境界線をなくす
・商業的な囲い込み戦略を見直そう
・オープンでフラットな世界にこそ未来がある

■感想

今日も、ワクワクをたくさんいただきました!

Design for NoOps のお話を聞いて、個人的に再認識したのは
・仕組みが整ってきたことで No Ops は、きっと実現できる!
・実現に向けて、考えて試し続けていかなくては!
・その価値を利用できるヒトを増やしていく方法を考えなくては!
でした。

こんなにワクワクする展望が望めるほど進んだテクノロジーが
届いていない、地域、業種・職種、世代は、まだまだ沢山。。。
テクノロジーを届ける活動を進めていきたいと思います!


The Agile Guild(TAG) Advent Calendar 2018 5日目の記事として書いてみました。

> TAGに参加する
> TAGに相談する
どちらも、こちらのページから。


Day1 の様子はこちら


この記事が参加している募集

いつも応援していただいている皆さん支えられています。