Compartilhar via


Solucionar problemas relacionados ao complemento da Malha de Serviço Aberta (OSM) no Serviço de Kubernetes do Azure (AKS)

Ao implantar o complemento Open Service Mesh (OSM) para o Serviço de Kubernetes do Azure (AKS), você poderá enfrentar problemas associados à configuração da malha de serviço. O artigo explora erros comuns de solução de problemas e como resolvê-los.

Observação

Com a desativação do Open Service Mesh (OSM) pela Cloud Native Computing Foundation (CNCF), recomendamos identificar suas configurações de OSM e migrá-las para uma configuração equivalente do Istio. Para obter informações sobre como migrar do OSM para o Istio, consulte Diretrizes de migração para configurações do OSM (Open Service Mesh) para o Istio.

Verificando e solucionando problemas de componentes OSM

Confira o serviço, o pod e a implantação do controlador de OSM

  • Verifique a implantação, o pod e a integridade do serviço do controlador OSM usando o comando kubectl get deployment,pod,service.

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

    Um controlador OSM íntegro fornece uma saída semelhante à seguinte saída de exemplo:

    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
    

    Observação

    Para os serviços osm-controller, o CLUSTER-IP é diferente. O NOME e as PORTA(S) do serviço devem ser iguais aos da saída de exemplo.

Confira o serviço, o pod e a implantação do injetor de OSM

  • Verifique a implantação, o pod e a integridade do serviço do injetor OSM usando o comando kubectl get deployment,pod,service.

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

    Um injetor OSM íntegro fornece uma saída semelhante à seguinte saída de exemplo:

    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
    

Confira o serviço, o pod e a implantação da inicialização de OSM

  • Verifique a implantação, o pod e a integridade do serviço do bootstrap OSM usando o comando kubectl get deployment,pod,service.

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

    Um Bootstrap OSM íntegro fornece uma saída semelhante à seguinte saída de exemplo:

    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
    

Verificar a validação e mutação de webhooks

  1. Verifique o webhook de validação OSM usando o comando kubectl get ValidatingWebhookConfiguration.

    kubectl get ValidatingWebhookConfiguration --selector app=osm-controller
    

    Um webhook de validação de OSM íntegro fornece uma saída semelhante à seguinte saída de exemplo:

    NAME              WEBHOOKS   AGE
    aks-osm-validator-mesh-osm   1      81m
    
  2. Verifique o webhook de mutação de OSM usando o comando kubectl get MutatingWebhookConfiguration.

    kubectl get MutatingWebhookConfiguration --selector app=osm-injector
    

    Um webhook de mutação de OSM íntegro fornece uma saída semelhante à seguinte saída de exemplo:

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

Verifique o serviço e o pacote de AC do webhook de validação

  • Verifique o serviço e o pacote de AC do webhook de validação OSM usando o comando kubectl get ValidatingWebhookConfiguration com aks-osm-validator-mesh-osm e jq '.webhooks[0].clientConfig.service'.

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

    Uma configuração de webhook de validação bem configurada é semelhante à seguinte saída JSON de exemplo:

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

Verifique o serviço e o pacote de AC do webhook de mutação

  • Verifique o serviço e o pacote de AC do webhook de mutação OSM usando o comando kubectl get ValidatingWebhookConfiguration com aks-osm-validator-mesh-osm e jq '.webhooks[0].clientConfig.service'.

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

    Uma configuração de webhook de mutação bem configurada é semelhante à seguinte saída JSON de exemplo:

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

Verifique o recurso osm-mesh-config

  1. Verifique se o recurso MeshConfig do OSM existe usando o comando kubectl get meshconfig.

    kubectl get meshconfig osm-mesh-config -n kube-system
    
  2. Verifique o conteúdo do recurso MeshConfig do OSM usando o comando kubectl get meshconfig com -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 valores de recurso

Chave Type Valor padrão Exemplos de comando do Patch kubectl
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 cadeia de caracteres "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

Verificar namespaces

Observação

O namespace kube-system nunca participa em uma malha de serviço e nunca é rotulado e/ou anotado com a chave/valores a seguir.

O comando osm namespace add permite ingressar namespaces em uma malha de serviço específica. Quando você deseja que um namespace K8s faça parte da malha, ele deve ter a anotação e o rótulo a seguir.

  1. Exiba as anotações usando o comando kubectl get namespace com jq '.metadata.annotations'.

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

    Você deve ver a seguinte anotação na saída:

    {
      "openservicemesh.io/sidecar-injection": "enabled"
    }
    
  2. Exiba os rótulos usando o comando kubectl get namespaces com jq '.metadata.labels'.

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

    Você deve ver o seguinte rótulo na saída:

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

Se um namespace não tiver a anotação "openservicemesh.io/sidecar-injection": "enabled" ou o rótulo "openservicemesh.io/monitored-by": "osm", o Injetor OSM não adicionará sidecars do Envoy.

Observação

Depois que osm namespace add é chamado, apenas pods novos são injetados com um sidecar do Envoy. Os pods existentes devem ser reiniciados com kubectl rollout restart deployment ...

Verifique os CRDs de OSM

  1. Verifique se o cluster tem os CRDs necessários usando o comando kubectl get crds.

    kubectl get crds
    

    Os seguintes CRDs devem ser instalados no cluster:

    • 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. Obtenha as versões dos SMI CRDs instalados usando o comando osm mesh list.

    osm mesh list
    

    Seu resultado deve ser semelhante ao seguinte exemplo de saída:

    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
    

    O Controlador de OSM v0.11.1 requer as seguintes versões:

    • traffictargets.access.smi-spec.io - v1alpha3
    • httproutegroups.specs.smi-spec.io - v1alpha4
    • tcproutes.specs.smi-spec.io - v1alpha4
    • udproutes.specs.smi-spec.io - sem suporte
    • trafficsplits.split.smi-spec.io - v1alpha2
    • *.metrics.smi-spec.io – v1alpha1

Gerenciamento de certificados

Para obter mais informações sobre como o OSM emite e gerencia certificados para o proxies do Envoy em execução nos pods de aplicativo, confira o guia de certificados do OSM.

Atualizando o Envoy

Quando você cria um novo pod em um namespace monitorado pelo complemento, o OSM injeta um proxy de sidecar do Envoy nesse pod. Para obter mais informações sobre como atualizar a versão do Envoy, confira o guia de atualização do OSM.