在服務網格啟用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容器通過掛載該共享卷即可得到證書和密鑰,具體操作步驟如下:
為Prometheus Pod增加卷istio-certs。
volumes: - emptyDir: medium: Memory name: istio-certs
為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
路徑下。
為Prometheus容器掛載
istio-certs
卷至/etc/prom-certs/
路徑,便于Prometheus從該路徑獲取由Sidecar代理寫入的證書和密鑰。volumeMounts: - mountPath: /etc/prom-certs/ name: istio-certs
在采集配置中指定哪些工作負載使用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
執行以下命令,從GitHub上克隆Prometheus Operator項目的源代碼倉庫到本地計算機。
git clone https://github.com/prometheus-operator/prometheus-operator.git
使用K8s集群的KubeConfig,執行以下命令,安裝Prometheus Operator。
cd prometheus-operator/ kubectl create -f bundle.yaml
執行以下命令,查看Pod狀態。
kubectl get pods
預期輸出:
NAME READY STATUS RESTARTS prometheus-operator-58dd988c9c-qhrrp 2/2 Running 0
預期輸出表明Prometheus Operator已安裝成功。
步驟二:定義Prometheus CR部署Prometheus實例
將以下YAML保存至本地,命名為prometheus.yaml。
YAML包含Prometheus實例聲明及其依賴的相關ServiceAccount、ClusterRole和ClusterRoleBinding。在Deployment配置中,可以看到配置Prometheus實例采集TLS指標說明中提及的相關證書卷掛載的配置。
說明本文提供的Prometheus相關CR僅用于演示,請您根據實際生產環境進行調整。
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
使用K8s集群的KubeConfig,執行以下命令,應用prometheus.yaml到K8s集群。
kubectl apply -f prometheus.yaml
執行以下命令,檢查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聲明采集規則
將以下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
使用K8s集群KubeConfig,執行以下命令,應用service-monitor.yaml到K8s集群。
kubectl apply -f service-monitor.yaml
步驟四:將本地端口映射到Prometheus Operator服務,查看Prometheus采集到的指標
執行以下命令,創建端口轉發,將本地端口9090映射到Prometheus Operator服務的9090端口。
kubectl port-forward svc/prometheus-operated 9090
在瀏覽器輸入
localhost:9090
,打開Prometheus的Web UI。在頂部菜單欄,選擇
,查看監控目標的狀態。說明如果某個目標通過TLS加密,在界面上可能會顯示為“Unavailable”(不可用),這可能是因為配置了TLS但沒有正確設置TLS認證。
如下圖所示,可以看到目標State為Up,表示指標成功被抓取。
在頂部菜單欄,單擊Graph返回查詢頁面,在查詢文本框中輸入
python_gc_objects_collected_total
指標名,單擊右側的Execute。如下圖所示,可以看到上報的指標數據。