Udostępnij za pośrednictwem


Rozwiązywanie problemów z dodatkiem Open Service Mesh (OSM) dla usługi Azure Kubernetes Service (AKS)

Podczas wdrażania dodatku Open Service Mesh (OSM) dla usługi Azure Kubernetes Service (AKS) mogą wystąpić problemy związane z konfiguracją usługi Service Mesh. W tym artykule opisano typowe błędy rozwiązywania problemów i sposoby ich rozwiązywania.

Uwaga

Po wycofaniu usługi Open Service Mesh (OSM) przez Cloud Native Computing Foundation (CNCF) zalecamy zidentyfikowanie konfiguracji OSM i migrację ich do równoważnej konfiguracji istio. Aby uzyskać informacje na temat migracji z OSM do Istio, zobacz Wskazówki dotyczące migracji konfiguracji Open Service Mesh (OSM) do Istio.

Weryfikowanie i rozwiązywanie problemów ze składnikami OSM

Sprawdź wdrożenie, pod i usługę OSM Controller

  • Sprawdź wdrożenie kontrolera OSM, pod i kondycję zdrowia usługi przy użyciu polecenia kubectl get deployment,pod,service.

    kubectl get deployment,pod,service -n kube-system --selector app=osm-controller
    

    Kontroler OSM w dobrej kondycji daje dane wyjściowe podobne do następujących przykładowych danych wyjściowych:

    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
    

    Uwaga

    osm-controller W przypadku usług adres CLUSTER-IP jest inny. Nazwa usługi i porty muszą być takie same jak w przykładowych danych wyjściowych.

Sprawdź wdrożenie, zasobnik i usługę injektora OSM

  • Sprawdź wdrożenie OSM, pod i kondycję usługi przy użyciu polecenia kubectl get deployment,pod,service.

    kubectl get deployment,pod,service -n kube-system --selector app=osm-injector
    

    Iniektor OSM w dobrej kondycji daje dane wyjściowe podobne do następujących przykładowych danych wyjściowych:

    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
    

Sprawdź wdrożenie, pod i usługę OSM Bootstrap

  • Sprawdź wdrożenie OSM, zasobnik i kondycję usługi za pomocą polecenia kubectl get deployment,pod,service.

    kubectl get deployment,pod,service -n kube-system --selector app=osm-bootstrap
    

    OSM Bootstrap w dobrej kondycji daje dane wyjściowe podobne do następującego przykładowego wyniku:

    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
    

Sprawdzanie walidacji imutowania elementów webhook

  1. Sprawdź webhook walidujący OSM używając polecenia kubectl get ValidatingWebhookConfiguration.

    kubectl get ValidatingWebhookConfiguration --selector app=osm-controller
    

    Prawidłowy webhook walidacyjny OSM daje wynik podobny do następującego przykładowego wyniku:

    NAME              WEBHOOKS   AGE
    aks-osm-validator-mesh-osm   1      81m
    
  2. Sprawdź OSM Mutating Webhook przy użyciu polecenia kubectl get MutatingWebhookConfiguration.

    kubectl get MutatingWebhookConfiguration --selector app=osm-injector
    

    Zdrowy webhook mutujący OSM generuje dane wyjściowe podobne do następującego przykładowego wyniku.

    NAME              WEBHOOKS   AGE
    aks-osm-webhook-osm   1      102m
    

Sprawdź usługę i pakiet CA dla webhooka weryfikującego.

  • Sprawdź pakiet certyfikatów CAs dla webhooka walidacji OSM przy użyciu polecenia kubectl get ValidatingWebhookConfiguration, aks-osm-validator-mesh-osm i jq '.webhooks[0].clientConfig.service'.

    kubectl get ValidatingWebhookConfiguration aks-osm-validator-mesh-osm -o json | jq '.webhooks[0].clientConfig.service'
    

    Dobrze skonfigurowana konfiguracja walidującego webhooka wygląda jak poniższy przykładowy wynik JSON.

    {
      "name": "osm-config-validator",
      "namespace": "kube-system",
      "path": "/validate-webhook",
      "port": 9093
    }
    

Sprawdź zestaw usługi i certyfikat CA webhooka modyfikującego.

  • Sprawdź pakiet usługi i pakiet certyfikatów CA mutującego webhooka OSM, używając polecenia kubectl get ValidatingWebhookConfiguration z aks-osm-validator-mesh-osm i jq '.webhooks[0].clientConfig.service'.

    kubectl get MutatingWebhookConfiguration aks-osm-webhook-osm -o json | jq '.webhooks[0].clientConfig.service'
    

    Dobrze skonfigurowana konfiguracja mutowania elementu webhook wygląda podobnie do następujących przykładowych danych wyjściowych JSON:

    {
      "name": "osm-injector",
      "namespace": "kube-system",
      "path": "/mutate-pod-creation",
      "port": 9090
    }
    

Sprawdź zasób osm-mesh-config

  1. Sprawdź, czy zasób OSM MeshConfig istnieje przy użyciu kubectl get meshconfig polecenia .

    kubectl get meshconfig osm-mesh-config -n kube-system
    
  2. Sprawdź zawartość zasobu OSM MeshConfig przy użyciu polecenia kubectl get meshconfig-o yaml.

    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 wartości zasobów

Klucz Typ Wartość domyślna Przykłady poleceń narzędzia Kubectl Patch
specyfikacja.ruch.włączWyjście bool true kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"enableEgress":true}}}' --type=merge
spec.traffic.włączeniePermisywnegoTrybuPolitykiRuchu 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 tablica [] kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"outboundPortExclusionList":[6379,8080]}}}' --type=merge
spec.traffic.outboundIPRangeExclusionList tablica [] 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.listaWykluczeńPortówPrzychodzących tablica [] kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"traffic":{"inboundPortExclusionList":[6379,8080]}}}' --type=merge
specyfikacja.certyfikat.okresWażnościCertyfikatuUsługi 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 (włączenie śledzenia) 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
specyfikacja.obserwowalność.śledzenie.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.włączPolitykęEgress 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 (flagi funkcji spec pozwalające na aktywne sprawdzanie zdrowia Envoy) bool "false" kubectl patch meshconfig osm-mesh-config -n kube-system -p '{"spec":{"featureFlags":{"enableEnvoyActiveHealthChecks":"false"}}}' --type=merge

Sprawdź przestrzenie nazw

Uwaga

kube-system Przestrzeń nazw nigdy nie uczestniczy w mesh'u usługowym i nigdy nie jest oznaczana ani etykietowana/adnotowana przy użyciu następujących kluczy/wartości.

Polecenie osm namespace add umożliwia łączenie przestrzeni nazw z daną siatką usług. Jeśli chcesz, aby przestrzeń nazw K8s była częścią siatki, musi mieć następującą adnotację i etykietę.

  1. Wyświetl adnotacje przy użyciu polecenia kubectl get namespace z jq '.metadata.annotations'.

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

    W danych wyjściowych musisz zobaczyć następującą adnotację:

    {
      "openservicemesh.io/sidecar-injection": "enabled"
    }
    
  2. Wyświetl etykiety przy użyciu polecenia kubectl get namespaces z jq '.metadata.labels'.

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

    W danych wyjściowych musi zostać wyświetlona następująca etykieta:

    {
      "openservicemesh.io/monitored-by": "osm"
    }
    

Jeśli przestrzeń nazw nie ma adnotacji "openservicemesh.io/sidecar-injection": "enabled" ani etykiety "openservicemesh.io/monitored-by": "osm", OSM Injector nie dodaje kontenerów pomocniczych Envoy.

Uwaga

Po osm namespace add wywołaniu, tylko nowe zasobniki są wstrzykiwane z przyczepki Envoy. Istniejące zasobniki należy ponownie uruchomić za pomocą polecenia kubectl rollout restart deployment ...

Weryfikacja CRD OSM

  1. Sprawdź, czy klaster ma wymagane definicje CRD przy użyciu polecenia kubectl get crds.

    kubectl get crds
    

    W klastrze muszą być zainstalowane następujące dyski 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. Uzyskaj wersje zainstalowanych CRD SMI za pomocą polecenia osm mesh list.

    osm mesh list
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    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
    

    Kontroler OSM v0.11.1 wymaga następujących wersji:

    • traffictargets.access.smi-spec.io — v1alpha3
    • httproutegroups.specs.smi-spec.io — wersja 1alpha4
    • tcproutes.specs.smi-spec.io — v1alpha4
    • udproutes.specs.smi-spec.io — nieobsługiwane
    • trafficsplits.split.smi-spec.io — v1alpha2
    • *.metrics.smi-spec.io — v1alpha1

Zarządzanie certyfikatami

Aby uzyskać więcej informacji na temat tego, jak OSM wystawia i zarządza certyfikatami dla serwerów proxy Envoy uruchomionych na zasobnikach aplikacji, zobacz przewodnik po certyfikatach OSM.

Uaktualnianie Envoy

Po utworzeniu nowego poda w przestrzeni nazw monitorowanej przez dodatek, OSM wstrzykuje sidecar proxy Envoy do tego poda. Aby uzyskać więcej informacji na temat aktualizowania wersji programu Envoy, zobacz przewodnik uaktualniania OSM.