Compartir a través de


Solucionar problemas del complemento Open Service Mesh (OSM) para Azure Kubernetes Service (AKS)

Al implementar el complemento Open Service Mesh (OSM) para Azure Kubernetes Service (AKS), es posible que experimente problemas relacionados con la configuración de la malla de servicios. El artículo explora los errores más comunes y cómo resolverlos.

Nota

Con la retirada de Open Service Mesh (OSM) de Cloud Native Computing Foundation (CNCF), se recomienda identificar las configuraciones de OSM y migrarlas a una configuración equivalente de Istio. Para obtener información sobre la migración de OSM a Istio, consulte Guía de migración para configuraciones de Open Service Mesh (OSM) a Istio.

Comprobación y solución de problemas de componentes de OSM

Comprobación de la implementación, el pod y el servicio del controlador de OSM

  • Compruebe la implementación de controlador OSM, el pod y el estado del servicio mediante el comando kubectl get deployment,pod,service.

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

    Un controlador OSM saludable da una salida similar a la siguiente salida de ejemplo:

    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
    

    Nota

    Para los servicios osm-controller, el CLUSTER-IP es diferente. El NOMBRE del servicio y los PUERTOS deben ser los mismos que los de la salida de ejemplo.

Comprobación de la implementación, el pod y el servicio del inyector de OSM

  • Compruebe la implementación del inyector OSM, el pod y el estado del servicio mediante el comando kubectl get deployment,pod,service.

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

    Un inyector OSM saludable da una salida similar a la siguiente salida de ejemplo:

    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
    

Compruebe la implementación, el pod y el servicio de arranque OSM

  • Compruebe la implementación de arranque OSM, el pod y el estado del servicio mediante el comando kubectl get deployment,pod,service.

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

    Un arranque OSM saludable da una salida similar a la siguiente salida de ejemplo:

    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
    

Comprobación de la validación y mutación de webhooks

  1. Compruebe el webhook de validación de OSM utilizando el comando kubectl get ValidatingWebhookConfiguration.

    kubectl get ValidatingWebhookConfiguration --selector app=osm-controller
    

    Un webhook de validación OSM en buen estado da una salida similar a la del siguiente ejemplo:

    NAME              WEBHOOKS   AGE
    aks-osm-validator-mesh-osm   1      81m
    
  2. Compruebe el webhook mutante OSM utilizando el comando kubectl get MutatingWebhookConfiguration.

    kubectl get MutatingWebhookConfiguration --selector app=osm-injector
    

    Un webhook mutante OSM saludable da una salida similar a la siguiente salida de ejemplo:

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

Comprobación del servicio y del paquete CA del webhook de validación

  • Comprueba el servicio y el paquete CA del webhook de validación de OSM utilizando el comando kubectl get ValidatingWebhookConfiguration con aks-osm-validator-mesh-osm y jq '.webhooks[0].clientConfig.service'.

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

    Una configuración de webhook de validación bien configurada es similar a la siguiente salida JSON de ejemplo:

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

Compruebe el servicio y el conjunto de CA del webhook mutante

  • Compruebe el servicio y el conjunto de CA del webhook mutante de OSM utilizando el comando kubectl get ValidatingWebhookConfiguration con aks-osm-validator-mesh-osm y jq '.webhooks[0].clientConfig.service'.

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

    Una configuración del webhook mutante bien configurada se parece a la siguiente salida JSON de ejemplo:

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

Comprobación del recurso osm-mesh-config

  1. Compruebe que el recurso OSM MeshConfig existe mediante el comando kubectl get meshconfig.

    kubectl get meshconfig osm-mesh-config -n kube-system
    
  2. Compruebe el contenido del recurso OSM MeshConfig mediante el comando kubectl get meshconfig con -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 del recurso

Clave Tipo Valor predeterminado Ejemplos de comandos de revisión de 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 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

Comprobación de espacios de nombres

Nota

El espacio de nombres kube-system nunca participa en una malla de servicios y nunca se etiqueta y/o anota con la siguiente clave/valores.

El comando osm namespace add permite unir espacios de nombres a una malla de servicios determinada. Cuando desee que un espacio de nombres K8s forme parte de la malla, debe tener la siguiente anotación y etiqueta.

  1. Vea las anotaciones mediante el comando kubectl get namespace con jq '.metadata.annotations'.

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

    Debe ver la siguiente anotación en la salida:

    {
      "openservicemesh.io/sidecar-injection": "enabled"
    }
    
  2. Vea las etiquetas utilizando el comando kubectl get namespaces con jq '.metadata.labels'.

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

    Debe ver la siguiente etiqueta en la salida:

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

Si un espacio de nombres no tiene la anotación "openservicemesh.io/sidecar-injection": "enabled" o la etiqueta "openservicemesh.io/monitored-by": "osm", el Inyector OSM no agrega Envoy sidecars.

Nota

Después osm namespace add se llama, solo las nuevos pods se inyectan con un sidecar Envoy. Los pods existentes deben reiniciarse con kubectl rollout restart deployment ...

Compruebe los CRD de OSM

  1. Compruebe que el clúster dispone de los CRD necesarios mediante el comando kubectl get crds.

    kubectl get crds
    

    Los siguientes CRD deben estar instalados en el 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. Obtenga las versiones de los CRD de SMI instalados utilizando el comando osm mesh list.

    osm mesh list
    

    El resultado debería ser similar al ejemplo siguiente:

    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
    

    El controlador de OSM 0.11.1 requiere las siguientes versiones:

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

Administración de certificados

Para obtener más información sobre cómo OSM emite y administra certificados para proxies Envoy que se ejecutan en pods de aplicaciones, consulte la guía de certificados OSM.

Actualización de Envoy

Cuando se crea un nuevo pod en un espacio de nombres supervisado por el complemento, OSM insertará un sidecar de proxy Envoy en ese pod. Para obtener más información sobre cómo actualizar la versión de Envoy, consulte la guía de actualización de OSM.