ConfigMap系@リソース定義¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. 専用ConfigMap¶
Istioの各コンポーネントの機密でない変数やファイルを管理する。
02 istio-ca-root-cert¶
istio-ca-root-certとは¶
Istiodコントロールプレーン (discovery
コンテナ) による中間認証局を使用する場合に、istio-ca-root-cert
を自動的に作成する。
ルート認証局から発行されたCA証明書 (ルート証明書) をもち、各マイクロサービスのPodにマウントされる。
各マイクロサービスに配布された証明書を検証するために使用される。
Istioコントロールプレーンのログから、CA証明書の作成を確認できる。
2025-01-26T11:21:09.391516Z info initializing Istiod DNS certificates host: istiod-1-24-2.istio-system.svc, custom host:
2025-01-29T11:43:03.694183Z info Generating istiod-signed cert for [istio-pilot.istio-system.svc istiod-1-24-2.istio-system.svc istiod-remote.istio-system.svc istiod.istio-system.svc]:
-----BEGIN CERTIFICATE-----
*****
-----END CERTIFICATE-----
root-cert.pem¶
▼ root-cert.pemとは¶
CA証明書 (ルート証明書) を設定する。
kind: ConfigMap
apiVersion: v1
metadata:
name: istio-ca-root-cert
namespace: app # マイクロサービスのNamespace
data:
root-cert.pem: |
-----BEGIN CERTIFICATE-----
*****
-----END CERTIFICATE-----
03. istio-cni-config¶
kind: ConfigMap
apiVersion: v1
metadata:
name: istio-cni-config
namespace: kube-system
data:
CURRENT_AGENT_VERSION: 1.24.2
AMBIENT_ENABLED: "true"
AMBIENT_DNS_CAPTURE: "false"
AMBIENT_IPV6: "true"
CHAINED_CNI_PLUGIN: "true"
EXCLUDED_NAMESPACES: kube-system
REPAIR_ENABLED: "true"
REPAIR_LABEL_PODS: "false"
REPAIR_DELETE_PODS: "false"
REPAIR_REPAIR_PODS: "true"
REPAIR_INIT_CONTAINER_NAME: istio-validation
REPAIR_BROKEN_POD_LABEL_KEY: cni.istio.io/uninitialized
REPAIR_BROKEN_POD_LABEL_VALUE: "true"
04. istio-mesh-cm (istio-<バージョン値>)¶
istio-mesh-cmとは¶
Istiodコントロールプレーン (discovery
コンテナ) のため、全てのistio-proxy
コンテナにグローバルに設定する変数を管理する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
代わりに、IstioOperatorの.spec.meshConfig
キーで定義することもできるが、これは非推奨である。
# これは非推奨
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: istio-operator
namespace: istio-system
spec:
meshConfig: ...
accessLogEncoding¶
▼ accessLogEncodingとは¶
istio-proxy
コンテナで作成するアクセスログのファイル形式を設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
accessLogEncoding: JSON
accessLogFile¶
▼ accessLogFileとは¶
istio-proxy
コンテナで作成するアクセスログの出力先を設定する。
設定しないと、Envoyはアクセスログを出力しない。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
accessLogFile: /dev/stdout
caCertificates¶
▼ caCertificatesとは¶
ルート認証局のCA証明書や、中間認証局名を設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ISTIO_META_CERT_SIGNER: istio-system
caCertificates:
# ルート認証局のCA証明書
- pem: |
Ci0tLS0tQk...
# 中間認証局名
certSigners:
- clusterissuers.cert-manager.io/istio-system
- clusterissuers.cert-manager.io/foo
- clusterissuers.cert-manager.io/bar
discoverySelectors¶
▼ discoverySelectorsとは¶
ENHANCED_RESOURCE_SCOPING
を有効化し、IstiodコントロールプレーンがwatchするNamespaceを限定する。
これは、サイドカーをインジェクションするistio.io/rev
キーよりも強い影響力がある。
例えば、サイドカーをインジェクションしているNamespaceのみをwatchすることにより、Istiodコントロールプレーンの負荷を下げられる。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
discoverySelectors:
- matchLabels:
istio.io/rev: default
▼ REGISTRY_ONLY¶
サービスメッシュ外へのリクエストの宛先をBlackHoleCluster
(502 Bad Gateway
で通信負荷) として扱う。
また、ServiceEntryとして登録した宛先には固有の名前がつく。
サービスメッシュ外への通信のたびにServiceEntryを作成しなければならず、少しめんどくさくなる。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
outboundTrafficPolicy:
mode: REGISTRY_ONLY
defaultHttpRetryPolicy¶
▼ defaultHttpRetryPolicyとは¶
リトライポリシーのデフォルト値を設定する。
ただし、.spec.http[*].retries.perTryTimeout
キーは個別のVirtualServiceで設定する必要がある。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultHttpRetryPolicy:
attempts: 3
retryOn: connect-failure,deadline-exceeded,refused-stream,unavailable
▼ アウトバウンド時のリトライ条件¶
istio-proxy
コンテナのアウトバウンド時のリトライ条件は以下である。
宛先に通信が届いておらず、リトライすると問題が解決する可能性があるステータスコードは、リトライしてもよい。
- リトライすると解決する可能性がある
- リクエストを繰り返しても状態が変わらずに冪等性がある (二重処理にならない) がある
503
とreset
によるリトライは冪等性に問題があり、設定に注意が必要である。
HTTP/1.1のステータスコード | マイクロサービスに通信が届いている | リトライしてもよい | リトライ条件 |
---|---|---|---|
connect-failure |
⭕️ | ✅ | istio-proxy コンテナからのアウトバウンド通信のレスポンスで、接続タイムアウト (Connection timeout) が起こった。 |
gateway-error |
⭕️ | △ (システムによってはリトライによって、冪等性のない二重処理が起こる可能性がある) | istio-proxy コンテナからのアウトバウンド通信のレスポンスで、Gateway系ステータスコード (502 、503 、504 ) が返信された。 |
retriable-status-codes (任意のステータスコードを設定する) |
⭕️ | リトライによって、冪等性のない二重処理が起こる可能性がある。 | istio-proxy コンテナからのアウトバウンド通信のレスポンスで、指定したHTTPステータスであった。EXCLUDE_UNSAFE_503_FROM_DEFAULT_RETRY 変数をtrue にすると、元はデフォルト値であった503 を設定できる。 |
reset |
⭕️ | リトライによって、冪等性のない二重処理が起こる可能性がある。 | istio-proxy コンテナからのアウトバウンド通信で接続切断/接続リセット/読み取りタイムアウト (Read timeout) が起こった。 |
HTTP/2のステータスコード | マイクロサービスに通信が届いている | リトライしてもよい | リトライ条件 |
---|---|---|---|
cancelled |
⭕️ | 送信元がリクエストを切断しているため、リトライが不要の可能性がある。 | istio-proxy コンテナからのアウトバウンド通信のレスポンスで、gRPCステータスコードがCancelled であった。 |
deadline-exceeded |
⭕️ | ✅ | istio-proxy コンテナからのアウトバウンド通信のレスポンスで、gRPCステータスコードがDeadlineExceeded であった。 |
refused-stream |
⭕️ | ✅ | 同時接続上限数を超過するストリームをマイクロサービスが作成しようとした。 |
resource-exhausted |
⭕️ | ✅ | istio-proxy コンテナからのアウトバウンド通信のレスポンスで、gRPCステータスコードがResourceExhausted であった。 |
unavailable |
⭕️ | ✅ | istio-proxy コンテナからのアウトバウンド通信のレスポンスで、gRPCステータスコードがUnavailable であった。 |
▼ インバウンド時のリトライ条件¶
istio-proxy
コンテナのインバウンド時のリトライ条件は以下である。
執筆時点 (2025/02/26) では、ENABLE_INBOUND_RETRY_POLICY
変数をtrue
(デフォルト値) にすると使用できる。
HTTP/1.1のステータスコード | マイクロサービスに通信が届いている | リトライしてもよい | 理由 |
---|---|---|---|
reset-before-request |
× | ✅ | istio-proxy コンテナへのインバウンド通信で、マイクロサービスにリクエストを転送できなかった。 |
defaultProviders¶
▼ defaultProvidersとは¶
extensionProviders
キーで定義したもののうち、デフォルトで使用するプロバイダーを設定する。
Envoyを使用してアクセスログを収集する場合、.mesh.defaultProviders.accessLogging
キーには何も設定しなくてよい。
また、Istioがデフォルトで用意している分散トレースツールを使用する場合も同様に不要である。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultProviders:
metrics:
- prometheus
accessLogging:
- stackdriver
tracing:
- opentelemetry-grpc
enableTracing: true
extensionProviders:
- name: opentelemetry-grpc
opentelemetry:
# OpenTelemetry Collectorを宛先として設定する
service: opentelemetry-collector.foo-namespace.svc.cluster.local
# gRPC用のエンドポイントを設定する
port: 4317
Envoyのアクセスログの場合、代わりに.mesh.accessLogEncoding
キーと.mesh.accessLogFile
キーを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
accessLogEncoding: JSON
accessLogFile: /dev/stdout
分散トレースの場合、代わりに.mesh.enableTracing
キーと.mesh.extensionProviders
キーを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
enableTracing: true
extensionProviders:
- name: opentelemetry-grpc
opentelemetry:
service: opentelemetry-collector.foo-namespace.svc.cluster.local
port: 4317
enablePrometheusMerge¶
▼ enablePrometheusMergeとは¶
アプリケーションのメトリクスをistio-proxy
コンテナを介して取得できるようにする (マージする) かどうかを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
enablePrometheusMerge: true
enableTracing¶
▼ enableTracingとは¶
istio-proxy
コンテナでトレースIDとスパンIDを作成するか否かを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
enableTracing: true
- https://istio.io/latest/docs/tasks/observability/distributed-tracing/mesh-and-proxy-config/#available-tracing-configurations
- https://istio.io/latest/docs/ops/integrations/jaeger/
- https://istio.io/latest/docs/ops/integrations/zipkin/#option-2-customizable-install
- https://zenn.dev/riita10069/articles/service-mesh
inboundClusterStatName¶
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
inboundClusterStatName: inbound|%SERVICE_PORT%|%SERVICE_PORT_NAME%|%SERVICE_FQDN%
ingressSelector¶
▼ ingressSelectorとは¶
全てのistio-proxy
コンテナに関して、使用するGatewayの.metadata.labels.istio
キーの値を設定する。
デフォルトでは、Ingressとしてingressgateway
が設定される。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
ingressSelector: ingressgateway
ingressService¶
▼ ingressServiceとは¶
全てのistio-proxy
コンテナに関して、使用するIngress Controllerの.metadata.labels.istio
キーの値を設定する。
デフォルトでは、Ingressとしてingressgateway
が設定される。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
ingressService: ingressgateway
proxyHttpPort¶
▼ proxyHttpPortとは¶
全てのistio-proxy
コンテナに関して、Cluster外からのインバウンド通信 (特にHTTPプロトコル) を待ち受けるポート番号を設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
proxyHttpPort: 80
outboundClusterStatName¶
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
outboundClusterStatName: outbound|%SERVICE_PORT%|%%SUBSET_NAME%%|%SERVICE_FQDN%
outboundTrafficPolicy¶
▼ outboundTrafficPolicyとは¶
サービスメッシュ外へのリクエストの宛先の種類 (PassthroughCluster
、BlackHoleCluster
) を設定する。
▼ ALLOW_ANY (デフォルト)¶
サービスメッシュ外へのリクエストの宛先をPassthroughCluster
として扱う。
また、ServiceEntryとして登録した宛先には固有の名前がつく。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
outboundTrafficPolicy:
mode: ALLOW_ANY
proxyListenPort¶
▼ proxyListenPortとは¶
全てのistio-proxy
コンテナに関して、他マイクロサービスからのインバウンド通信を待ち受けるポート番号を設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
proxyListenPort: 80
04-02. defaultConfig¶
defaultConfigとは¶
Istioの全てのコンポーネントに適用する変数のデフォルト値を設定する。
他にProxyConfigの.spec.environmentVariables
キー、Podの.metadata.annotations.proxy.istio.io/config
キーでも設定できる。
ProxyConfigが最優先であり、これらの設定はマージされる。
.meshConfig.defaultConfig
キーにデフォルト値を設定しておき、ProxyConfigでNamespaceやマイクロサービスPodごとに上書きするのがよい。
3つの箇所で設定できる。
meshConfig:
defaultConfig:
discoveryAddress: istiod:15012
annotations:
proxy.istio.io/config: |
discoveryAddress: istiod:15012
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
discoveryAddress: istiod:15012
controlPlaneAuthPolicy¶
データプレーン (istio-proxy
コンテナ) とコントロールプレーン間の通信に相互TLSを実施する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
controlPlaneAuthPolicy: MUTUAL_TLS
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
controlPlaneAuthPolicy: MUTUAL_TLS
discoveryAddress¶
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
discoveryAddress: istiod-<リビジョン番号>.istio-system.svc:15012
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
discoveryAddress: istiod-<リビジョン番号>.istio-system.svc:15012
drainDuration¶
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
drainDuration: 45s
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
drainDuration: 45s
envoyAccessLogService¶
Envoyのアクセスログを、標準出力に出力するのではなく宛先 (例:レシーバー) に送信する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
enableEnvoyAccessLogService: true
defaultConfig:
envoyAccessLogService:
address: <Envoyのアクセスログの宛先Service名>:15000
# Istioコントロールプレーンをルート認証局とする
tlsSettings: ISTIO_MUTUAL
# TCP KeepAliveを実施する
tcpKeepalive:
probes: 9
time: 2
interval: 75
envoyMetricsService¶
Envoyのメトリクスを、Prometheusにスクレイピングしてもらうのではなく宛先 (例:レシーバー) に送信する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
# enableEnvoyMetricsService: true という設定がありそうだが、ドキュメントに記載がない
defaultConfig:
envoyMetricsService:
address: <Envoyのメトリクスの宛先Service名>:15000
# Istioコントロールプレーンをルート認証局とする
tlsSettings: ISTIO_MUTUAL
# TCP KeepAliveを実施する
tcpKeepalive:
probes: 9
time: 2
interval: 75
holdApplicationUntilProxyStarts¶
istio-proxy
コンテナが、必ずマイクロサービスよりも先に起動するか否かを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
holdApplicationUntilProxyStarts: true
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
holdApplicationUntilProxyStarts: true
- https://www.zhaohuabing.com/istio-guide/docs/best-practice/startup-dependence/#%E8%A7%A3%E8%80%A6%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E4%B9%8B%E9%97%B4%E7%9A%84%E5%90%AF%E5%8A%A8%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB
- https://engineering.linecorp.com/ja/blog/istio-introduction-improve-observability-of-ubernetes-clusters
オプションを有効化すると、istio-proxy
コンテナの.spec.containers[*].lifecycle.postStart.exec.command
キーに、pilot-agent -wait
コマンドが挿入される。
.spec.containers[*].lifecycle.preStop.exec.command
キーへの自動設定は、EXIT_ON_ZERO_ACTIVE_CONNECTIONS
変数で対応する。
...
spec:
containers:
- name: istio-proxy
...
lifecycle:
postStart:
exec:
command: |
pilot-agent wait
...
image¶
istio-proxy
コンテナのコンテナイメージのタイプを設定する。
これは、ConfigMapではなくProxyConfigでも設定できる。
distroless
型を選ぶと、istio-proxy
コンテナにログインできなくなり、より安全なイメージになる。
一方で、デバッグしにくくなる。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
image:
imageType: distroless
istio-cni
でも、Helmチャートで別に設定すれば、distroless
型を選べる。
privateKeyProvider¶
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
privateKeyProvider:
proxyHeaders¶
デフォルト値はtrue
である。
x-envoy
ヘッダーを有効化するか否かを設定する。
例えば、接続プール上限超過によるサーキットブレイカーが起こったことを示すx-envoy-overloaded
ヘッダーがある。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyHeaders:
envoyDebugHeaders:
forwardedClientCert: SANITIZE
server:
disabled: true
requestId:
disabled: true
attemptCount:
disabled: true
envoyDebugHeaders:
disabled: true
metadataExchangeHeaders:
mode: IN_MESH
- https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#ProxyConfig-proxy_headers
- https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/router_filter#http-headers-consumed-from-downstreams
- https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers
proxyMetadata¶
istio-proxy
コンテナに環境変数を設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
# ここに環境変数を設定する
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
proxyMetadata: ...
rootNamespace¶
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
rootNamespace: istio-system
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
rootNamespace: istio-system
tracing (非推奨)¶
いずれのトレース仕様 (例:Zipkin、Datadog、LightStepなど) でトレースIDとスパンIDを作成するかを設定する。
ZipkinとJaegerはトレースコンテキスト仕様が同じであるため、zipkinパッケージをJaegerのクライアントとしても使用できる。
.mesh.defaultConfig.enableTracing
キーも有効化する必要がある。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
enableTracing: true
tracing:
sampling: 100
zipkin:
address: "jaeger-collector.observability:9411"
ただし、非推奨であるためextensionProviders
キーを使用した方が良い
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
tracing: {}
extensionProviders:
...
tracingServiceName¶
マイクロサービス名を設定する。
マイクロサービスがバージョニングされている場合に、マイクロサービスの正式名 (canonical-name) でグループ化できる。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
tracingServiceName: foo
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
tracingServiceName: foo
trustDomain¶
相互TLSを採用している場合に、送信元として許可する信頼ドメインを設定する。
例えば、信頼ドメインはServiceAccountごとに異なる。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
trustDomain: cluster.local
apiVersion: networking.istio.io/v1beta1
kind: ProxyConfig
metadata:
name: foo-proxyconfig
spec:
trustDomain: cluster.local
04-03. defaultConfig.proxyMetadata¶
BOOTSTRAP_XDS_AGENT
¶
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
BOOTSTRAP_XDS_AGENT: "true"
ENABLE_DEFERRED_CLUSTER_CREATION
¶
pilot-discovery
コマンドでも設定できるため、そちらを参照せよ。
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ENABLE_DEFERRED_CLUSTER_CREATION: "true"
EXCLUDE_UNSAFE_503_FROM_DEFAULT_RETRY
¶
pilot-discovery
コマンドでも設定できるため、そちらを参照せよ。
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
EXCLUDE_UNSAFE_503_FROM_DEFAULT_RETRY: "true"
ENABLE_INBOUND_RETRY_POLICY
¶
pilot-discovery
コマンドでも設定できるため、そちらを参照せよ。
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ENABLE_INBOUND_RETRY_POLICY: "true"
EXIT_ON_ZERO_ACTIVE_CONNECTIONS
¶
デフォルト値はfalse
である。
istio-proxy
コンテナへのリクエストが無くなってから、Envoyのプロセスを終了する。
具体的には、downstream_cx_active
メトリクスの値 (アクティブな接続数) を監視し、0
になり次第、Envoyのプロセスを終了する。
オプションを有効化すると、istio-proxy
コンテナの.spec.containers[*].lifecycle.preStop.exec.command
キーに、sleep
コマンドが挿入される。
.spec.containers[*].lifecycle.postStart.exec.command
キーへの自動設定は、.mesh.defaultConfig.holdApplicationUntilProxyStarts
キーで対応する。
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
EXIT_ON_ZERO_ACTIVE_CONNECTIONS: "false"
ISTIO_META_CERT_SIGNER
¶
デフォルトで""
(空文字) である。
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ISTIO_META_CERT_SIGNER: ""
ISTIO_META_DNS_AUTO_ALLOCATE
¶
デフォルト値はfalse
である。
IPアドレスが設定されていないServiceEntryに対して、IPアドレスを自動的に設定する。
ISTIO_META_DNS_CAPTURE
を有効にしないと、ISTIO_META_DNS_AUTO_ALLOCATE
は機能しない。
PILOT_ENABLE_IP_AUTOALLOCATE
と同じであり、Istio 1.25以降で、PILOT_ENABLE_IP_AUTOALLOCATE
の方が推奨になった。
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_AUTO_ALLOCATE: "false"
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-address
spec:
hosts:
- address.internal
ports:
- name: http
number: 80
protocol: HTTP
ISTIO_META_DNS_CAPTURE
¶
デフォルト値はfalse
である。
マイクロサービスからのアウトバウンド通信時に、Pod内のistio-proxy
コンテナやztunnelプロキシをDNSプロキシとして使用できるようになる。
もしistio-proxy
コンテナやztunnelプロキシがドメインに紐づくIPアドレスのキャッシュを持つ場合、マイクロサービスにレスポンスを返信する。
一方でキャッシュを持たない場合、istio-proxy
コンテナやztunnelプロキシは宛先Podにリクエストを送信する。
なお、DNSキャッシュのドメインとIPアドレスを固定で紐付けることもできる。
▼ 固定 (HTTPリクエスト)¶
ServiceEntryでHTTPリクエストを受信した場合に、DNSキャッシュのドメインとIPアドレスを固定で紐づける。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-address
spec:
hosts:
- address.internal
ports:
- name: http
number: 80
protocol: HTTP
▼ 動的 (HTTPリクエスト)¶
ServiceEntryでHTTPリクエストを受信した場合に、DNSキャッシュのドメインとIPアドレスを動的に紐づける。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-address
spec:
hosts:
- address.internal
addresses:
- 198.51.100.1
ports:
- name: http
number: 80
protocol: HTTP
▼ 動的 (TCPリクエスト)¶
ServiceEntryで、TCPリクエストとして扱われるホストヘッダー持ち独自プロトコル (例:MySQLやRedis以外の非対応プロトコルなど) を受信した場合に、DNSキャッシュのドメインとIPアドレスを動的に紐づける。
注意点として、Istio EgressGatewayを経由してServiceEntryに至る場合には、この設定が機能しない。
Pod ➡️ Istio EgressGateway ➡️ ServiceEntry
Istio IngressGateway (厳密に言うとGateway) は、独自プロトコルをTCPプロコトルとして扱う。
そのため、受信した独自プロトコルリクエストにホストヘッダーがあったとしても、これを宛先に転送できない。
宛先が独自プロトコルリクエストのポート番号だけで宛先 (例:ServiceEntry、外部サーバーなど) を決めてしまう。
同じポート番号で待ち受ける複数のServiceEntryがあると、.spec.hosts
キーを設定していたとしても、誤った方のServiceEntryを選ぶ可能性がある。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: aws-aurora-endpoint
spec:
hosts:
- <AWS AuroraのDBクラスター名>.cluster-<id>.ap-northeast-1.rds.amazonaws.com
ports:
- name: cluster-endpoint
number: 3306
protocol: TCP
resolution: DNS
---
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: aws-aurora-endpoint
spec:
hosts:
- <AWS AuroraのDBクラスター名>.cluster-ro-<id>.ap-northeast-1.rds.amazonaws.com
ports:
- name: reader-endpoint
number: 3306
protocol: TCP
resolution: DNS
MINIMUM_DRAIN_DURATION
¶
デフォルト値は5
である (対応する.metadata.annotations.proxy.istio.io/config.terminationDrainDuration
キーと同じ) 。
EXIT_ON_ZERO_ACTIVE_CONNECTIONS
変数がtrue
な場合にのみ設定できる。
false
の場合は、代わりに.metadata.annotations.proxy.istio.io/config.terminationDrainDuration
を設定する。
istio-proxy
コンテナ内のEnvoyプロセスは、終了時に接続のドレイン処理を実施する。
この接続のドレイン処理時間で、新しい接続を受け入れ続ける時間を設定する。
Podの.metadata.annotations.proxy.istio.io/config.drainDuration
キーで起こるレースコンディションを解決するための設定で、同じ値を設定するとよい。
*実装例*
Envoyプロセスのドレイン処理5
秒間に実施する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
defaultConfig:
proxyMetadata:
MINIMUM_DRAIN_DURATION: "10s"
PILOT_ENABLE_IP_AUTOALLOCATE
¶
デフォルト値はtrue
である。
ISTIO_META_DNS_AUTO_ALLOCATE
と同じであり、Istio 1.25以降で、PILOT_ENABLE_IP_AUTOALLOCATE
の方が推奨になった。
ISTIO_META_DNS_CAPTURE
を有効にしないと、PILOT_ENABLE_IP_AUTOALLOCATE
は機能しない。
04-05. extensionProviders (認証/認可系)¶
extensionProviders (認証/認可系) とは¶
AuthorizationPolicyによる認可処理を外部の認可プロバイダーに委譲する。
envoyExtAuthzHttp¶
▼ envoyExtAuthzHttpとは¶
外部の認可プロバイダーへの通信にHTTP/1.1プロトコルを使用する。
▼ OAuth2 Proxyの場合¶
OAuth2 Proxyを任意の認可プロバイダーの前段に置き、OAuth2 Proxyで認可プロバイダーを宛先に設定する。
*実装例*
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
extensionProviders:
- name: OAuth2 Proxy
envoyExtAuthzHttp:
service: oauth2-proxy.foo-namespace.svc.cluster.local
port: 80
includeHeadersInCheck:
- cookie
- authorization
AuthorizationPolicyで、認可処理をOAuth2 Proxyに委譲できるようになる。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: oauth2-proxy-authorization-policy
namespace: istio-system
spec:
action: CUSTOM
provider:
name: oauth2-proxy
rules:
# ルールは外部の認可プロバイダーに定義されている
- to:
- operation:
paths: ["/login"]
- https://zenn.dev/takitake/articles/a91ea116cabe3c#istio%E3%81%AB%E5%A4%96%E9%83%A8%E8%AA%8D%E5%8F%AF%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2
- https://zenn.dev/takitake/articles/a91ea116cabe3c#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90-1
▼ OpenAgent Policyの場合¶
OpenAgent Policyを外部の認可プロバイダーとして設定する。
実装例
▼ Keycloakの場合¶
Keycloakは、IDプロバイダーとしてだけでなく認可プロバイダーとしても使用できる。
ただし、前段にOAuth2 Proxyを置くことが一般的である。
- https://zenn.dev/takitake/articles/a91ea116cabe3c#istio%E3%81%AB%E5%A4%96%E9%83%A8%E8%AA%8D%E5%8F%AF%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2
- https://zenn.dev/takitake/articles/a91ea116cabe3c#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90-1
envoyExtAuthzGrpc¶
認可プロバイダーへの通信にHTTP/2プロトコルを使用する。
04-06. extensionProviders (可観測系)¶
extensionProviders (可観測系) とは¶
監視バックエンドの宛先情報を設定する。
プロバイダーによって、いずれのテレメトリーを送信するのかが異なる。
datadog¶
▼ datadogとは¶
datadogのトレースコンテキスト仕様 (datadogの独自仕様) でトレースIDとスパンIDを作成する。
datadogエージェントの宛先情報をIstioに登録する必要があるため、これのPodをサービスメッシュ内に配置するか、サービスメッシュ外に配置してIstio EgressGatewayやServiceEntry経由で接続できるようにする。
ただ、datadogエージェントをサービスメッシュ内に配置すると、Telemetryリソースがdatadogエージェント自体の分散トレースを作成してしまうため、メッシュ外に配置するべきである。
.mesh.enableTracing
キーも有効化する必要がある。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
enableTracing: true
extensionProviders:
- name: datadog-http
datadog:
# datadogエージェントを宛先として設定する
service: datadog-agent.foo-namespace.svc.cluster.local
port: 8126
- name: envoy-log
envoyFileAccessLog
▼ Telemetryの定義¶
Datadogに送信するためには、.mesh.extensionProviders[*].datadog
キーに設定した宛先情報を使用して、Telemetryを定義する必要がある。
分散トレースの設定は以下の通りである。
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: tracing-provider
# サイドカーをインジェクションしている各Namespaceで作成する
# もしistio-systemを指定した場合は、istio-proxyコンテナのある全てのNamespaceが対象になる
namespace: foo
spec:
# Datadogにスパンを送信させるPodを設定する
selector:
matchLabels:
name: app
tracing:
- providers:
# mesh.extensionProviders[*].nameキーで設定した名前
- name: datadog-http
randomSamplingPercentage: 100
アクセスログの設定は以下の通りである。
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: access-log-provider
# サイドカーをインジェクションしている各Namespaceで作成する
# もしistio-systemを指定した場合は、istio-proxyコンテナのある全てのNamespaceが対象になる
namespace: foo
spec:
# Datadogにアクセスログを送信させるPodを設定する
selector:
matchLabels:
name: app
# Envoyをアクセスログプロバイダーとして設定する
accessLogging:
- providers:
# mesh.extensionProviders[*].nameキーで設定した名前
- name: envoy-log
- https://github.com/istio/istio/blob/1.19.1/operator/pkg/util/testdata/overlay-iop.yaml#L26-L27
- https://docs.datadoghq.com/containers/docker/apm/?tab=linux#tracing-from-the-host
- https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-ExtensionProvider-DatadogTracingProvider
- https://istio.io/latest/docs/reference/config/telemetry/
opentelemetry¶
▼ opentelemetryとは¶
OpenTelemetryのトレースコンテキスト仕様 (W3C Trace Context) でトレースIDとスパンIDを作成する。
OTLP形式のエンドポイントであればよいため、OpenTelemetry Collectorも指定できる。
OpenTelemetry Collectorの宛先情報をIstioに登録する必要があるため、これのPodをサービスメッシュ内に配置するか、サービスメッシュ外に配置してIstio EgressGatewayやServiceEntry経由で接続できるようにする。
ただ、OpenTelemetry Collectorをサービスメッシュ内に配置すると、TelemetryリソースがOpenTelemetry Collector自体の分散トレースを作成してしまうため、メッシュ外に配置するべきである。
.mesh.enableTracing
キーも有効化する必要がある。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
enableTracing: true
extensionProviders:
- name: opentelemetry-grpc
opentelemetry:
# OpenTelemetry Collectorを宛先として設定する
service: opentelemetry-collector.foo-namespace.svc.cluster.local
# gRPC用のエンドポイントを設定する
port: 4317
- name: opentelemetry-http
opentelemetry:
# OpenTelemetry Collectorを宛先として設定する
service: opentelemetry-collector.foo-namespace.svc.cluster.local
# HTTP用のエンドポイントを設定する
port: 4318
http:
# HTTPの場合はパスが必要である
path: /v1/traces
- name: envoy-log
envoyFileAccessLog:
path: /dev/stdout
▼ Telemetryの定義¶
OpenTelemetryに送信するためには、.mesh.extensionProviders[*].opentelemetry
キーに設定した宛先情報を使用して、Telemetryを定義する必要がある。
分散トレースの設定は以下の通りである。
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: tracing-provider
# サイドカーをインジェクションしている各Namespaceで作成する
# もしistio-systemを指定した場合は、istio-proxyコンテナのある全てのNamespaceが対象になる
namespace: foo
spec:
# Opentelemetryにスパンを送信させるPodを設定する
selector:
matchLabels:
name: app
tracing:
- providers:
# mesh.extensionProviders[*].nameキーで設定した名前
- name: opentelemetry-grpc
randomSamplingPercentage: 100
アクセスログの設定は以下の通りである。
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: access-log-provider
# サイドカーをインジェクションしている各Namespaceで作成する
# もしistio-systemを指定した場合は、istio-proxyコンテナのある全てのNamespaceが対象になる
namespace: foo
spec:
# OpenTelemetryにアクセスログを送信させるPodを設定する
selector:
matchLabels:
name: app
# Envoyをアクセスログプロバイダーとして設定する
accessLogging:
- providers:
# mesh.extensionProviders[*].nameキーで設定した名前
- name: envoy-log
- https://istio.io/latest/docs/tasks/observability/logs/otel-provider/#enable-envoys-access-logging
- https://github.com/istio/istio/blob/1.19.1/operator/pkg/util/testdata/overlay-iop.yaml#L36-L37
- https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-ExtensionProvider-OpenTelemetryTracingProvider
- https://istio.io/latest/docs/tasks/observability/telemetry/#provider-selection
- https://github.com/istio/istio/blob/master/samples/open-telemetry/tracing/telemetry.yaml
- https://itnext.io/debugging-microservices-on-k8s-with-istio-opentelemetry-and-tempo-4c36c97d6099.
- https://istio.io/latest/docs/reference/config/telemetry/
prometheus¶
▼ prometheusとは¶
メトリクスの監視バックエンドとするPrometheusの宛先情報を設定する。
zipkin (jaeger)¶
▼ zipkin (jaeger) とは¶
Zipkinのトレースコンテキスト仕様 (B3コンテキスト) でトレースIDとスパンIDを作成する。
JaegerはB3をサポートしているため、Jaegerのクライアントとしても使用できる。
jaegerエージェントの宛先情報をIstioに登録する必要があるため、これのPodをサービスメッシュ内に配置するか、サービスメッシュ外に配置してIstio EgressGatewayやServiceEntry経由で接続できるようにする。
ただ、jaegerエージェントをサービスメッシュ内に配置すると、Telemetryリソースがjaegerエージェント自体の分散トレースを作成してしまうため、メッシュ外に配置するべきである。
.mesh.enableTracing
キーも有効化する必要がある。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
enableTracing: true
extensionProviders:
- name: jaeger-http
jaeger:
# jaegerエージェントを宛先として設定する
service: jaeger-agent.foo-namespace.svc.cluster.local
port: 8126
- name: envoy-log
envoyFileAccessLog:
path: /dev/stdout
ZipkinやJaegerに送信するためには、.mesh.extensionProviders[*].zipkin
キーに設定した宛先情報を使用して、Telemetryを定義する必要がある。
分散トレースの設定は以下の通りである。
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: tracing-provider
# サイドカーをインジェクションしている各Namespaceで作成する
# もしistio-systemを指定した場合は、istio-proxyコンテナのある全てのNamespaceが対象になる
namespace: foo
spec:
# Datadogにスパンを送信させるPodを設定する
selector:
matchLabels:
name: app
tracing:
- providers:
# mesh.extensionProviders[*].nameキーで設定した名前
- name: jaeger-http
randomSamplingPercentage: 100
アクセスログの設定は以下の通りである。
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: access-log-provider
# サイドカーをインジェクションしている各Namespaceで作成する
# もしistio-systemを指定した場合は、istio-proxyコンテナのある全てのNamespaceが対象になる
namespace: foo
spec:
# ZipkinやJaegerにアクセスログを送信させるPodを設定する
selector:
matchLabels:
name: app
# Envoyをアクセスログプロバイダーとして設定する
accessLogging:
- providers:
# mesh.extensionProviders[*].nameキーで設定した名前
- name: envoy-log
envoyFileAccessLog¶
▼ envoyFileAccessLogとは¶
Envoyのアクセスログを設定する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-mesh-cm
namespace: istio-system
data:
mesh: |
extensionProviders:
- name: envoy-grpc
envoyFileAccessLog:
logFormat:
labels:
access_log_type: '%ACCESS_LOG_TYPE%'
bytes_received: '%BYTES_RECEIVED%'
bytes_sent: '%BYTES_SENT%'
downstream_transport_failure_reason: '%DOWNSTREAM_TRANSPORT_FAILURE_REASON%'
downstream_remote_port: '%DOWNSTREAM_REMOTE_PORT%'
duration: '%DURATION%'
grpc_status: '%GRPC_STATUS(CAMEL_STRING)%'
method: '%REQ(:METHOD)%'
path: '%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%'
protocol: '%PROTOCOL%'
response_code: '%RESPONSE_CODE%'
response_flags: '%RESPONSE_FLAGS%'
start_time: '%START_TIME%'
trace_id: '%TRACE_ID%'
traceparent: '%REQ(TRACEPARENT)%'
upstream_remote_port: '%UPSTREAM_REMOTE_PORT%'
upstream_transport_failure_reason: '%UPSTREAM_TRANSPORT_FAILURE_REASON%'
user_agent: '%REQ(USER-AGENT)%'
x_forwarded_for: '%REQ(X-FORWARDED-FOR)%'
05. istio-sidecar-injector¶
config¶
▼ configとは¶
Istiodコントロールプレーン (discovery
コンテナ) のため、Istioのサイドカーインジェクションの変数やpatch処理の内容を管理する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-sidecar-injector-<リビジョン番号>
namespace: istio-system
data:
config: |
defaultTemplates: [sidecar]
policy: enabled
alwaysInjectSelector: []
neverInjectSelector:[]
injectedAnnotations:
template: "{{ Template_Version_And_Istio_Version_Mismatched_Check_Installation }}"
templates:
sidecar: |
# Helmのテンプレート
▼ .templates.sidecar¶
istio-proxyコンテナの設定値をHelmテンプレートの状態で管理する。
Istioは、istio-sidecar-injectorの.values
キーを使用してテンプレートを動的に完成させる。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-sidecar-injector-<リビジョン番号>
namespace: istio-system
data:
config: |
templates:
sidecar: |
... # Helmのテンプレート
values¶
istio-sidecar-injectorの.templates.sidecar
キーに出力する値をvalues
ファイルとして管理する。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-sidecar-injector-<リビジョン番号>
namespace: istio-system
data:
values: |
{
global: { ... }
revision: <リビジョン番号>
sidecarInjectorWebhook: { ... }
}
06. pilot-discoveryコマンド¶
CITADEL_SELF_SIGNED_CA_CERT_TTL
¶
Istioコントロールプレーンが自身を署名するオレオレ証明書の有効期限を設定する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: CITADEL_SELF_SIGNED_CA_CERT_TTL
value: 87600h0m0s
CITADEL_SELF_SIGNED_ROOT_CERT_CHECK_INTERVAL
¶
Istioコントロールプレーンのオレオレ証明書の検証間隔を設定する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: CITADEL_SELF_SIGNED_ROOT_CERT_CHECK_INTERVAL
value: 1h0m0s
CLUSTER_ID
¶
Istiodのサービスレジストリを設定する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: CLUSTER_ID
value: Kubernetes
DEFAULT_WORKLOAD_CERT_TTL
¶
istio-proxy
コンテナの証明書の有効期限を設定する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: DEFAULT_WORKLOAD_CERT_TTL
value: 24h0m0s
ENABLE_DEFERRED_CLUSTER_CREATION
¶
デフォルト値はtrue
である。
リクエストがある場合にのみ、Envoyのクラスターを作成する。
実際に使用されていないEnvoyのクラスターを作成しないことにより、ハードウェアリソースを節約できる。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: ENABLE_DEFERRED_CLUSTER_CREATION
value: "true"
ENABLE_DEFERRED_STATS_CREATION
¶
デフォルト値はtrue
である。
Envoyの統計情報を遅延初期化する。
ハードウェアリソースを節約できる。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: ENABLE_DEFERRED_STATS_CREATION
value: "true"
ENABLE_ENHANCED_RESOURCE_SCOPING
¶
デフォルト値はtrue
である。
meshConfig.discoverySelectors
キーを使用できるようにする。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: ENABLE_ENHANCED_RESOURCE_SCOPING
value: "true"
ENABLE_ENHANCED_DESTINATIONRULE_MERGE
¶
デフォルト値はtrue
である。
複数のDestinationRuleで.spec.exportTo
キーの対象のNamespaceが同じ場合、これらの設定をマージして処理する。
もし対象のNamespaceが異なる場合、独立した設定として処理する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: ENABLE_ENHANCED_DESTINATIONRULE_MERGE
value: "true"
ENABLE_INBOUND_RETRY_POLICY
¶
デフォルト値はtrue
である。
istio-proxy
コンテナがインバウンド通信をマイクロサービスに送信するときのリトライ (執筆時点2025/02/26ではreset-before-request
のみ) を設定する。
今後は、宛先istio-proxy
コンテナがマイクロサービスに対してリトライできるようになる。
istio-proxy
コンテナ間の問題の切り分けがしやすくなる。
false
の場合、送信元istio-proxy
コンテナから宛先istio-proxy
コンテナへ通信時に、送信元istio-proxy
コンテナしかリトライできない。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: ENABLE_INBOUND_RETRY_POLICY
value: "true"
EXCLUDE_UNSAFE_503_FROM_DEFAULT_RETRY
¶
デフォルト値はtrue
である。
POSTリクエストの結果で、マイクロサービスから503
ステータスが返信された場合に、未処理とは限らない。
この場合にリトライすると結果的に二重で処理が実行されてしまう。
そのため、マイクロサービスから503
ステータスが返信された場合は、リトライしないようにする。
なおこの問題は、reset
によるリトライでも起こりうるため、reset
もデフォルトから外れている。
リトライの結果でistio-proxy
コンテナが503
ステータスを返信する場合とは区別する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
spec:
containers:
- name: discovery
env:
- name: EXCLUDE_UNSAFE_503_FROM_DEFAULT_RETRY
value: "true"
PILOT_TRACE_SAMPLING
¶
分散トレースの収集率を設定する。
基本的には100
% (値は1
) を設定する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: PILOT_TRACE_SAMPLING
value: 1
PILOT_CERT_PROVIDER
¶
istio-proxy
コンテナに設定するSSL証明書のプロバイダーを設定する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: PILOT_CERT_PROVIDER
value: istiod
設定値 | 説明 |
---|---|
istiod |
Istiodが提供するSSL証明書を使用する。 |
kubernetes |
KubernetesのSecretで管理するSSL証明書を使用する。 |
none |
SSL証明書を使用しない。 |
PILOT_JWT_PUB_KEY_REFRESH_INTERVAL
¶
アクセストークンの署名検証の間隔を設定する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
containers:
- name: discovery
env:
- name: PILOT_JWT_PUB_KEY_REFRESH_INTERVAL
value: 20m0s