Istio Proxy をビルド!!

この記事は Isito Proxy をどのようにビルドして任意の Docker registry (e.g. Docker hub) に push するかを記載しています。

背景

Istio では Envoy が Dataplane として使用されています。Envoy がそのまま使用されるわけではなく Istio に必要ないくつかの拡張が施された Istio Proxy が実際に使用されています。最近 Envoy に取り込まれていない機能をテストする機会があって、その際にこれを Istio Proxy で使うにはどうしたら良いのかという疑問がわいた。僕の調べ方もあるのかもしれないが、まとまったドキュメントが見つけられなかったので、未来の自分が同じ悩みをもたないように今回記事を書く。

もし間違ってる内容などあったら教えてください!

おおまかな手順

Istio Proxy を build して任意の Docker registry に push するまでのおおまかな流れは下記になります。

  1. Build 用のインスタンスを用意
  2. Istio Proxy を build して GCS にアップロード
  3. Docker image を build して push

具体的な手順

1. Build 用のインスタンスを用意

Istio Proxy (Envoy) のビルドには Bazel が使用され、Envoy は C++ で書かれているので、ビルド環境を用意する必要があります。後述しますが、Istio の Community からビルド用の Docker Image が提供されているので、自分であれこれインストールする必要はありません!

ただし下記のドキュメントに書かれているようにそこそこのリソースを用意すると良さそうです。 www.envoyproxy.io

後はそこそこ時間もかかるようなので、今回は GCP で GCE インスタンスを立てて実行することにしました。用意したスペックは下記になります。

  • Machine type: e2-highcpu-32 (32 vCPU, 32 GB memory)
  • Disk Type: New SSD persistent disk
  • Disk Size: 256GB
  • Image: Ubuntu 22.04 LTS x86/64, amd64 jammy image

コストはこのスペックだと1h動かすと$1くらいかかります。1ヶ月だと $720 くらいになるのでビルドが終了したらインスタンスを止めることを忘れないようにする必要があります。これ以降の作業はすべて上記で立てた GCE 上で行われます。Cloud Shell 便利!

Istio Proxy を build して GCS にアップロード

次は Istio Proxy のビルドです。

まず istio/proxy リポジトリを pull します。今回はバージョンは 1.16.0 を使用します。

$ git clone https://github.com/istio/proxy
$ cd proxy
$ git checkout 1.16.0

次はビルドをするのですが、その前に自分で fork した Envoy を使用したい場合にどうするかを書きます。Envoy の情報はルートディレクトリにある WORKSPACE ファイルで管理されています。下記のようになっているので ENVOY_ORG を自分の Github org に変えて ENVOY_REPO をリポジトリ名、ENVOY_SHA を対象の commit hash そして ENVOY_SHA256 を計算して設定すれば完了です。

ENVOY_SHA = "7663ed0f23ee72013c994ad1f96c3351d7e426f9"

ENVOY_SHA256 = "a20bb7f322967d48ad41fcb2b9cc1bb2470b77007af93d261962ce706d655159"

ENVOY_ORG = "envoyproxy"

ENVOY_REPO = "envoy"

ビルドしていきます。まずはビルド用のコンテナを起動します。

docker run -it -w /work -v $PWD:/work gcr.io/istio-testing/build-tools-proxy:release-1.16-latest bash

またビルドした成果物は GCS にアップロードされるので事前に用意します。Docker Image をビルドする時に HTTP 経由で成果物を GCS から取得するので権限は allUsers が roles/storage.legacyObjectReader をもっている必要があります。

$ export BUILD_ENVOY_BINARY_ONLY=1
$ export GCS_BUILD_BUCKET=[GCS bucket name]
$ export RELEASE_GCS_PATH="gs://${GCS_BUILD_BUCKET}/proxy"
$ make push_release

make push_release によって Istio Proxy のビルドが行われ成果物が GCS にアップロードされます。キャッシュも何もない状態から始めてだいたい1時間半くらいかかりました。

3. Docker image を build して push

前のステップでは Istio Proxy を build して GCS へ成果物をアップロードして終わりました。Docker Image は istio/proxy リポジトリではなく istio/istio リポジトリで行います。

$ make push.docker.proxyv2 \
   HUB="[Your Docker registory]/[Image name]" \
   TAG="[Docker tag]" \
   ISTIO_ENVOY_DEBUG_URL=[envoy-debug から始まる tar.gz で圧縮されたファイルの HTTP URL] \
   ISTIO_ENVOY_RELEASE_URL=[envoy-alpha から始まる tar.gz で圧縮されたファイルの HTTP URL]

この手順は成果物を GCS からダウンロードしてイメージを作るだけなので数分で終わります。終了すると ${HUB}/${TAG} にイメージがプッシュされています!

最後に

今回は Istio Proxy を自分でビルドして Docker registory にプッシュするまでの流れを書きました!