メタデータ@Istio¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. Namespace の .metadata.labels キー¶
istio-injection¶
指定した Namespace に所属する Pod 内へ、istio-proxy を自動的にインジェクションするか否かを設定する。
.metadata.labels.istio.io/rev キーとはコンフリクトを発生させるため、どちらかしか使えない (.metadata.labels.istio-injection キーの値が disabled の場合は共存できる) 。
.metadata.labels.istio-injection キーを使用する場合、Istio のアップグレードがインプレース方式になる。
*実装例*
apiVersion: v1
kind: Namespace
metadata:
name: app
labels:
istio-injection: enabled
アプリケーション以外の Namespace では disabled 値を設定することが多い。
apiVersion: v1
kind: Namespace
metadata:
name: observability
labels:
istio-injection: disabled # disabled であれば、istio.io/rev キーと共存できる。
---
apiVersion: v1
kind: Namespace
metadata:
name: chaos-mesh
labels:
istio-injection: disabled # disabled であれば、istio.io/rev キーと共存できる。
istio.io/rev¶
▼ サイドカーモードの場合¶
指定した Namespace に所属する Pod 内へ、istio-proxy を自動的にインジェクションするか否かを設定する。
また、サイドカーモードのカナリアアップグレードにも使用できる。
IstoOperator の .spec.revision キーと同じである。
.metadata.labels.istio-injection キーとはコンフリクトを発生させるため、どちらかしか使えない (.metadata.labels.istio-injection キーの値が disabled の場合は共存できる) 。
.metadata.labels.istio.io/rev キーを使用する場合、Istio のアップグレードがカナリア方式になる。
*実装例*
apiVersion: v1
kind: Namespace
metadata:
name: app
labels:
istio.io/rev: default
---
apiVersion: v1
kind: Namespace
metadata:
name: observability
labels:
istio-injection: disabled # disabled であれば、istio.io/rev キーと共存できる。
---
apiVersion: v1
kind: Namespace
metadata:
name: chaos-mesh
labels:
istio-injection: disabled # disabled であれば、istio.io/rev キーと共存できる。
▼ アンビエントモードの場合¶
waypoint-proxy に関する Gateway のラベルで、適用対象の Istio リビジョンまたはリビジョンタグを指定する。
アンビエントモードの Namespace には、istio-proxy のインジェクション用の istio.io/rev ラベルを設定しない。
apiVersion: v1
kind: Namespace
metadata:
name: app
labels:
istio.io/dataplane-mode: ambient
istio.io/use-waypoint: istio-waypoint
istio.io/dataplane-mode¶
▼ istio.io/dataplane-mode とは¶
アンビエントモードの場合、設定した Namespace に所属する Pod をアンビエントモードのサービスメッシュに登録する。
このラベルを設定した Namespace の Pod は、ztunnel へのリダイレクトによってアンビエントモードのサービスメッシュに登録される。ztunnel は L4 の非機能ロジックを実装し、L4 と L7 のトラフィックを中継できる。
apiVersion: v1
kind: Namespace
metadata:
name: app
labels:
istio.io/dataplane-mode: ambient
---
apiVersion: v1
kind: Namespace
metadata:
name: istio-egress
# istio-engress にはラベルは不要である
---
apiVersion: v1
kind: Namespace
metadata:
name: istio-ingress
# istio-engress にはラベルは不要である
istio.io/use-waypoint¶
▼ istio.io/use-waypoint とは¶
アンビエントモードの場合、設定した Namespace で waypoint-proxy を有効化する。
waypoint-proxy と紐づく Gateway 名 (Gateway API) を指定する。
このラベルを設定した Namespace では、指定した waypoint-proxy に通信を中継させ、L7 の非機能ロジックを適用できる。
もし、istio.io/use-waypoint を設定した Namespace に waypoint-proxy (Gateway API の Namespace によって決まる) が一緒にいない場合は、istio.io/use-waypoint-namespace で waypoint-proxy にいる Namespace を指定する必要がある。
apiVersion: v1
kind: Namespace
metadata:
name: app
labels:
# Gateway の名前
istio.io/use-waypoint: istio-waypoint
istio.io/use-waypoint-namespace¶
▼ istio.io/use-waypoint-namespace とは¶
istio.io/use-waypoint を設定した Namespace に waypoint-proxy (Gateway API の Namespace によって決まる) が一緒にいない場合は、istio.io/use-waypoint-namespace で waypoint-proxy にいる Namespace を指定する必要がある。
例えば、app で Gateway と istio-waypoint を作成している場合、waypoint-proxy を使用するほかの Namespace では、istio.io/use-waypoint-namespace: app とする。
apiVersion: v1
kind: Namespace
metadata:
name: app
labels:
# Gateway の名前
istio.io/use-waypoint: istio-waypoint
---
apiVersion: v1
kind: Namespace
metadata:
name: istio-egress
labels:
# Gateway の名前
istio.io/use-waypoint: istio-waypoint
# app に waypoint-proxy がある
istio.io/use-waypoint-namespace: app
---
apiVersion: v1
kind: Namespace
metadata:
name: istio-ingress
labels:
# Gateway の名前
istio.io/use-waypoint: istio-waypoint
# app に waypoint-proxy がある
istio.io/use-waypoint-namespace: app
istio.io/waypoint-for¶
▼ istio.io/waypoint-for とは¶
waypoint-proxy の宛先とする Kubernetes リソースを設定する。
service(Service)workload(Pod、Virtual Machine)all(Service、Pod、Virtual Machine)none(無効にする)
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
labels:
istio.io/waypoint-for: service
name: istio-waypoint
spec:
gatewayClassName: istio-waypoint
listeners:
- name: tcp-ztunnel
port: 15008
protocol: HBONE
allowedRoutes:
namespaces:
from: All
02. Pod の .metadata.annotations キー¶
annotations とは¶
Deployment の .spec.template キーや、Pod の .metadata. キーにて、istio-proxy ごとのオプション値を設定する。Deployment の .metadata. キーで定義しないように注意する。
istio.io/rev¶
Pod にインジェクションされた Istio のリビジョンを表す。
このアノテーションは Istio が自動的に設定するため、ユーザーが設定する必要はない。リビジョンを選択する場合は、Namespace または Pod の .metadata.labels.istio.io/rev キーを使用する。
proxy.istio.io/config¶
▼ proxy.istio.io/config とは¶
istio-proxy の envoy プロセスの設定値を上書きし、ユーザー定義の値を設定する。
これを使用するよりは、Istiod コントロールプレーンの .meshConfig.defaultConfig キーや ProxyConfig の .spec.environmentVariables キーを使用したほうがいいかもしれない。
ProxyConfig が最優先であり、これらの設定はマージされる。
.meshConfig.defaultConfig キーにデフォルト値を設定しておき、ProxyConfig で Namespace やマイクロサービス Pod ごとに上書きするのがよい。
▼ configPath¶
デフォルトでは、/etc/istio/proxy ディレクトリ配下に最終的な設定値ファイルを作成する。
*実装例*
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
proxy.istio.io/config: |
configPath: /etc/istio/proxy
▼ drainDuration¶

デフォルト値は 45s (45 秒) である。
istio-proxy 内の Envoy プロセスは、リスナーやフィルターチェーンの変更時にドレイン処理を実施する。
既存通信を変更前の構成、新規通信を変更後の構成で処理し、既存通信の完了を待機する時間を設定する。
Envoy の --drain-time-s オプションに相当する。
設定した時間が短過ぎると、処理中の接続を終了することなく、強制的に切断してしまう。
MINIMUM_DRAIN_DURATION は Envoy プロセスの終了時の最小待機時間であり、リスナーやフィルターチェーンの変更時の待機時間とは異なる。
似た設定の terminationDrainDuration は、istio-proxy の終了時のドレイン処理時間である。
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
proxy.istio.io/config: |
drainDuration: "10s"
▼ parentShutdownDuration¶
執筆時点 (2023/10/31) ですでに廃止されている。
istio-proxy 上の Envoy の親プロセスを終了するまでに待機する時間を設定する。
Pod の .metadata.annotations.proxy.istio.io/config.terminationDrainDuration キーよりも、最低 5 秒以上長くするとよい。
*実装例*
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
proxy.istio.io/config: |
parentShutdownDuration: "80s"
▼ terminationDrainDuration¶
デフォルト値は 5s (5 秒) である (ConfigMap の mesh.defaultConfig.proxyMetadata.MINIMUM_DRAIN_DURATION キーと同じ) 。
EXIT_ON_ZERO_ACTIVE_CONNECTIONS 変数が false な場合にのみ設定できる。
true の場合は、代わりに ConfigMap の mesh.defaultConfig.proxyMetadata で MINIMUM_DRAIN_DURATION 変数と EXIT_ON_ZERO_ACTIVE_CONNECTIONS 変数を設定する。
istio-proxy 内の Envoy プロセスは、終了時に接続のドレイン処理を実施する。
この接続のドレイン処理時間を設定する。
似た設定の drainDuration は、Envoy のリスナーやフィルターチェーンを変更した際に、ドレイン処理が終わるまで待機する時間である。
*実装例*
Envoy プロセスの接続のドレイン処理 5 秒間に実施する。
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
proxy.istio.io/config: |
terminationDrainDuration: "5s"
traffic.sidecar.istio.io/excludeInboundPorts、traffic.sidecar.istio.io/excludeOutboundPorts¶
特定のポート番号に対するインバウンド通信/アウトバウンド通信を、istio-iptables が istio-proxy へリダイレクトしないようにする。
例えば、Pod 間でレプリケーション通信をする場合 (例:Keycloak クラスター、Redis クラスターなど) 、istio-proxy を経由する必要はない。
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
traffic.sidecar.istio.io/excludeInboundPorts: "7800"
traffic.sidecar.istio.io/excludeOutboundPorts: "7800"
sidecar.istio.io/inject¶
特定の Pod (例:DB) にサイドカーを注入するか否かを設定する。
*実装例*
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
sidecar.istio.io/inject: "false"
sidecar.istio.io/proxyCPU¶
istio-proxy で使用する CPU サイズを設定する。
*実装例*
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
sidecar.istio.io/proxyCPU: 2
sidecar.istio.io/proxyImage¶
istio-proxy の作成に使用するコンテナイメージを設定する。
*実装例*
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
sidecar.istio.io/proxyImage: foo-envoy
sidecar.istio.io/proxyMemory¶
istio-proxy で使用するメモリサイズを設定する。
*実装例*
apiVersion: apps/v1
kind: Deployment # もしくは Pod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
sidecar.istio.io/proxyMemory: 4