虛構 PoP 部署
虛構 PoP (存在點) 是執行虛構測試的代理程式。 您可以在多個位置部署虛構 PoP ,以監視您的應用程式。
架構
虛構 PoP 作為 Kubernetes 叢集裡的一組 Kubernetes Pod 執行,請參閱下列架構。

請參閱下列支援不同虛構測試類型的播放引擎:
- HTTP 播放引擎: 用來執行 API 簡式測試 (類型:
HTTPAction)。 - JavaScript 播放引擎: 用來執行 API Script 測試 (類型:
HTTPScript)。 - BrowserScript 播放引擎: 用來執行 BrowserScript 測試 (類型:
BrowserScript)、網頁簡式測試 (類型:WebpageAction) 及 WebpageScript 測試 (類型:WebpageScript)。
部署選項
虛構 PoP 只能由 Helm 圖表部署。
- 官方 Helm 儲存庫 URL 是 https://agents.instana.io/helm,而圖表名稱是
synthetic-pop。 - Helm Chart Git 儲存庫 URL 是 https://github.com/instana/synthetic-pop-charts。
必要條件
需要在 Kubernetes 叢集裡部署虛構 PoP 。 使用 Helm Chart 來部署 Synthetic PoP,並確保在您的環境中安裝 Kubernetes 及 helm。
- 設定將在其中安裝 PoP 的 Kubernetes 叢集。 Kubernetes 發行套件支援的最低版本為 1.10。 如需相關資訊,請參閱 設定 Kubernetes。
- 安裝 Helm,建議使用 Helm V3 。 如需相關資訊,請參閱 安裝 Helm。
請檢查 Helm Chart 中的下列預設硬體需求,以執行虛構 PoP:
- CPU (vCPU/Core): 3.2 至 5.7
- 記憶體: 2700 MiB 到 4100 MiB
在安裝 Synthetic PoP之前,請確保您在 Kubernetes 叢集的實體資源內至少具有 5.7 核心 CPU 及 4.1 GB 記憶體。 如果您想要安裝 Instana 主機代理程式,以 監視 PoP 或擴增 PoP 以改善 效能,則需要事先在 Kubernetes 叢集裡具有更多可用的實體資源。
安裝
安裝虛構 PoP
使用 helm install 指令來安裝新的虛構 PoP,並傳遞下列值。 建議您在個別名稱空間中安裝 PoP 。
- downloadKey: 用於從
containers.instana.ioDocker 登錄取回映像檔的下載代理程式金鑰。 - controller.location: 格式為
label; displayLabel; country; city; latitude; longitude; description。 此標籤充當 PoP ID ,且只能包含字母、數字、連字號及底線。 - controller.instanaKey:Instana 代理程式金鑰,用於連接至 Instana 後端。
- controller.instanaSyntheticEndpoint: Instana 後端中 Synthetic 接收器的入口端點。
- controller.clusterName: 選擇性地。 當安裝 Instana 代理程式以監視此 PoP時,需要使用要顯示在 Instana 使用者介面中的 Kubernetes 叢集名稱來設定它。
- redis.password:redis 伺服器的鑑別密碼。 請指定長度至少為 10 的密碼。
- redis.tls.enabled: 定義是否啟用 Redis TLS (預設值為 false)。 如果值為
true,則會使用 TLS 來加密與 Redis 的通訊。 - redis.tls.secretName: 如果
redis.tls.enabled欄位的值為true,則需要為 Redis TLS key/cert 檔案指定密鑰名稱。
登入 Instana 使用者介面,按一下 虛構監視,然後按一下 部署 PoP。 複製 downloadKey、 controller.instanaKey 和 controller.instanaSyntheticEndpoint的值。
若要配置安裝,請使用 --set 旗標在指令行中指定值,或使用 -f 旗標向 yaml 檔案提供您的值。
在下列範例中,部署 PoP ,且 Redis 使用密碼進行鑑別。
helm install synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
--create-namespace \
--set downloadKey="yourdownloadkey" \
--set controller.location="MyPoP;My PoP;China;Beijing;39.54;116.23;This is a testing Synthetic Point of Presence" \
--set controller.instanaKey="instanaAgentkey" \
--set controller.instanaSyntheticEndpoint="https://synthetics-green-saas.instana.io" \
--set redis.tls.enabled=false \
--set redis.password="a1fc5d01bcbb" \
synthetic-pop
您也可以提供 values.yaml 以部署 PoP,下面的範例顯示如何取得 values.yaml 範本,然後傳遞已修改的 yaml 檔案以部署 PoP。
helm repo add synthetic-pop-repo https://agents.instana.io/helm
helm repo update
helm pull synthetic-pop-repo/synthetic-pop
tar xzvf synthetic-pop-*.tgz
# Modify the synthetic-pop/values.yaml file
# Run helm install to pass the modified values.yaml
helm install synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
--create-namespace \
-f /path/to/values.yaml \
synthetic-pop
安裝 PoP 之後,請確定每一個 Pod 都處於 Running 及 Ready 狀態。
kubectl get pod -n syn
登入 Instana 使用者介面,按一下 Synthetic _Monitoring > 位置,然後您可以看到您的位置顯示在位置清單中。 如果沒有,請移至 疑難排解 區段,以檢查日誌檔。
安全加強功能
對於正式作業環境中的安全加強功能,建議使用下列配置。
TLS 加密
PoP 控制器及不同的播放引擎透過 Redis 伺服器進行通訊,而 PoP 控制器提供用於性能檢查的端點。 您可以配置 TLS 以透過 Redis TLS 來加密通訊,並透過 HTTP 來加密 PoP 控制器的端點。
若要配置 TLS ,您需要具有 X.509 憑證金鑰組 (tls.crt、 tls.key) 及憑證管理中心 (CA) 主要憑證檔 (ca.crt)。 如果您沒有金鑰和憑證檔,也可以使用 openssl 指令來產生新的金鑰和憑證檔。 請參閱下列範例:
openssl genrsa -out tls.key 4096
openssl req -x509 -new -nodes -sha256 -key tls.key -days 3650 -subj '/O=Instana/CN=Certificate Authority' -out ca.crt
openssl req -new -sha256 -key tls.key -subj '/O=Instana/CN=Server' | openssl x509 -req -sha256 -CA ca.crt -CAkey tls.key -CAserial ca.txt -CAcreateserial -days 3650 -out tls.crt
提供 key/cert 檔案之後,請使用 kubectl 指令來建立密鑰。
# Create a new TLS secret named pop-tls-secret with the given key/cert files
kubectl create secret generic pop-tls-secret -n syn \
--type='kubernetes.io/tls' \
--from-file=ca.crt=path/to/ca.crt \
--from-file=tls.crt=path/to/tls.crt \
--from-file=tls.key=path/to/tls.key
若要部署 PoP 以支援 TLS ,請執行下列指令:
helm install synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
--create-namespace \
--set downloadKey="yourdownloadkey" \
--set controller.location="MyPoP;My PoP;China;Beijing;39.54;116.23;This is a testing Synthetic Point of Presence" \
--set controller.instanaKey="instanaAgentkey" \
--set controller.instanaSyntheticEndpoint="https://synthetics-green-saas.instana.io" \
--set redis.tls.enabled=true \
--set redis.tls.secretName="pop-tls-secret" \
synthetic-pop
安全運算模式
您可以使用安全計算模式 (或 seccomp) 來沙盤推演處理程序的專用權,這會限制從使用者空間到核心的呼叫。 使用下列參數來啟用 RuntimeDefault 作為所有儲存器的預設 seccomp 設定檔。
附註: 預設 seccomp 設定檔僅適用於 Kubernetes 1.19 版或更新版本或 OCP (OpenShift Container Platform) 4.11 版或更新版本。 如果 seccompDefault 不是設為 true for OCP 4.11 或更新版本,則在執行 helm 安裝時,您會看到一些警告訊息。
helm install synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
...
--set seccompDefault=true \
synthetic-pop
網路原則
透過使用 網路原則,您可以指定如何容許 Pod 與網路進行通訊。 若要封鎖從 PoP 到特定 IP 或 IP 範圍的存取,您可以啟用並自訂 playbackEngineNetworkPolicy 參數。 通常,您可以收集下列 IP 位址:
- 雲端提供者 meta 資料服務 IP 位址: 它是
169.254.169.254適用於 AWS meta 資料 API、 Google Cloud meta 資料 API、 Azure meta 資料 API。 - Kubernetes API 伺服器 IP 位址: 使用 kubectl 指令來收集 Kubernetes API 伺服器 IP 位址。 請參閱下列 microk8s 或 minikube Kubernetes 叢集的範例:
# Use the following command to print apiserver endpoint
# For example, if the following command prints "Endpoints: 10.128.0.127:16443", you need to block the IP address 10.128.0.127
kubectl describe service kubernetes
然後,如下修改 helm 圖表中的 values.yaml 檔案,以啟用 Egress 規則來封鎖您收集的 IP 位址。
playbackEngineNetworkPolicy:
# Change the value to true to enable the network policy
enabled: true
egress:
- to:
- ipBlock:
# Allow all IP address v4
cidr: 0.0.0.0/0
except:
# Block Kubernetes API server IP address
- 10.128.0.127/32
# Block cloud provider metadata service IP address
- 169.254.169.254/32
請參閱下列範例,以使用 --set來傳遞網路原則:
# --set-json only be supported since Helm V3.11
helm install synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
...
--set playbackEngineNetworkPolicy.enabled=true \
--set-json 'playbackEngineNetworkPolicy.egress=[{"to":[{"ipBlock":{"cidr":"0.0.0.0/0","except":["10.128.0.127/32","169.254.169.254/32"]}}]}]' \
synthetic-pop
移轉實務範例
若要支援後端移轉實務範例,您可以使用分號指定多個 Synthetic Acceptor 端點及 Instana 代理程式金鑰。 Instana 代理程式金鑰及 Synthetic Acceptor 端點是一對一對應。 在移轉期間,虛構 PoP 可以將資料傳送至舊後端及新後端,以避免關閉時間。
請參閱下列範例:
helm install synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
--set controller.instanaKey="instanaAgentkey;anotherInstanaAgentKey" \
--set controller.instanaSyntheticEndpoint="https://synthetics-green-saas.instana.io;https://synthetics-green-saas.instana.host" \
...
升級
建議您定期將虛構 PoP 升級至最新版本,因為最新版本的虛構 PoP 可能包含新增特性、改進或修正程式。
使用 helm upgrade 指令來更新虛構 PoP。 請參閱下列範例。 您可以視需要變更參數。
helm upgrade synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
--set downloadKey="yourdownloadkey" \
--set controller.location="MyPoP;My PoP;China;Beijing;39.54;116.23;This is a testing Synthetic Point of Presence" \
--set controller.instanaKey="instanaAgentkey" \
--set controller.instanaSyntheticEndpoint="https://synthetics-green-saas.instana.io" \
--set redis.tls.enabled=false \
--set redis.password="a1fc5d01bcbb" \
synthetic-pop
附註:
- location 參數中的
label值是 PoP的 ID ,不容許變更。 建議您視需要變更displayLabel值。 - 不容許更新 redis 密碼。 如果您確實需要變更它,請解除安裝它,然後使用更新的 redis 密碼重新安裝它。
解除安裝
使用 helm uninstall 指令來解除安裝虛構 PoP。
helm uninstall synthetic-pop -n syn
附註: 解除安裝 PoP 之後, PoP的位置仍會顯示在具有 offline 狀態的 Instana 使用者介面中。 您可以重新安裝具有相同位置的 PoP ,讓該位置重新回到線上,或在使用者介面上刪除該位置 (如果不再使用)。
其他配置選項
播放引擎啟用
依預設,會啟用並部署三個播放引擎。 您可以根據需求來停用其中部分。
例如,如果您不需要「瀏覽器」測試,則可以透過傳遞下列參數來停用 BrowserScript 播放引擎,以減少 Synthetic PoP所需的 CPU 及記憶體資源。
--set browserscript.enabled=false
可調整性
目前,只有播放引擎支援水平可調整性,而 PoP Controller 和 Redis 尚不支援水平可調整性。 PoP 工作負載主要是在播放引擎 Pod 上。 因此,如果要在特定類型的測試上支援更多工作量,只要在 values.yaml 檔中增加 replicas 數目即可。
下列範例顯示 JavaScript 播放引擎的抄本數增加到 2 ,而 BrowserScript 播放引擎的抄本數增加到 3。
--set javascript.replicas=2
--set browserscript.replicas=3
功能
controller.capabilities 內容定義 Synthetic PoP的播放功能,包括支援的 Synthetic 測試和 Web 瀏覽器類型。
CustomProperties
controller.customProperties 內容定義此 PoP的自訂標籤或內容。 內容是 key:value 配對的清單,以分號區隔,例如 key1=value1;key2=value2。
使用 API (例如 $env.key1 ) 來存取 API 或瀏覽器 Script 中的自訂內容或標籤。
Proxy
您可以配置虛構 PoP 的 Proxy 伺服器,以連接 Instana 後端伺服器。 支援下列選項。
proxy.popProxyProtocol:Proxy 伺服器所使用的通訊協定。 將值設為http或socks。proxy.popProxyServer:ipaddress:port格式的 Proxy 伺服器位址。proxy.popProxyUserPass: 用來鑑別 Proxy 伺服器的使用者名稱和密碼。 以username:password格式輸入使用者名稱和密碼。
附註: 若要配置虛構 PoP 的 Proxy 伺服器以連接至受監視的服務,您可以使用 $network API 在 API Script 中設定 Proxy 伺服器。
使用外部密碼
如果您不想使用 Helm 圖表來建立金鑰 controller.instanaKey、 redis.password、 proxy.popProxyUserPass及 downloadKey的新密鑰,則可以透過指定密鑰名稱來使用您為 Synthetic PoP 部署建立的現有密鑰,如下所示:
helm install synthetic-pop \
--repo https://agents.instana.io/helm \
--namespace syn \
--set downloadSecret="my-pull-secret" \
--set controller.instanaKeySecret="my-pop-secret" \
--set redis.passwordSecret="my-pop-secret" \
--set proxy.popProxyUserPassSecret="my-pop-secret" \
...
對於金鑰 controller.instanaKey、 redis.password和 proxy.popProxyUserPass,您可以使用相同的密鑰或不同的現有密鑰。 不過,當您建立密鑰時,必須使用指定的索引鍵欄位 instana-key、 redis-password及 proxy-user-pass ,如下所示:
kubectl create secret generic my-pop-secret --namespace <namespace> \
--from-literal=instana-key='<instana agent key>' \
--from-literal=redis-password='<redis password>' \
--from-literal=proxy-user-pass='<proxy username and password>'
附註: 您需要將 <namespace> 取代為您用來安裝虛構 PoP的名稱空間。
downloadKey 金鑰的密碼必須使用 kubernetes.io/dockerconfigjson 類型。 您可以使用 kubernetes.io/dockerconfigjson 類型來建立密鑰,如下所示:
kubectl create secret docker-registry my-pull-secret --namespace <namespace> --docker-server="https://containers.instana.io" --docker-username="_" --docker-password="<downloadKey>"
附註:
- 將 <namespace> 取代為您用來安裝 Synthetic PoP的名稱空間。
- 請勿變更 --docker-username 引數的值。
- 將 <downloadKey> 取代為 Instana 下載金鑰。
監視
您可以使用 Instana 主機代理程式來監視虛構 PoP 。 Instana 主機代理程式使用虛構 PoP 感應器來監視 PoP。
虛構 PoP 感應器
若要監視虛構 PoP,建議您 在 PoP 安裝所在的 Kubernetes 叢集上安裝 Instana 主機代理程式 。
安裝 Instana 主機代理程式之後,會自動安裝 虛構 PoP 感應器 來監視 PoP 。 您可以在 Instana 使用者介面中檢視度量值,並在 Synthetic PoP發生任何性能問題時取得警示。
將 PoP 控制器 Pod 指派給固定節點
當您升級具有多個節點之 Kubernetes 叢集中的虛構 PoP 時, PoP 控制器 Pod 可能會指派給不同於您預期的節點。 如果 PoP 控制器指派給不同的節點,則 PoP entityId 會變更。 因為資料與 POP entityId相關聯,所以 PoP 儀表板中的監視資料遺失。
若要防止此問題,請在升級或安裝虛構 PoP之前,將 PoP 控制器 Pod 指派給已修正節點。
若要將 PoP 控制器指派給固定節點,請完成下列步驟:
執行下列指令,將標籤新增至節點:
kubectl label nodes <yournode> scheduler=synthetic-pop-controller在
helm install或helm upgrade指令中指定下列參數:--set controller.nodeSelector.enabled=true
若要將 PoP 控制器 Pod 指派給固定節點,並從此節點中排除其他 Pod ,請完成下列步驟:
執行下列指令,將污染新增至節點:
kubectl taint nodes <yournode> toleration=synthetic-pop-controller:PreferNoSchedule在
helm install或helm upgrade指令中指定下列參數:--set controller.taintSelector.enabled=true
效能
若要檢查配置給每一個 Pod of Synthetic PoP的 CPU 及記憶體資源數目,請檢查 values.yaml 檔案中每一個 Pod 的 resources 區段中的 requests 及 limits 數目。
如果您對虛構 PoP使用預設 CPU 及記憶體資源配置,則可以使用下列測試配置在效能基準性能測試中執行 2000 個 API 簡式測試、20 個 API Script 及 5 個 BrowserScript 測試:
- API 簡式測試: 測試頻率為 1 分鐘,持續時間大約為 200ms。
- API Script 測試: 測試頻率為 1 分鐘, Script 包含 5 個 HTTP 呼叫,且持續時間總計大約為 800ms。
- BrowserScript 測試: 測試頻率為 5 分鐘, Script 會開啟 2 個網頁,持續時間總計約 20 秒。
若要支援更多工作量,請按如下所示擴增:
- 垂直調整: 增加 CPU 和記憶體的
requests和limits數目。 因為 JavaScript 播放引擎耗用大量 CPU ,您可以增加requests及limitsCPU 數目,以支援更多 API Script 測試。 例如,如果requests及limitsCPU 數目設為 800m 及 1000m (0.8/1.0 Core) ,則前述測試配置可支援 40 個 API Script。 - 水平調整: 提供更簡單的方法來增加不同播放引擎的抄本數目。 如需相關資訊,請參閱 可調整性 一節。
疑難排解
若要檢查 Helm Chart 版本,請執行下列指令:
helm list -n <namespace>
您可以從結果中取得版本號碼,例如 synthetic-pop-<version>。
如果您符合任何問題 (例如,您指定的位置無法顯示在 Instana 虛構使用者介面上) ,請先執行下列指令來檢查 PoP 控制器日誌:
kubectl logs -n <namespace> -f <pop_controller_pod_name>
若要變更每一個元件的追蹤層次,您可以如下所示傳遞 traceLevel 值,以在 PoP上進行升級:
--set controller.traceLevel="DEBUG"
--set http.traceLevel="DEBUG"
--set javascript.traceLevel="DEBUG"
--set browserscript.traceLevel="DEBUG"
您也可以在容器中執行 set_trace_level.sh 指令,以動態變更 PoP 控制器的追蹤層次,而無需重新啟動 Pod。
# enter synthetic-pop-controller container
kubectl exec -it -n <namespace> <pop_controller_pod_name> -- bash
# run set_trace_level.sh command to change trace level to DEBUG
./set_trace_level.sh DEBUG
提供 pdcollect.sh Script ,以將虛構 PoP 的日誌檔收集並包裝成 tar.gz 檔案,並將其傳送至 Instana 支援團隊以取得協助。 您可以在 Instana Helm Charts 目錄中找到 pdcollect.sh Script ,或從 synthetic-pop-charts 儲存庫下載該 Script。 執行下列指令:
# collect PoP logs from a namespace
./pdcollect.sh -n <namespace>