Azure Kubernetes Service (AKS) の Open Service Mesh (OSM) アドオンをデプロイすると、サービス メッシュ構成に関連する問題が発生する場合があります。 この記事では、一般的なトラブルシューティング エラーとその解決方法について説明します。
Note
Cloud Native Computing Foundation (CNCF) による Open Service Mesh (OSM) の廃止に伴い、OSM 構成を特定して、同等の Istio 構成に移行することをおすすめします。 OSM から Istio への移行の詳細については、「Open Service Mesh (OSM) 構成から Istio への移行ガイダンス」を参照してください。
OSM コンポーネントの検証とトラブルシューティング
OSM コントローラーのデプロイ、ポッド、サービスを確認する
kubectl get deployment,pod,service
コマンドを使用して、OSM コントローラーのデプロイ、ポッド、サービスの正常性を確認します。kubectl get deployment,pod,service -n kube-system --selector app=osm-controller
正常な OSM コントローラーでは、次の出力例のような出力が表示されます。
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/osm-controller 2/2 2 2 3m4s NAME READY STATUS RESTARTS AGE pod/osm-controller-65bd8c445c-zszp4 1/1 Running 0 2m pod/osm-controller-65bd8c445c-xqhmk 1/1 Running 0 16s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/osm-controller ClusterIP 10.96.185.178 <none> 15128/TCP,9092/TCP,9091/TCP 3m4s service/osm-validator ClusterIP 10.96.11.78 <none> 9093/TCP 3m4s
Note
osm-controller
サービスの場合、CLUSTER-IP は異なります。 サービス の NAME と PORT(S) は、この出力例と同じである必要があります。
OSM インジェクターのデプロイ、ポッド、サービスを確認する
kubectl get deployment,pod,service
コマンドを使用して、OSM インジェクターのデプロイ、ポッド、サービスの正常性を確認します。kubectl get deployment,pod,service -n kube-system --selector app=osm-injector
正常な OSM インジェクタでは、次の出力例のような出力が表示されます。
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/osm-injector 2/2 2 2 4m37s NAME READY STATUS RESTARTS AGE pod/osm-injector-5c49bd8d7c-b6cx6 1/1 Running 0 4m21s pod/osm-injector-5c49bd8d7c-dx587 1/1 Running 0 4m37s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/osm-injector ClusterIP 10.96.236.108 <none> 9090/TCP 4m37s
OSM ブートストラップのデプロイ、ポッド、サービスを確認する
kubectl get deployment,pod,service
コマンドを使用して、OSM ブートストラップのデプロイ、ポッド、サービスの正常性を確認します。kubectl get deployment,pod,service -n kube-system --selector app=osm-bootstrap
正常な OSM ブートストラップでは、次の出力例のような出力が表示されます。
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/osm-bootstrap 1/1 1 1 5m25s NAME READY STATUS RESTARTS AGE pod/osm-bootstrap-594ffc6cb7-jc7bs 1/1 Running 0 5m25s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/osm-bootstrap ClusterIP 10.96.250.208 <none> 9443/TCP,9095/TCP 5m25s
検証および変更 Wehook を確認する
kubectl get ValidatingWebhookConfiguration
コマンドを使用して、OSM 検証 Webhook を確認します。kubectl get ValidatingWebhookConfiguration --selector app=osm-controller
正常な OSM 検証 Webhook では、次の出力例のような出力が表示されます。
NAME WEBHOOKS AGE aks-osm-validator-mesh-osm 1 81m
kubectl get MutatingWebhookConfiguration
コマンドを使用して、OSM 変更 Webhook を確認します。kubectl get MutatingWebhookConfiguration --selector app=osm-injector
正常な OSM 変更 Webhook では、次の出力例のような出力が表示されます。
NAME WEBHOOKS AGE aks-osm-webhook-osm 1 102m
検証 Webhook のサービスと CA バンドルを確認する
aks-osm-validator-mesh-osm
とjq '.webhooks[0].clientConfig.service'
を指定したkubectl get ValidatingWebhookConfiguration
コマンドを使用して、OSM 検証 Webhook のサービスと CA バンドルを確認します。kubectl get ValidatingWebhookConfiguration aks-osm-validator-mesh-osm -o json | jq '.webhooks[0].clientConfig.service'
適切に構成された検証 Webhook の構成は、次の JSON 出力例のようになります。
{ "name": "osm-config-validator", "namespace": "kube-system", "path": "/validate-webhook", "port": 9093 }
変更 Webhook のサービスと CA バンドルを確認する
aks-osm-validator-mesh-osm
とjq '.webhooks[0].clientConfig.service'
を指定したkubectl get ValidatingWebhookConfiguration
コマンドを使用して、OSM 変更 Webhook のサービスと CA バンドルを確認します。kubectl get MutatingWebhookConfiguration aks-osm-webhook-osm -o json | jq '.webhooks[0].clientConfig.service'
適切に構成された変更 Webhook の構成は、次の JSON 出力例のようになります。
{ "name": "osm-injector", "namespace": "kube-system", "path": "/mutate-pod-creation", "port": 9090 }
osm-mesh-config
リソースを確認する
kubectl get meshconfig
コマンドを使用して、OSM MeshConfig リソースが存在することを確認します。kubectl get meshconfig osm-mesh-config -n kube-system
-o yaml
を指定したkubectl get meshconfig
コマンドを使用して、OSM MeshConfig リソースの内容を確認します。kubectl get meshconfig osm-mesh-config -n kube-system -o yaml
apiVersion: config.openservicemesh.io/v1alpha1 kind: MeshConfig metadata: creationTimestamp: "0000-00-00A00:00:00A" generation: 1 name: osm-mesh-config namespace: kube-system resourceVersion: "2494" uid: 6c4d67f3-c241-4aeb-bf4f-b029b08faa31 spec: certificate: serviceCertValidityDuration: 24h featureFlags: enableEgressPolicy: true enableMulticlusterMode: false enableWASMStats: true observability: enableDebugServer: true osmLogLevel: info tracing: address: jaeger.kube-system.svc.cluster.local enable: false endpoint: /api/v2/spans port: 9411 sidecar: configResyncInterval: 0s enablePrivilegedInitContainer: false envoyImage: mcr.microsoft.com/oss/envoyproxy/envoy:v1.18.3 initContainerImage: mcr.microsoft.com/oss/openservicemesh/init:v0.9.1 logLevel: error maxDataPlaneConnections: 0 resources: {} traffic: enableEgress: true enablePermissiveTrafficPolicyMode: true inboundExternalAuthorization: enable: false failureModeAllow: false statPrefix: inboundExtAuthz timeout: 1s useHTTPSIngress: false
osm-mesh-config
リソースの値
キー | Type | 既定値 | Kubectl Patch コマンドの例 |
---|---|---|---|
spec.traffic.enableEgress | [bool] | true |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"enableEgress":true}}}' --type=merge |
spec.traffic.enablePermissiveTrafficPolicyMode | [bool] | true |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":true}}}' --type=merge |
spec.traffic.useHTTPSIngress | [bool] | false |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"useHTTPSIngress":true}}}' --type=merge |
spec.traffic.outboundPortExclusionList | array | [] |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"outboundPortExclusionList":[6379,8080]}}}' --type=merge |
spec.traffic.outboundIPRangeExclusionList | array | [] |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"outboundIPRangeExclusionList":["10.0.0.0/32","1.1.1.1/24"]}}}' --type=merge |
spec.traffic.inboundPortExclusionList | array | [] |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"inboundPortExclusionList":[6379,8080]}}}' --type=merge |
spec.certificate.serviceCertValidityDuration | string | "24h" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"certificate":{"serviceCertValidityDuration":"24h"}}}' --type=merge |
spec.observability.enableDebugServer | [bool] | true |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"observability":{"enableDebugServer":true}}}' --type=merge |
spec.observability.tracing.enable | [bool] | false |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"observability":{"tracing":{"enable":true}}}}' --type=merge |
spec.observability.tracing.address | string | "jaeger.kube-system.svc.cluster.local" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"observability":{"tracing":{"address": "jaeger.kube-system.svc.cluster.local"}}}}' --type=merge |
spec.observability.tracing.endpoint | string | "/api/v2/spans" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"observability":{"tracing":{"endpoint":"/api/v2/spans"}}}}' --type=merge' --type=merge |
spec.observability.tracing.port | INT | 9411 |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"observability":{"tracing":{"port":9411}}}}' --type=merge |
spec.observability.tracing.osmLogLevel | string | "info" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"observability":{"tracing":{"osmLogLevel": "info"}}}}' --type=merge |
spec.sidecar.enablePrivilegedInitContainer | [bool] | false |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"sidecar":{"enablePrivilegedInitContainer":true}}}' --type=merge |
spec.sidecar.logLevel | string | "error" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"sidecar":{"logLevel":"error"}}}' --type=merge |
spec.sidecar.maxDataPlaneConnections | INT | 0 |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"sidecar":{"maxDataPlaneConnections":"error"}}}' --type=merge |
spec.sidecar.envoyImage | string | "mcr.microsoft.com/oss/envoyproxy/envoy:v1.19.1" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"sidecar":{"envoyImage":"mcr.microsoft.com/oss/envoyproxy/envoy:v1.19.1"}}}' --type=merge |
spec.sidecar.initContainerImage | string | "mcr.microsoft.com/oss/openservicemesh/init:v0.11.1" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"sidecar":{"initContainerImage":"mcr.microsoft.com/oss/openservicemesh/init:v0.11.1"}}}' --type=merge |
spec.sidecar.configResyncInterval | string | "0s" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"sidecar":{"configResyncInterval":"30s"}}}' --type=merge |
spec.featureFlags.enableWASMStats | bool | "true" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableWASMStats":"true"}}}' --type=merge |
spec.featureFlags.enableEgressPolicy | bool | "true" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableEgressPolicy":"true"}}}' --type=merge |
spec.featureFlags.enableMulticlusterMode | bool | "false" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableMulticlusterMode":"false"}}}' --type=merge |
spec.featureFlags.enableSnapshotCacheMode | bool | "false" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableSnapshotCacheMode":"false"}}}' --type=merge |
spec.featureFlags.enableAsyncProxyServiceMapping | bool | "false" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableAsyncProxyServiceMapping":"false"}}}' --type=merge |
spec.featureFlags.enableIngressBackendPolicy | bool | "true" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableIngressBackendPolicy":"true"}}}' --type=merge |
spec.featureFlags.enableEnvoyActiveHealthChecks | bool | "false" |
kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableEnvoyActiveHealthChecks":"false"}}}' --type=merge |
名前空間を確認する
注意
kube-system
名前空間がサービス メッシュに参加することはなく、次のキーと値でラベル付けされたり、注釈が設定されたりすることはありません。
osm namespace add
コマンドを使用すると、特定のサービス メッシュに名前空間を参加させることができます。 K8s 名前空間をメッシュの一部にする場合は、次の注釈とラベルが必要です。
jq '.metadata.annotations'
を指定したkubectl get namespace
コマンドを使用して、注釈を表示します。kubectl get namespace bookbuyer -o json | jq '.metadata.annotations'
出力には次の注釈が表示されます。
{ "openservicemesh.io/sidecar-injection": "enabled" }
jq '.metadata.labels'
を指定したkubectl get namespaces
コマンドを使用して、ラベルを表示します。kubectl get namespace bookbuyer -o json | jq '.metadata.labels'
出力には次のラベルが表示されます。
{ "openservicemesh.io/monitored-by": "osm" }
名前空間に "openservicemesh.io/sidecar-injection": "enabled"
注釈または "openservicemesh.io/monitored-by": "osm"
ラベルがない場合、OSM インジェクタは Envoy サイドカーを追加しません。
Note
osm namespace add
を呼び出すと、新しいポッドのみに Envoy サイドカーが挿入されます。 kubectl rollout restart deployment ...
を使用して既存のポッドを再起動する必要があります
OSM CRD を確認する
kubectl get crds
コマンドを使用して、必要な CRD がクラスターにあることを確認します。kubectl get crds
次の CRD をクラスターにインストールする必要があります。
- egresses.policy.openservicemesh.io
- httproutegroups.specs.smi-spec.io
- ingressbackends.policy.openservicemesh.io
- meshconfigs.config.openservicemesh.io
- multiclusterservices.config.openservicemesh.io
- tcproutes.specs.smi-spec.io
- trafficsplits.split.smi-spec.io
- traffictargets.access.smi-spec.io
osm mesh list
コマンドを使用して、インストールされている SMI CRD のバージョンを取得します。osm mesh list
出力は次の出力例のようになります。
MESH NAME MESH NAMESPACE VERSION ADDED NAMESPACES osm kube-system v0.11.1 MESH NAME MESH NAMESPACE SMI SUPPORTED osm kube-system HTTPRouteGroup:v1alpha4,TCPRoute:v1alpha4,TrafficSplit:v1alpha2,TrafficTarget:v1alpha3 To list the OSM controller pods for a mesh, please run the following command passing in the mesh's namespace kubectl get pods -n <osm-mesh-namespace> -l app=osm-controller
OSM コントローラー v0.11.1 には、次のバージョンが必要です。
証明書の管理
アプリケーション ポッドで実行されている Envoy プロキシに対する OSM による証明書の発行と管理方法については、OSM の認証ガイドを参照してください。
Envoy のアップグレード
アドオンによって監視されている名前空間に新しいポッドを作成すると、OSM により、そのポッドに Envoy プロキシ サイドカーが挿入されます。 Envoy のバージョンを更新する方法の詳細については、OSM のアップグレード ガイドを参照してください。
Azure Kubernetes Service