GKE Dataplane V2 관측 가능성 설정


이 페이지에서는 GKE 버전 1.28 이상부터 GKE Dataplane V2 관측 가능성으로 Google Kubernetes Engine(GKE) 클러스터를 구성하는 방법을 보여줍니다. GKE Dataplane V2 관측 가능성의 이점 및 요구사항에 대한 자세한 내용은 GKE Dataplane V2 관측 가능성 정보를 참조하세요.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

GKE Dataplane V2 측정항목 구성

측정항목을 수집하려면 GKE Dataplane V2 측정항목을 구성해야 합니다. 클러스터를 만들거나 GKE Dataplane V2로 실행되는 클러스터를 업데이트할 때 GKE Dataplane V2 측정항목을 구성할 수 있습니다. gcloud CLI를 사용하여 GKE Dataplane V2 측정항목을 사용 설정하거나 사용 중지할 수 있습니다.

GKE 클러스터에서 GKE Dataplane V2 측정항목 및 Google Cloud Managed Service for Prometheus를 사용 설정하는 것이 좋습니다. 둘 다 사용 설정되면 GKE Dataplane V2 측정항목이 Google Cloud Managed Service for Prometheus로 전송됩니다.

GKE Dataplane V2 측정항목이 사용 설정된 Autopilot 클러스터 만들기

새 GKE Autopilot 클러스터를 만들면 GKE는 특정 플래그 없이 클러스터에서 기본적으로 GKE Dataplane V2 측정항목을 사용 설정합니다.

Google Cloud Managed Service for Prometheus와 함께 GKE Autopilot 클러스터 GKE Dataplane V2 측정항목을 사용하려면 ClusterPodMonitoring 리소스를 구성하여 측정항목을 스크래핑하고 Google Cloud Managed Service for Prometheus로 전송합니다.

  1. 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. ClusterPodMonitoring 매니페스트를 적용합니다.

    kubectl apply -f ClusterPodMonitoring.yaml
    

GKE Dataplane V2 측정항목이 사용 설정된 표준 클러스터 만들기

GKE Dataplane V2 측정항목을 사용 설정하려면 --enable-dataplane-v2-metrics 플래그가 있는 클러스터를 만듭니다.

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

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터의 이름

--enable-managed-prometheus 플래그는 GKE가 Google Cloud Managed Service for Prometheus에서 측정항목을 사용하도록 지시합니다.

기존 클러스터에서 GKE Dataplane V2 측정항목 사용 설정

기존 클러스터에서 GKE Dataplane V2 측정항목을 사용 설정하려면 다음 명령어를 실행합니다.

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

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

GKE Dataplane V2 측정항목 사용 중지

GKE Dataplane V2 측정항목을 사용 중지하려면 다음 안내를 따르세요.

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

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

GKE Dataplane V2 관측 가능성 도구 구성

비공개 엔드포인트를 사용하여 GKE Dataplane V2 관측 가능성 문제 해결 도구에 액세스할 수 있습니다. GKE Dataplane V2 관측 가능성 도구를 사용 설정하려면 GKE Dataplane V2로 구성된 클러스터가 있어야 합니다. 새 클러스터 또는 기존 클러스터에서 GKE Dataplane V2 관측 가능성 도구를 사용 설정할 수 있습니다.

관측 가능성을 사용 설정하여 Autopilot 클러스터 만들기

GKE Dataplane V2 관측 가능성을 사용 설정하여 GKE Autopilot 클러스터를 만들려면 다음 안내를 따르세요.

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

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

관측 가능성을 사용 설정한 표준 클러스터 만들기

GKE Dataplane V2 관측 가능성을 사용 설정하여 GKE Standard 클러스터를 만들려면 다음 안내를 따르세요.

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

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

기존 클러스터에서 GKE Dataplane V2 관측 가능성 도구 사용 설정

기존 클러스터에서 GKE Dataplane V2 관측 가능성을 사용 설정하려면 다음 명령어를 실행하세요.

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

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

GKE Dataplane V2 관측 가능성 도구 사용 중지

기존 클러스터에서 GKE Dataplane V2 관측 가능성 도구를 사용 중지하려면 다음 명령어를 실행하세요.

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

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

Hubble CLI 사용 방법

GKE Dataplane V2 관측 가능성 기능을 사용 설정한 후 클러스터에서 Hubble CLI 도구를 사용합니다.

  1. hubble-cli 바이너리의 별칭을 정의합니다.

    alias hubble="kubectl exec -it -n gke-managed-dpv2-observability deployment/hubble-relay -c hubble-cli -- hubble"
    
  2. GKE Dataplane V2 관측 가능성 기능이 사용 설정된 Hubble 상태를 확인하려면 모든 Autopilot 클러스터에서 Hubble CLI를 사용합니다.

    hubble status
    
  3. 현재 트래픽을 보려면 다음과 같이 Hubble CLI를 사용합니다.

    hubble observe
    

Hubble UI 바이너리 배포를 배포하는 방법

GKE Dataplane V2 관측 가능성이 사용 설정되면 오픈소스 Hubble UI를 배포할 수 있습니다.

  1. GKE 클러스터에서 관측 가능성을 사용 설정합니다.

    1. 관측 가능성을 사용 설정하여 GKE 클러스터를 만듭니다.

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

      다음을 바꿉니다.

    2. 또는 기존 클러스터에서 관측 가능성을 사용 설정합니다.

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

      다음을 바꿉니다.

  2. 클러스터에 연결하도록 kubectl을 구성합니다.

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

    바꾸기

  3. Hubble UI를 배포합니다.

    # 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. hubble-ui-128.yaml 매니페스트를 적용합니다.

    kubectl apply -f hubble-ui-128.yaml
    
  5. 포트 전달을 사용하여 서비스를 노출합니다.

    kubectl -n gke-managed-dpv2-observability port-forward service/hubble-ui 16100:80 --address='0.0.0.0'
    
  6. 웹브라우저에서 Hubble UI에 액세스합니다.

    http://localhost:16100/

다음 단계