Istio Certified Associate (ICA)受験記

## はじめに

CNCF主催の認定試験 **Istio Certified Associate (ICA)** を受験し合格したので、受験記を記載します。同認定試験の受験を考えている方の参考になれば幸いです。

## 免責事項(Disclamer)

:::note warn
* 本投稿は受験当時の情報となります。受験を検討する際は最新の情報の確認をお願いします。
* 本投稿は個人の所感です。
    * 所属する企業や団体は関係ありません。
    * 情報の利用は自己責任でお願いします。
:::

## 試験概要

* Kubernetesで用いるサービスメッシュIstioに関する認定試験です。
* 受験日：2025/1/19
* 試験形式
    * オンライン試験
    * 1回再受験可能
    * 実機オペレーション形式
    * 試験時間120分
    * 試験言語は英語のみ提供
    * 100点満点中75点以上で合格

## Istioとは

* Kubernetesに導入し、以下のような機能を実現するサービスメッシュソフトウェアです。
    * リクエストルーティング
    * リライト
    * CORS
    * 重みづけ(Traffic Shifting)
    * ミラーリング
    * ヘッダ操作
    * リクエストタイムアウト
    * リトライ
    * fault injection
    * 負荷分散
    * コネクションプール
    * 外れ値検出(Outlier Detection)
* Envoyをサイドカーとして配置するモードと、サイドカーレスのAmbientモードがあります。
    * 以下はサイドカーモードの場合のアーキテクチャです。
    ![arch.svg](https://istio.io/latest/docs/ops/deployment/architecture/arch.svg)
* 割と昔からあるソフトウェアのため機能は充実していますが、なんとなく設定しづらさがあって歴史的な経緯とかがあるんだろうなぁ、と感じたりしました（個人の所感です）。

## ICA試験について

* CNCF系試験の中でもトップクラスの難易度かと思います。
* 難しいと感じる要因はいくつかあり
    * 実機オペレーション形式であること
    * 他の実機オペレーション形式試験は100点満点中67点で合格なのに対し、ICAは75点必要であること
* 時間は120分ありますが、初回だと時間が足りなくなる可能性が高いです。各問題について、スムーズに手を動かせるようにしておく必要があります。
* 試験中、[Istio公式ドキュメント](https://istio.io/latest/docs/)を参照することができます。実施したい設定がドキュメントのどこにあるかを予め把握しておきましょう。検索窓も活用しましょう。
* GatewayAPIにはIstio GatewayAPIとKubernetes GatewayAPIの2種類が存在します。ICA試験ではIstio GatewayAPIのみ問われます。
    * 将来的にはIstio GatewayAPIはKubernetes GatewayAPIに統合されていくようです。
* Istio Ambient mesh(サイドカーなしのサービスメッシュ)については問われません。

## 勉強方法

### 参考にした受験記

[Sajeeva Lakmalさんの受験記](https://medium.com/@nvsajeeva/how-to-pass-ica-istio-certified-associate-exam-355152566bc8)

### 学習リソース

* まずはLinuxFoundation提供の有償トレーニング [Istio Service Mesh Essentials (LFS245)](https://training.linuxfoundation.org/training/istio-service-mesh-essentials-lfs245/) を受けました。99ドルですが、私はたまたま100ドルオフのクーポンを持っていたので実質無償で受けられました。
    * 私は受けていませんが、無償トレーニング[Introduction to Istio (LFS144)](https://training.linuxfoundation.org/training/introduction-to-istio-lfs144/)もあります。受けてみた人は感想教えてもらえると助かります。
* 本試験は実機オペレーション形式なので、実際に設定してみる経験が必要です。そのため、[KillercodaのICA対策](https://killercoda.com/ica)にある[Lorenzo Gironiさんの問題](https://killercoda.com/lorenzo-g)を繰り返し解いて練習しました。
* Mesh Weekのメンバが作った以下のMock Examは本番の形式に近いので、是非やっておきましょう。
    * [問題](https://docs.google.com/forms/d/e/1FAIpQLSfD4BLLQfdUwnIyiTBSGC_OzmSbiyrIlNp5Am61fTOhRbfiLw/formResponse)
        * Googleフォームを使って作られていますが、登録などは不要なので迷わず[次へ]を押してください。
    * [作成者による解説(Youtube)](https://www.youtube.com/watch?v=AW8p3_pe64A&list=PLy0Gle4XyvbG0rQBZ3dUCvxtekoJ7XjCr&index=6)

### 学習のポイント

* VirtualServiceとDestinationRuleを使ったトラフィックのルーティングは最初理解しづらいので、図などを書いてどういう設定でリソースからリソースにルーティングされているかを理解するとよいです。
* `IstioOperator API`と`Istio Operator`は別物
    * `IstioOperator API`は、Istioのインストール設定をYAMLで記載し、istioctlコマンドでインストールする方式（こちらは試験に出る）。
    * `Istio Operator`はKubernetes上にIstioを自動でデプロイする仕組みです（こちらは試験には出ない）。
* Killercodaでオペレーション練習しているとわかりますが、試験で問われる大半の設定は以下の2リソースのどちらかで実現することが多いです。操作練習しながら、ドキュメントのどの部分を参考にマニフェストを組み立てるかに慣れていきましょう。
    * VirtualServiceリソース
        * リクエストルーティング
        * リライト
        * CORS
        * 重みづけ(Traffic Shifting)
        * ミラーリング
        * ヘッダ操作
        * リクエストタイムアウト
        * リトライ
        * fault injection
    * DestinationRuleリソース
        * 負荷分散
        * コネクションプール
        * 外れ値検出(Outlier Detection)

## 上記でカバーしきれず本番で戸惑った項目

* 試験カリキュラム上は書かれていませんが、[kind: Sidecar](https://istio.io/latest/docs/reference/config/networking/sidecar/)のリソースについて普通に問われます。こちらは学んでおきましょう。
* ルーティングの条件に[SPIFFE ID](https://istio.io/latest/docs/ops/integrations/spire/)が必要となることがありました。
    * `spiffe://<trust.domain>/ns/<namespace>/sa/<service-account>`のパターンになりますので、覚えておきましょう。
* IngressリソースのIP確認方法
    * Kubernetesの一般的な操作の範疇ですが、ぱっとコマンド打てるようにしておきましょう。
    * `kubectl get svc -n istio-system`

## その他Tips

* テスト環境に入った際、使うべきIstio APIバージョンが指定されているので最初に確認してマニフェストを書くこと
    * 受験時は`apiVersion: networking.istio.io/v1beta1`と使えと指定があった
    * 公式ドキュメントのマニュフェストサンプルはv1で記載されていることが多いので、公式ドキュメントからマニフェストコピー後にAPIバージョン部分を手動で直す