次の方法で共有


Azure Kubernetes Service (AKS) の Open Service Mesh (OSM) アドオンのトラブルシューティング

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 を確認する

  1. kubectl get ValidatingWebhookConfiguration コマンドを使用して、OSM 検証 Webhook を確認します。

    kubectl get ValidatingWebhookConfiguration --selector app=osm-controller
    

    正常な OSM 検証 Webhook では、次の出力例のような出力が表示されます。

    NAME              WEBHOOKS   AGE
    aks-osm-validator-mesh-osm   1      81m
    
  2. 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-osmjq '.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-osmjq '.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 リソースを確認する

  1. kubectl get meshconfig コマンドを使用して、OSM MeshConfig リソースが存在することを確認します。

    kubectl get meshconfig osm-mesh-config -n kube-system
    
  2. -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 名前空間をメッシュの一部にする場合は、次の注釈とラベルが必要です。

  1. jq '.metadata.annotations' を指定した kubectl get namespace コマンドを使用して、注釈を表示します。

    kubectl get namespace bookbuyer -o json | jq '.metadata.annotations'
    

    出力には次の注釈が表示されます。

    {
      "openservicemesh.io/sidecar-injection": "enabled"
    }
    
  2. 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 を確認する

  1. 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
  2. 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 には、次のバージョンが必要です。

    • traffictargets.access.smi-spec.io - v1alpha3
    • httproutegroups.specs.smi-spec.io - v1alpha4
    • tcproutes.specs.smi-spec.io - v1alpha4
    • udproutes.specs.smi-spec.io - サポートされません
    • trafficsplits.split.smi-spec.io - v1alpha2
    • *.metrics.smi-spec.io - v1alpha1

証明書の管理

アプリケーション ポッドで実行されている Envoy プロキシに対する OSM による証明書の発行と管理方法については、OSM の認証ガイドを参照してください。

Envoy のアップグレード

アドオンによって監視されている名前空間に新しいポッドを作成すると、OSM により、そのポッドに Envoy プロキシ サイドカーが挿入されます。 Envoy のバージョンを更新する方法の詳細については、OSM のアップグレード ガイドを参照してください。