Configurar la observabilidad de GKE Dataplane V2


En esta página se muestra cómo configurar clústeres de Google Kubernetes Engine (GKE) con la observabilidad de GKE Dataplane V2 a partir de las versiones 1.28 de GKE o posteriores. Para obtener más información sobre las ventajas y los requisitos de la observabilidad de GKE Dataplane V2, consulta el artículo Acerca de la observabilidad de GKE Dataplane V2.

Antes de empezar

Antes de empezar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Configurar métricas de GKE Dataplane V2

Para recoger métricas, debe configurar las métricas de GKE Dataplane V2. Puedes configurar las métricas de GKE Dataplane V2 cuando crees o actualices un clúster que se ejecute con GKE Dataplane V2. Puedes habilitar o inhabilitar las métricas de Dataplane V2 de GKE con la CLI de gcloud.

Te recomendamos que habilites las métricas de Dataplane V2 de GKE y Google Cloud Managed Service para Prometheus en tu clúster de GKE. Una vez que ambos estén habilitados, las métricas de Dataplane V2 de GKE se enviarán a Google Cloud Managed Service para Prometheus.

Crear un clúster de Autopilot con las métricas de GKE Dataplane V2 habilitadas

Cuando creas clústeres de GKE Autopilot, GKE habilita las métricas de GKE Dataplane V2 de forma predeterminada en el clúster sin necesidad de usar un flag específico.

Para usar las métricas de GKE Dataplane V2 de un clúster Autopilot de GKE con Google Cloud Managed Service para Prometheus, configura el ClusterPodMonitoring recurso para que raspe las métricas y las envíe a Google Cloud Managed Service para Prometheus.

  1. Crea un archivo de manifiesto de ClusterPodMonitoring:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: monitoring.googleapis.com/v1
    kind: ClusterPodMonitoring
    metadata:
      name: advanced-datapath-observability-metrics
    spec:
      selector:
        matchLabels:
          k8s-app: cilium
      endpoints:
      - port: flowmetrics
        interval: 60s
        metricRelabeling:
        # only keep denormalized pod flow metrics
        - sourceLabels: [__name__]
          regex: 'pod_flow_(ingress|egress)_flows_count'
          action: keep
        # extract pod name
        - sourceLabels: [__name__, destination]
          regex: 'pod_flow_ingress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${2}'
          targetLabel: pod_name
          action: replace
        - sourceLabels: [__name__, source]
          regex: 'pod_flow_egress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${2}'
          targetLabel: pod_name
          action: replace
        # extract workload name by removing 2 last "-XXX" parts
        - sourceLabels: [pod_name]
          regex: '([a-zA-Z0-9-\.]+)((-[a-zA-Z0-9\.]+){2})'
          replacement: '${1}'
          targetLabel: workload_name
          action: replace
        # extract workload name by removing one "-XXX" part when pod name has only 2 parts (eg. daemonset)
        - sourceLabels: [pod_name]
          regex: '([a-zA-Z0-9\.]+)((-[a-zA-Z0-9\.]+){1})'
          replacement: '${1}'
          targetLabel: workload_name
          action: replace
        # extract pod namespace
        - sourceLabels: [__name__, destination]
          regex: 'pod_flow_ingress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${1}'
          targetLabel: namespace_name
          action: replace
        - sourceLabels: [__name__, source]
          regex: 'pod_flow_egress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${1}'
          targetLabel: namespace_name
          action: replace
        # extract remote workload name
        - sourceLabels: [__name__, source]
          regex: 'pod_flow_ingress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${2}'
          targetLabel: remote_workload
          action: replace
        - sourceLabels: [__name__, destination]
          regex: 'pod_flow_egress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${2}'
          targetLabel: remote_workload
          action: replace
        # extract remote workload namespace
        - sourceLabels: [__name__, source]
          regex: 'pod_flow_ingress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${1}'
          targetLabel: remote_namespace
          action: replace
        - sourceLabels: [__name__, destination]
          regex: 'pod_flow_egress_flows_count;([a-zA-Z0-9-\.]+)/([a-zA-Z0-9-\.]+)'
          replacement: '${1}'
          targetLabel: remote_namespace
          action: replace
        # default remote workload class to "pod"
        - replacement: 'pod'
          targetLabel: remote_class
          action: replace
        # extract remote workload class from reserved identity
        - sourceLabels: [__name__, source]
          regex: 'pod_flow_ingress_flows_count;reserved:([^/]*)'
          replacement: '${1}'
          targetLabel: remote_class
          action: replace
        - sourceLabels: [__name__, destination]
          regex: 'pod_flow_egress_flows_count;reserved:([^/]*)'
          replacement: '${1}'
          targetLabel: remote_class
          action: replace
      targetLabels:
        metadata: []
    
  2. Aplica el manifiesto ClusterPodMonitoring:

    kubectl apply -f ClusterPodMonitoring.yaml
    

Crear un clúster estándar con las métricas de GKE Dataplane V2 habilitadas

Para habilitar las métricas de GKE Dataplane V2, crea un clúster con la marca --enable-dataplane-v2-metrics:

gcloud container clusters create CLUSTER_NAME \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --enable-managed-prometheus \
    --enable-dataplane-v2-metrics

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre de tu clúster.

La marca --enable-managed-prometheus indica a GKE que use las métricas con Google Cloud Managed Service para Prometheus.

Habilitar las métricas de GKE Dataplane V2 en un clúster

Para habilitar las métricas de GKE Dataplane V2 en un clúster, ejecuta el siguiente comando:

gcloud container clusters update CLUSTER_NAME \
    --enable-dataplane-v2-metrics

Sustituye CLUSTER_NAME por el nombre de tu clúster.

Inhabilitar las métricas de GKE Dataplane V2

Para inhabilitar las métricas de GKE Dataplane V2, sigue estos pasos:

gcloud container clusters update CLUSTER_NAME \
    --disable-dataplane-v2-metrics

Sustituye CLUSTER_NAME por el nombre de tu clúster.

Configurar herramientas de observabilidad de GKE Dataplane V2

Puedes usar un endpoint privado para acceder a las herramientas de solución de problemas de observabilidad de Dataplane V2 de GKE. Para habilitar las herramientas de observabilidad de GKE Dataplane V2, debes tener un clúster configurado con GKE Dataplane V2. Puedes habilitar las herramientas de observabilidad de GKE Dataplane V2 en un clúster nuevo o en uno que ya tengas.

Crear un clúster de Autopilot con la observabilidad habilitada

Para crear un clúster de Autopilot de GKE con la observabilidad de GKE Dataplane V2 habilitada, sigue estos pasos:

gcloud container clusters create-auto CLUSTER_NAME \
    --enable-dataplane-v2-flow-observability \
    --location COMPUTE_LOCATION

Sustituye lo siguiente: * CLUSTER_NAME: el nombre de tu clúster. * COMPUTE_LOCATION: la ubicación de Compute Engine del clúster.

Crear un clúster estándar con la observabilidad habilitada

Para crear un clúster estándar de GKE con la observabilidad de GKE Dataplane V2 habilitada, sigue estos pasos:

gcloud container clusters create CLUSTER_NAME \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --enable-dataplane-v2-flow-observability \
    --location COMPUTE_LOCATION

Sustituye lo siguiente: * CLUSTER_NAME: el nombre de tu clúster. * COMPUTE_LOCATION: la ubicación de Compute Engine del clúster.

Habilitar las herramientas de observabilidad de GKE Dataplane V2 en un clúster

Para habilitar la observabilidad de GKE Dataplane V2 en un clúster, ejecuta el siguiente comando:

gcloud container clusters update CLUSTER_NAME \
    --enable-dataplane-v2-flow-observability \
    --location COMPUTE_LOCATION

Haz los cambios siguientes:

Inhabilitar las herramientas de observabilidad de GKE Dataplane V2

Para inhabilitar las herramientas de observabilidad de GKE Dataplane V2 en un clúster, ejecuta el siguiente comando:

gcloud container clusters update CLUSTER_NAME \
    --disable-dataplane-v2-flow-observability

Sustituye CLUSTER_NAME por el nombre de tu clúster.

Cómo usar la CLI de Hubble

Usa la herramienta de CLI de Hubble en el clúster después de habilitar la función de observabilidad de GKE Dataplane V2.

  1. Define un alias para el archivo binario hubble-cli:

    alias hubble="kubectl exec -it -n gke-managed-dpv2-observability deployment/hubble-relay -c hubble-cli -- hubble"
    
  2. Para comprobar el estado de Hubble con la función de observabilidad de GKE Dataplane V2 habilitada, usa la CLI de Hubble en todos los clústeres de Autopilot:

    hubble status
    
  3. Para ver el tráfico actual, usa la CLI de Hubble de la siguiente manera:

    hubble observe
    

Cómo implementar la distribución binaria de la interfaz de usuario de Hubble

Una vez que se haya habilitado la observabilidad de GKE Dataplane V2, podrás desplegar la interfaz de usuario de Hubble de código abierto.

  1. Habilita la observabilidad en tu clúster de GKE:

    1. Crea un clúster de GKE con la observabilidad habilitada:

      gcloud container clusters create-auto hubble-rc-auto \
          --location COMPUTE_LOCATION \
          --cluster-version VERSION \
          --enable-dataplane-v2-flow-observability
      

      Haz los cambios siguientes:

    2. También puedes habilitar la observabilidad en un clúster:

      gcloud container clusters update CLUSTER_NAME \
          --location COMPUTE_LOCATION \
          --enable-dataplane-v2-flow-observability
      

      Haz los cambios siguientes:

  2. Configura kubectl para conectarte al clúster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location COMPUTE_LOCATION
    

    Sustituir

  3. Despliega la interfaz de Hubble:

    # Copyright 2024 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: hubble-ui
      namespace: gke-managed-dpv2-observability
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: hubble-ui
      labels:
        app.kubernetes.io/part-of: cilium
    rules:
      - apiGroups:
          - networking.k8s.io
        resources:
          - networkpolicies
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - componentstatuses
          - endpoints
          - namespaces
          - nodes
          - pods
          - services
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - apiextensions.k8s.io
        resources:
          - customresourcedefinitions
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - cilium.io
        resources:
          - "*"
        verbs:
          - get
          - list
          - watch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: hubble-ui
      labels:
        app.kubernetes.io/part-of: cilium
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: hubble-ui
    subjects:
      - kind: ServiceAccount
        name: hubble-ui
        namespace: gke-managed-dpv2-observability
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: hubble-ui-nginx
      namespace: gke-managed-dpv2-observability
    data:
      nginx.conf: |
        server {
            listen       8081;
            # uncomment for IPv6
            # listen       [::]:8081;
            server_name  localhost;
            root /app;
            index index.html;
            client_max_body_size 1G;
            location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                # CORS
                add_header Access-Control-Allow-Methods "GET, POST, PUT, HEAD, DELETE, OPTIONS";
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Max-Age 1728000;
                add_header Access-Control-Expose-Headers content-length,grpc-status,grpc-message;
                add_header Access-Control-Allow-Headers range,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout;
                if ($request_method = OPTIONS) {
                    return 204;
                }
                # /CORS
                location /api {
                    proxy_http_version 1.1;
                    proxy_pass_request_headers on;
                    proxy_hide_header Access-Control-Allow-Origin;
                    proxy_pass http://127.0.0.1:8090;
                }
                location / {
                    # double `/index.html` is required here
                    try_files $uri $uri/ /index.html /index.html;
                }
            }
        }
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: hubble-ui
      namespace: gke-managed-dpv2-observability
      labels:
        k8s-app: hubble-ui
        app.kubernetes.io/name: hubble-ui
        app.kubernetes.io/part-of: cilium
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s-app: hubble-ui
      template:
        metadata:
          labels:
            k8s-app: hubble-ui
            app.kubernetes.io/name: hubble-ui
            app.kubernetes.io/part-of: cilium
        spec:
          securityContext:
            fsGroup: 1000
            seccompProfile:
              type: RuntimeDefault
          serviceAccount: hubble-ui
          serviceAccountName: hubble-ui
          containers:
            - name: frontend
              image: quay.io/cilium/hubble-ui:v0.11.0
              ports:
                - name: http
                  containerPort: 8081
              volumeMounts:
                - name: hubble-ui-nginx-conf
                  mountPath: /etc/nginx/conf.d/default.conf
                  subPath: nginx.conf
                - name: tmp-dir
                  mountPath: /tmp
              terminationMessagePolicy: FallbackToLogsOnError
              securityContext:
                allowPrivilegeEscalation: false
                readOnlyRootFilesystem: true
                runAsUser: 1000
                runAsGroup: 1000
                capabilities:
                  drop:
                    - all
            - name: backend
              image: quay.io/cilium/hubble-ui-backend:v0.11.0
              env:
                - name: EVENTS_SERVER_PORT
                  value: "8090"
                - name: FLOWS_API_ADDR
                  value: "hubble-relay.gke-managed-dpv2-observability.svc:443"
                - name: TLS_TO_RELAY_ENABLED
                  value: "true"
                - name: TLS_RELAY_SERVER_NAME
                  value: relay.gke-managed-dpv2-observability.svc.cluster.local
                - name: TLS_RELAY_CA_CERT_FILES
                  value: /var/lib/hubble-ui/certs/hubble-relay-ca.crt
                - name: TLS_RELAY_CLIENT_CERT_FILE
                  value: /var/lib/hubble-ui/certs/client.crt
                - name: TLS_RELAY_CLIENT_KEY_FILE
                  value: /var/lib/hubble-ui/certs/client.key
              ports:
                - name: grpc
                  containerPort: 8090
              volumeMounts:
                - name: hubble-ui-client-certs
                  mountPath: /var/lib/hubble-ui/certs
                  readOnly: true
              terminationMessagePolicy: FallbackToLogsOnError
              securityContext:
                allowPrivilegeEscalation: false
                readOnlyRootFilesystem: true
                runAsUser: 1000
                runAsGroup: 1000
                capabilities:
                  drop:
                    - all
          volumes:
            - configMap:
                defaultMode: 420
                name: hubble-ui-nginx
              name: hubble-ui-nginx-conf
            - emptyDir: {}
              name: tmp-dir
            - name: hubble-ui-client-certs
              projected:
                # note: the leading zero means this number is in octal representation: do not remove it
                defaultMode: 0400
                sources:
                  - secret:
                      name: hubble-relay-client-certs
                      items:
                        - key: ca.crt
                          path: hubble-relay-ca.crt
                        - key: tls.crt
                          path: client.crt
                        - key: tls.key
                          path: client.key
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: hubble-ui
      namespace: gke-managed-dpv2-observability
      labels:
        k8s-app: hubble-ui
        app.kubernetes.io/name: hubble-ui
        app.kubernetes.io/part-of: cilium
    spec:
      type: ClusterIP
      selector:
        k8s-app: hubble-ui
      ports:
        - name: http
          port: 80
          targetPort: 8081
    
  4. Aplica el manifiesto hubble-ui-128.yaml:

    kubectl apply -f hubble-ui-128.yaml
    
  5. Exponer el servicio con la redirección de puertos:

    kubectl -n gke-managed-dpv2-observability port-forward service/hubble-ui 16100:80 --address='0.0.0.0'
    
  6. Accede a la interfaz de Hubble en tu navegador web:

    http://localhost:16100/

Siguientes pasos