在服務網格啟用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僅用於示範,請您根據實際生產環境進行調整。
使用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。如下圖所示,可以看到上報的指標資料。