今日は「Japan Container Days v18.04」に参加してきた.正直「Container Days」と言うよりも「Kubernetes Days」って感じだったけど,1日ずっとコンテナのことばかりを考えていた.発表テーマも多岐にわたっていて,バランスが非常に良かったと思う.僕が参加したセッションをまとめておく.
サイバーエージェントにおけるプライベートコンテナ基盤 AKE を支える技術
- ake client を使ってクラスタを起動できる
- ake client の裏は OpenStack Heat を使っている
- Kubernetes にパッチを当てているため,ビルドから始める
- Kubernetes と Swarm をサポートしている
- Datadog / Elastic Stack なども連携できる
- 既存のエコシステムは採用しなかった
- OpenStack Magnum
- Rancher
- Tectonic
3年前まで所属してたアドテクスタジオからの発表だった.「おうち Kubernetes」の事例などは知っていたけど,AKE の詳細解説は今まで聞いたことがなかった.実装は大変そうだけど,既にプロダクションでも稼働してるとのことで,すごいなぁー!
マイクロサービスアプリケーションとしての機械学習
- メルカリの画像認識機能
- 出品時に写真を撮ると,名前,カテゴリー,色などを自動推定する
- 機械学習エンジニア側で Dockerfile を用意すれば,残りは SRE で構築してもらうことができた
- Web Server / Queue / Worker / 機械学習モデルなど
- 継続的デリバリーは Spinnaker を使っている
- GUI で直感的に使える
- 機械学習モデルのリリースは,最初は「意図的に手動で」運用していた
- 多様である機会学習モデルの運用がどういうものなのかを把握するため
- 汎用性の不足もある
- Persistent Volumes でデータを共通化すれば,機械学習モデルの Blue/Green Deployment が実現できる
話を聞いて感じたのは「やはりメルカリ強いなぁー」ということだった.アカデミック出身の機械学習エンジニアがいたり,フルスタックなアーキテクチャ(資料参照)を1週間で作ってしまう SRE がいたり.また「意図的に手動で」運用をして,様子を見るというフローも良かった.実際に「画像認識機能」は使ったことがあるので,この機能の裏側はこんな感じだったのかーと知れて良かった.
[資料公開待ち]
Yahoo! JAPAN の Kubernetes-as-a-Service で加速するアプリケーション開発
- Yahoo! ズバトク on Kubernetes
- 今までの課題
- 簡単にスケールアウトできなかった
- リリースの自動化ができていなかった
- そこで Kubernetes を導入した
- Concourse CI を使ってデプロイをしている
- デプロイ時間も早くなった
- OpenStack のノードがダウンしても,セルフヒーリングでポッドを再配置できる
- アプリケーションも合わせて変えないと Kubernetes の恩恵を受けられないので,マイクロサービスに書き換えた
- Z Lab では Yahoo! Japan の Kubernetes-as-a-Service を開発している
- ダウンタイムなしで Kubernetes のアップグレードができる
- クラスタアドオンとして Ingress Controller を用意している
- Kubernetes-as-a-Service on Kubernetes
Z Lab って聞いたことないなと思ったら,Yahoo! で使う基盤を作る 100% 子会社だった.Kubernetes-as-a-Service on Kubernetes というパワーワードも出ていたけど,他社と似ていて,OpenStack に Kubernetes クラスタを立てて共通基盤として提供するような感じだった.さらに Kubernetes を「分散システム基盤」という側面で考えているのは勉強になった.
www.slideshare.net
Kubernetes のセキュリティベストプラクティス
- フロントエンドのポッドから
/var/run/secrets/kubernetes.io/serviceaccount/token
などの秘匿情報が漏れてしまう場合- リクエストヘッダーに
Bearer Authentication
を指定して接続されてしまう可能性がある
- リクエストヘッダーに
- RBAC (Role-Based Access Control) を使う
- API Server Firewall
gcloud container cluster
の--master-authorized-networks
オプションを使う
- Kubernetes Network Policies
- もしパスワードが取れたとしても,Web ポッドから,Redis ポッドに直接繋がらないようにできる
- 必要なポッド間だけを通す
securityContext
に設定する項目runAsUser
- root ユーザー以外でプロセスを実行する
readOnlyRootFilesystem
- ルートファイルシステムを読み取り専用にする
allowPrivilegeEscalation
- 特権を取らせないようにする
- Seccomp で不要な syscall を呼べないようにする
- Istio など,サービスメッシュを使って,ポッド間のアクセスを制御することもできる
Kubernetes を運用するときに必要になるセキュリティ関連のパラメータを聞くことができた.まだ Kubernetes クラスタは運用していないけど,Network Policies など,注意するべきパラメータを知ることができたので,いざ運用するときに活かせそう.最後にサービスメッシュの話も少し出ていた.
Horizontal Pod Autoscalers
- 規模感
- マイクロサービス 124+
- kubernetes ノード 80+
- コンテナ 3000+
- Horizontal Pod Autoscaler (HPA)
- 要件
- 突然のスパイクに勝てる
- 秒単位でスケールできること
- 新規サービスも反映できる共通化された設定
- Distributed Monolith にならないように
- モニタリング
- k8s-prometheus-adapter
- Prometheus でメトリクスを取得する
- nginx_exporter をサイドカーパターンで稼働させれば,メトリクスは簡単に取れる
Kubernetes でポッドをオートスケールしながら,メトリクスを取得する話だった.Wantedly のマイクロサービスはどんどん増えている気がする.既に120個超え!実際に負荷をかけたときのメトリクスを紹介するスライドに hey というコマンドが使われていた.Go で書かれた負荷ツールだと Vegeta を普段使っていて,hey は知らなかった.
Container Networking Deep Dive
- ネットワーク構成
- CNM : Container Networking Models
- Docker はコッチ
- CNI : Container Network Interface
- Kubernetes はコッチ
- CNM : Container Networking Models
- Flannel
- GitHub - coreos/flannel: flannel is a network fabric for containers, designed for Kubernetes
- CoreOS で開発されている
- ネットワークが異なるポッド同士が疎通するために Flannel がルーティングをする
- GitHub - coreos/flannel: flannel is a network fabric for containers, designed for Kubernetes
- Calico
- GitHub - projectcalico/calico: Cloud native application connectivity and network policy
- Kubernetes Network Policies にも対応している
- ただし,Calico だと iptables のルール数が非常に多くなる(1ポッドごとに16個程度?)
- GitHub - projectcalico/calico: Cloud native application connectivity and network policy
- Kubernetes を運用するなら,ネットワークもちゃんと理解するべき
発表の最後に「Kubernetes を運用するなら,ネットワークも理解しましょう!」と言われていて「うっ確かに」という感じだった.ネットワークレイヤーの話で難しかったけど,ポッド同士がどのように疎通しているのか,図解がわかりやすくて良かった.
www.slideshare.net
Spinnaker を利用した Kubernetes への継続的デリバリ
- Kubernetes は CI / CD の実現が課題になる
- Spinnaker
- Spinnaker
- Netflix 社が開発している OSS
- マルチクラウドに対応している
- Kubernetes にデプロイができる
- GUI で簡単にパイプランを作ることができる
- Spinnaker
- デプロイ方法
- Red/Black Deploy ( = Blue/Green )
- Netflix では Red/Black と呼んでいて,意味は一緒
- Rolling Red/Black Deploy
- Canary Deploy
- Red/Black Deploy ( = Blue/Green )
- CI は Jenkins or Travis CI と連携できる
- 逆にそれ以外は連携できない
- Chaos Monkey Integration
メルカリの事例などで,最近よく聞くようになった Spinnaker の話だった.初心者セッションだったので,基礎的なところから聞くことができて,良かった.GUI 中心で Kubernetes の継続的デリバリーができるのは非常に便利だけど,それだと「Spinnaker おじさん」が出そうだから,どこまで Infrastructure as Code ができるのか,気になるところ.Netflix のデプロイ事例は以下の記事に載っている.
[資料公開待ち]
Kubernetes のない世界 すべてがサーバーレスになる
- Less Ops, More Code
- Kubernetes も VM もない世界がくる
- AWS Fargate / Azure Container Instances など
- CNCF Cloud Native Interactive Landscape
- IOpipe
- IOpipe - monitor, observe, and profile AWS Lambda functions
- Lambda をラップして,内部的なメトリクスを収集する
- 実行時間が伸びるため,Lambda の課金額が増えてしまう
- IOpipe - monitor, observe, and profile AWS Lambda functions
- Epsagon
- Epsagon - Complete monitoring for serverless applications
- CloudWatch Logs に全てのログを吐いておいて,そこから集計をする
- 非同期型のツールが流行ってきている
- Epsagon - Complete monitoring for serverless applications
今日1番面白かったセッションだった.雰囲気としては「@yoshidashingo と @toricls のトークショー✨」という感じだったけど,コンテナ,Kubernetes,サーバレス,オンプレなど,注目のキーワードを軸に様々な視点から議論を繰り広げていた.まさに「ご意見番」って感じ.特に「Less Ops, More Code」というスローガンは良かった.Fargate など,コンテナを用意すればあとは良しなにやってくれる系のサービスが普及するのは素晴らしいと思っているし,もし EKS Fargate が出れば,Kubernetes をほとんど意識せずに使えるような未来が来そう.
[資料公開待ち]
まとめ
- Japan Container Days v18.04 に参加してきた
- 各社 Kubernetes 最高!という感じだけど,セキュリティ,モニタリング,ログ,デプロイなど,運用面で工夫されていた
- 「Less Ops, More Code」を目指して Kubernetes を意識しないような未来の話を聞けたのも良かった
- 最後少し CNCF の話を聞けたのも良かった
- あまりにも Kubernetes に偏ってたので,ECS や Fargate の話があればさらに良かったかなとは思う
関連記事
これから Kubernetes を学ぶなら,ワークショップ資料「aws-workshop-for-kubernetes」がオススメ!