Slide 1

Slide 1 text

Seekable OCI (SOCI)による コンテナ起動の高速化 JAWS-UG コンテナ支部 #26 新春大LT祭り @_takahash

Slide 2

Slide 2 text

自己紹介 • Hiroki Takahshi (@_takahash) • CoEのテックリード • 社内AWS基盤の運用 • ガイドライン整備 • Like • AWS CDK, AWS CLI 2

Slide 3

Slide 3 text

Agenda • コンテナイメージのPull • Seekable OCIとは • Seekable OCIのはじめかた • Seekable OCIの考慮事項 • まとめ

Slide 4

Slide 4 text

コンテナイメージのPull

Slide 5

Slide 5 text

コンテナイメージ コンテナイメージの構成 Manifest Layer 0 Layer 1 Layer N 主にManifestとLayerによって構成される

Slide 6

Slide 6 text

GET /v2//manifests/ LookUp Tag -> Digest Get Object 200 + Manifest GET /v2//blobs/ GetItem 307 + GET 200 + Layer Data Image Pull (from: Amazon ECR) Amazon S3 Amazon DynamoDB Amazon ECR AWS Fargate Layerの取得 Manifestの取得

Slide 7

Slide 7 text

Our analysis shows that pulling packages accounts for 76% of container start time, but only 6.4% of that data is read. [Harter, et al., 2016] Pullは高コスト

Slide 8

Slide 8 text

Pullを短縮するには?

Slide 9

Slide 9 text

1. コンテナイメージのキャッシュ コンテナイメージをローカルにキャッシュする AWS Fargate キャッシュ レスのみ Amazon EC2 キャッシュ OK

Slide 10

Slide 10 text

2. コンテナイメージの軽量化 軽量な ベースイメージ を使用する 不要なファイルや フレームワーク を除外する レイヤー数を 減らす 圧縮方式を 変更する Zstandard RUN apt update && ¥ apt install –y ¥ bzr ¥ cvs ¥ 様々なプラクティスが存在する distroless

Slide 11

Slide 11 text

3. Lazy Loading (Lazy Pulling) Pullが完了する前にコンテナを起動する技術 起動時に取得しなかったファイルは遅延読み込みする コンテナイメージ コンテナホスト Pull 最低限のファイル が揃ったら起動 代表的な技術:Stargz Snapshotter, Seekable OCI

Slide 12

Slide 12 text

Seekable OCIとは

Slide 13

Slide 13 text

Seekable OCIとは • 2022年にAWSがリリースしたlazy loadingの技術 • オープンソースとしてGitHubで公開されている • ECS/Fargateに対応 • 略称であるSOCIの読み方は“so-CHEE”

Slide 14

Slide 14 text

圧縮ファイルから任意のファイル をどのように取得しているのか

Slide 15

Slide 15 text

SOCI Index 既存のコンテナイメージに対するメタデータ 注: 全てのレイヤーに対してzTOCが 作成されるわけではない 出典:Under the hood: Lazy Loading Container Images with Seekable OCI and AWS Fargate

Slide 16

Slide 16 text

zTOC File Offset Start Span End Span bin/bash 12345 0 0 bin/ls 23456 1 1 etc/user 34567 1 2 etc/group 45678 2 4 レイヤー内のファイルの一覧と位置情報を示すメタデータ layerN.tar.gz span 0 span 1 span N ・・・ span レイヤーのtar.gzの論理的な区画。 すべてのspanは同じサイズ。 レイヤー自体を変更するわけではない。

Slide 17

Slide 17 text

Lazy loading 引用:Under the hood: Lazy Loading Container Images with Seekable OCI and AWS Fargate File Offset Start Span End Span bin/bash 12345 0 0 bin/ls 23456 1 1 etc/user 34567 1 2 etc/group 45678 2 4 zTOC

Slide 18

Slide 18 text

SOCIのよいところ • イメージ変換を伴う場合の考慮点 • 既存のCI/CDパイプラインをすべて変更して回らなければならない • イメージの署名プロセスも含む • レジストリに変換前のイメージと変換後のイメージが混在する コンテナイメージ自体に手を加えなくてよい

Slide 19

Slide 19 text

Seekable OCIのはじめかた

Slide 20

Slide 20 text

Seekable OCIのはじめかた • SOCI Index Builderの利用 • SOCI CLIの利用

Slide 21

Slide 21 text

SOCI Index Builder 引用: CFN AWS SOCI Index Builder on AWS Partner Solution Deployment Guide CloudFormationでデプロイ可能なソリューション

Slide 22

Slide 22 text

SOCI CLI • awslabs/soci-snapshotterでCLIが公開されているのでダウンロードして 利用 • 作業を手動で行う場合やCI/CDパイプラインに処理として組み込む場合に 有効 • Finchには標準で入っている。設定ファイルを記述しておけばコンテナイ メージのPush時にSOCI IndexもPushできる。 CLIによるSOCI Indexの作成 AWS_ACCOUNT_ID=111222333444 AWS_REGION=eu-west-1 finch push --snapshotter soci ¥ $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/myimage:latest

Slide 23

Slide 23 text

Seekable OCIの考慮事項

Slide 24

Slide 24 text

考慮事項 • Linux プラットフォームバージョン 1.4.0 で実行されるタスクのみ SOCI インデックスを使用できます。 Fargate で Windows コンテナを実行するタスクはサポートされていません。 • X86_64 または ARM64 CPU アーキテクチャ上で実行されるタスクがサポートされています。ARM64 アーキテ クチャの Linux タスクでは、Fargate Spot キャパシティプロバイダーはサポートされません。 • タスク定義内のコンテナイメージには、イメージと同じコンテナレジストリに SOCI インデックスが必要です。 • タスク定義内のコンテナイメージは、互換性のあるイメージレジストリに保存する必要があります。以下に互 換性のあるレジストリを示します。 • Amazon ECR プライベートレジストリ • gzip 圧縮を使用する、または圧縮されていないコンテナイメージのみがサポートされます。zstd 圧縮を使用す るコンテナイメージはサポートされていません。 • 圧縮サイズが 250 MiB より大きいコンテナイメージを使用して遅延読み込みを試すことをお勧めします。小さ いイメージを読み込む時間が短くなる可能性は低くなります。 • 遅延読み込みによってタスクの開始にかかる時間が変わる可能性があるため、Elastic Load Balancing のヘル スチェック猶予期間など、さまざまなタイムアウトを変更する必要がある場合があります。 • コンテナイメージが遅延読み込みされないようにするには、コンテナレジストリーから SOCI インデックスを 削除します。タスク内のコンテナイメージが考慮事項のいずれかを満たさない場合、そのコンテナイメージは デフォルトの方法でダウンロードされます。 出典: Fargate 考慮事項

Slide 25

Slide 25 text

まとめ

Slide 26

Slide 26 text

まとめ • Seekable OCIはlazy loadingの技術です。 • 特にFargateユーザーはぜひ利用してみてください!