メタデータ@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キーと共存できる。
▼ アンビエントモードの場合¶
istio-proxy
コンテナからwaypoint-proxyを作成する。
また、アンビエントモードのカナリアアップグレードにも使用できる。
apiVersion: v1
kind: Namespace
metadata:
name: app
labels:
istio.io/dataplane-mode: ambient
istio.io/use-waypoint: istio-waypoint
istio.io/rev: default
istio.io/dataplane-mode¶
▼ istio.io/dataplane-modeとは¶
アンビエントモードの場合に、設定したNamespaceでztunnel Podを有効化する。
このラベルがついているNamespaceのみで、ztunnel PodへのリダイレクトによってPodはL4
のトラフィックを送受信できる。
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へのリダイレクトによってPodは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-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-namespace: app
---
apiVersion: v1
kind: Namespace
metadata:
name: istio-ingress
labels:
# Gatewayの名前
istio.io/use-waypoint: istio-waypoint
# appにwaypoint-proxyがある
istio.io/use-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¶
IstoOperatorの.spec.revision
キーと同じ。
特定のPodで、Istioとこれのカナリアリリースを有効化するか否かを設定する。
*実装例*
apiVersion: apps/v1
kind: Deployment # もしくはPod
metadata:
name: foo-deployment
spec:
selector:
matchLabels:
app.kubernetes.io/name: foo-pod
template:
metadata:
annotations:
istio.io/rev: 1-10-0
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¶
デフォルト値は45
である。
istio-proxy
コンテナ内のEnvoyプロセスは、終了時に接続のドレイン処理を実施する。
この接続のドレイン処理時間で、新しい接続を受け入れ続ける時間を設定する。
Envoyの--drain-time-s
オプションに相当する。
設定した時間が短過ぎると、処理中の接続を終了することなく、強制的に切断してしまう。
レースコンディションを解決するための.mesh.defaultConfig.proxyMetadata.MINIMUM_DRAIN_DURATION
キーでも、同じ値を設定するとよい。
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¶
デフォルト値は5
である (対応する.mesh.defaultConfig.proxyMetadata.MINIMUM_DRAIN_DURATION
キーと同じ) 。
EXIT_ON_ZERO_ACTIVE_CONNECTIONS
変数がfalse
な場合にのみ設定できる。
true
の場合は、代わりにPodの.mesh.defaultConfig.proxyMetadata.MINIMUM_DRAIN_DURATION
変数を設定する。
istio-proxy
コンテナ内の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"
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