全部產品
Search
文件中心

Alibaba Cloud Service Mesh:通過mTLS採集網格內應用的監控指標

更新時間:Jun 30, 2024

在服務網格啟用mTLS(mutual TLS)的情境中,由於Sidecar代理會攔截所有應用的入向流量,應用公開的監控指標連接埠也必須通過mTLS進行加密訪問。對於一些關鍵業務,除了業務通訊本身加密之外,加密採集監控指標也十分必要。本文以Prometheus Operator自建Prometheus的情境為例,介紹如何通過mTLS採集網格內應用的監控指標。

前提條件

已部署Bookinfo應用樣本。具體操作,請參見在ASM執行個體關聯的叢集中部署應用

配置Prometheus執行個體採集TLS指標說明

為了使Prometheus能夠通過Sidecar代理的TLS認證,Prometheus需要使用一個由ASM執行個體根憑證簽發的認證。您可以藉助Sidecar代理的認證掛載能力來實現這一目的。通過為Prometheus Pod定義約定的Annotation,可以使Sidecar代理將ASM控制平面為其簽發的認證掛載至共用卷,Prometheus容器通過掛載該共用卷即可得到認證和密鑰,具體操作步驟如下:

  1. 為Prometheus Pod增加卷istio-certs。

    volumes:
    - emptyDir:
        medium: Memory
      name: istio-certs
  2. 為Prometheus Pod添加如下2個annotation

    annotations:
      proxy.istio.io/config: |
        proxyMetadata:
          OUTPUT_CERTS: /etc/istio-output-certs
      sidecar.istio.io/userVolumeMount: '[{"name": "istio-certs", "mountPath": "/etc/istio-output-certs"}]'
    • proxy.istio.io/config:指定代理配置,其中proxyMetadata.OUTPUT_CERTS指定將認證和金鑰儲存區至/etc/istio-output-certs路徑下。

    • sidecar.istio.io/userVolumeMount:將卷掛載到Sidecar代理容器的/etc/istio-output-certs路徑下。

  3. 為Prometheus容器掛載istio-certs卷至/etc/prom-certs/路徑,便於Prometheus從該路徑擷取由Sidecar代理寫入的認證和密鑰。

    volumeMounts:
    - mountPath: /etc/prom-certs/
      name: istio-certs
  4. 在採集配置中指定哪些工作負載使用TLS(只有注入了Sidecar的工作負載需要)發起指標抓取請求,並為TLS指定使用的憑證路徑。

    本文以Prometheus Operator環境為例。

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: productpage
      labels:
        app: productpage
        team: bookinfo
    spec:
      selector:
        matchLabels:
          app: productpage
      endpoints:
      - port: http-9080
        interval: 30s
        path: /metrics
        scheme: https
        tlsConfig:
          caFile: /etc/prom-certs/root-cert.pem
          certFile: /etc/prom-certs/cert-chain.pem
          keyFile: /etc/prom-certs/key.pem
          insecureSkipVerify: true

    在以上YAML中,通過labels指定對productpage應用進行指標採集,並對其採集端點進行了定義。在端點定義中,與TLS相關的配置如下:

    • scheme: https:指定使用HTTPS發起請求。

    • tlsConfig:指定認證、CA認證和密鑰的檔案路徑。

    • insecureSkipVerify: true:由於Prometheus不支援Istio的身份命名方式,所以此處允許不安全的認證訪問。

以上配置可以使Prometheus掛載Sidecar提供的認證和密鑰,並使用該認證和密鑰發起TLS請求。

操作步驟

步驟一:安裝Prometheus Operator

  1. 執行以下命令,從GitHub上複製Prometheus Operator專案的原始碼倉庫到本機電腦。

    git clone https://github.com/prometheus-operator/prometheus-operator.git
  2. 使用K8s叢集的KubeConfig,執行以下命令,安裝Prometheus Operator。

    cd prometheus-operator/
    kubectl create -f bundle.yaml
  3. 執行以下命令,查看Pod狀態。

    kubectl get pods

    預期輸出:

    NAME                                     READY   STATUS        RESTARTS   
    prometheus-operator-58dd988c9c-qhrrp     2/2     Running       0      

    預期輸出表明Prometheus Operator已安裝成功。

步驟二:定義Prometheus CR部署Prometheus執行個體

  1. 將以下YAML儲存至本地,命名為prometheus.yaml。

    YAML包含Prometheus執行個體聲明及其依賴的相關ServiceAccount、ClusterRole和ClusterRoleBinding。在Deployment配置中,可以看到配置Prometheus執行個體採集TLS指標說明中提及的相關認證卷掛載的配置。

    說明

    本文提供的Prometheus相關CR僅用於示範,請您根據實際生產環境進行調整。

    展開查看prometheus.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: prometheus-full-access
      namespace: default
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: prometheus-full-access
    rules:
    - apiGroups: [""]
      resources:
      - nodes
      - nodes/metrics
      - services
      - endpoints
      - pods
      verbs: ["get", "list", "watch"]
    - apiGroups:
      - extensions
      - apps
      resources:
      - deployments
      - replicasets
      verbs: ["get", "list", "watch"]
    - apiGroups: [""]
      resources:
      - configmaps
      verbs: ["get"]
    - nonResourceURLs: ["/metrics"]
      verbs: ["get"]
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Prometheus
    metadata:
      name: default
      labels:
        prometheus: default
    spec:
      logLevel: debug
      podMetadata:
        annotations:
          traffic.sidecar.istio.io/includeInboundPorts: ""
          traffic.sidecar.istio.io/includeOutboundIPRanges: ""
          proxy.istio.io/config: |  # configure an env variable `OUTPUT_CERTS` to write certificates to the given folder
            proxyMetadata:
              OUTPUT_CERTS: /etc/istio-output-certs
          sidecar.istio.io/userVolumeMount: '[{"name": "istio-certs", "mountPath": "/etc/istio-output-certs"}]'
      volumes:
      - emptyDir:
          medium: Memory
        name: istio-certs
      volumeMounts:
      - mountPath: /etc/prom-certs/
        name: istio-certs
      replicas: 2
      version: v2.26.0
      serviceAccountName: prometheus-full-access
      serviceMonitorSelector:
        matchLabels:
          team: bookinfo
      ruleSelector:
        matchLabels:
          role: alert-rules
          prometheus: example
  2. 使用K8s叢集的KubeConfig,執行以下命令,應用prometheus.yaml到K8s叢集。

    kubectl apply -f prometheus.yaml
  3. 執行以下命令,檢查Prometheus執行個體是否正確被拉起。

    kubectl get pods

    預期輸出:

    NAME                                   READY   STATUS    RESTARTS
    prometheus-default-0                   3/3     Running   0 
    prometheus-default-1                   3/3     Running   0  
    prometheus-operator-58dd988c9c-qhrrp   2/2     Running   0  

    可以看到prometheus-default-0和prometheus-default-1兩個Pod已經啟動。

步驟三:定義ServiceMonitor CR聲明採集規則

  1. 將以下YAML儲存至本地,命名為service-monitor.yaml。

    YAML包含ServiceMonitor API的聲明,描述了如何從工作負載採集監控指標。在YAML中可以看到在配置Prometheus執行個體採集TLS指標說明中提及的憑證路徑和scheme的設定。

    說明

    本文提供的Prometheus相關CR僅用於示範,請您根據實際生產環境進行調整。

    iVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: productpage
      labels:
        app: productpage
        team: bookinfo
    spec:
      selector:
        matchLabels:
          app: productpage
      endpoints:
      - port: http-9080
        interval: 30s
        path: /metrics
        scheme: https
        tlsConfig:
          caFile: /etc/prom-certs/root-cert.pem
          certFile: /etc/prom-certs/cert-chain.pem
          keyFile: /etc/prom-certs/key.pem
          insecureSkipVerify: true
  2. 使用K8s叢集KubeConfig,執行以下命令,應用service-monitor.yaml到K8s叢集。

    kubectl apply -f service-monitor.yaml

步驟四:將本地連接埠映射到Prometheus Operator服務,查看Prometheus採集到的指標

  1. 執行以下命令,建立連接埠轉寄,將本地連接埠9090映射到Prometheus Operator服務的9090連接埠。

    kubectl port-forward svc/prometheus-operated 9090
  2. 在瀏覽器輸入localhost:9090,開啟Prometheus的Web UI。

    image

  3. 在頂部功能表列,選擇Status > Target,查看監控目標的狀態。

    說明

    如果某個目標通過TLS加密,在介面上可能會顯示為“Unavailable”(不可用),這可能是因為配置了TLS但沒有正確設定TLS認證。

    如下圖所示,可以看到目標StateUp,表示指標成功被抓取。

    image

  4. 在頂部功能表列,單擊Graph返回查詢頁面,在查詢文字框中輸入python_gc_objects_collected_total指標名,單擊右側的Execute

    如下圖所示,可以看到上報的指標資料。

    image