Kubernetes APM Kubernetes μ΄μ μ μμ΄μ νΈ Kubernetes APM μ°μ°μλ‘ μλ €μ§ μλ Kubernetes μ°κ²°μ μμ΄μ νΈ λ°°ν¬μ ν¨κ» λ°°ν¬λ₯Ό μλννμ¬ νκ²½μ λν νμ€ν μ΅μ λ²λΉλ¦¬ν°λ₯Ό κ°μνν©λλ€. μλ μΈ‘μ μ νμ±ννλ©΄ κ°λ°μλ λ μ΄μ APM μμ΄μ νΈλ₯Ό μλμΌλ‘ κ΄λ¦¬ν νμκ° μμ΅λλ€. Kubernetes APM μλ μ°κ²°μ APM μμ΄μ νΈλ₯Ό μλμΌλ‘ μ€μΉ, μ κ·Έλ μ΄λ λ° μ κ±°ν©λλ€.
νμ¬ Java, .NET, Node.jsλ₯Ό μ§μν©λλ€ . νμ΄μ¬, 루λΉ, PHP.
μλ μ리
μ€μΉ μ
MutatingWebHookλ λ Έλμ ꡬννλ€, λ°°ν¬νλ€ νλμ λν API μμ²μ κ°λ‘μ±λ λ° κ΄μ¬νκ² λ©λλ€.μ§μ λ μ€μ μ λ°μνμ¬ νλ μ¬μμ λ³κ²½νμ¬ NR init컨ν μ€νΈ λ° νκ²½ λ³μλ₯Ό μΆκ°ν©λλ€.
νλ μ€λ¦½ μ΄ν, λ΄λ λ¦ APM μμ΄μ νΈλ κ·Έ μμ μμ©λ κΈ°λ₯μ μννκ² ν΅ν©λ©λλ€.

μμνκΈ° μ μ
μ€νΌλ μ΄ν°λ₯Ό μ€μΉνκΈ° μ μ λ€μ μ¬νμ νμΈνμμμ€.
Helm: μ°¨νΈλ₯Ό μ¬μ©νκΈ° μν΄μλ λ°λμ μ€μΉν΄μΌ ν©λλ€. μμνλ λ° λμμ΄ νμνλ©΄ Helm λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ.
Kubectl: ν΄λ¬μ€ν°μ ν΅μ νλλ‘ κ΅¬μ±ν΄μΌ ν©λλ€.
μ€μΉ
μꡬ μ¬νμ λ°λΌ Kubernetes APM μλ μ°κ²°μ Kubernetes ν΅ν©κ³Ό ν¨κ» λλ λ 립μ μΌλ‘ μ€μΉν μ μμ΅λλ€.
μ 체 νμ€ν μ΅μ λ²λΉλ¦¬ν° κ²½νμ νμ©νλ €λ©΄ ν΅ν©κ³Ό ν¨κ» μ€μΉνλ κ²μ΄ μ’μ΅λλ€.Kubernetes
Kubernetes ν΅ν©μ μΆκ°λ‘ λ²λ€ μ€μΉ(κΆμ₯)
Kubernetes APM μλ μ°κ²° μ°¨νΈλ nri-bundle μ°¨νΈμ μΌλΆλ‘, μ 체 Kubernetes μ΅μ λ²λΉλ¦¬ν°λ₯Ό νμ±ννλ λ° νμν λͺ¨λ κ΅¬μ± μμμ μ€μΉλ₯Ό κ΄λ¦¬ν©λλ€.
k8s-agents-operator.enabled=true νλΌλ―Έν°λ₯Ό helm λͺ
λ Ήμ μΆκ°νκ±°λ values.yaml νμΌμ ν¬ν¨νμΈμ. Helm μ¬μ©μ λν μμΈν λ΄μ©μ Kubernetes ν΅ν© μ€μΉ νμ΄μ§λ₯Ό μ°Έμ‘°νκ±°λ nri-bundle μ°¨νΈλ₯Ό νμΈνμΈμ.
μμλ₯Ό μ¬μ©νμ¬ Helm λͺ λ Ή μνμ νμΈνμΈμ.
$helm repo add newrelic https://helm-charts.newrelic.com$
$helm upgrade --install newrelic-bundle newrelic/nri-bundle \> --set global.licenseKey=YOUR_NEW_RELIC_INGEST_LICENSE_KEY \> --set global.cluster=CLUSTER_NAME \> --namespace=newrelic \> --set newrelic-infrastructure.privileged=true \> --set global.lowDataMode=true \> --set kube-state-metrics.enabled=true \> --set kubeEvents.enabled=true \> --set k8s-agents-operator.enabled=true \> --create-namespaceλ 립ν μ€μΉ
κΈ°λ³Έ μ€μ μΌλ‘ Kubernetes APM μλ μ°κ²°μ μ€μΉνλ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.
$helm repo add k8s-agents-operator https://newrelic.github.io/k8s-agents-operator$helm upgrade --install k8s-agents-operator k8s-agents-operator/k8s-agents-operator \> --namespace newrelic \> --create-namespace \> --set licenseKey=YOUR_NEW_RELIC_INGEST_LICENSE_KEYμ€μ μ΅μ μ μ 체 λͺ©λ‘μ λ³΄λ €λ©΄ README μ°¨νΈλ₯Ό μ°Έμ‘°νμΈμ.
μλ κ³μΈ‘ ꡬμ±
ν΄λ¬μ€ν°μ APM μλ μ°κ²°μ΄ λͺ¨λ μ€μ λλ©΄ λ€μ λ¨κ³λ μ΄λ₯Ό μλμν€λ λ° νμν ꡬμ±μ λ‘€μμνλ κ²μ λλ€. μ¬κΈ°μλ ν΄λ¬μ€ν°μμ μ΅μν νλμ κ³μΈ‘ μ¬μ©μ μ μ 리μμ€(CR)κ° νμ±νλμ΄ μμ΄μΌ ν©λλ€.
κ³μΈ‘ CRμ μ¬μ©νλ©΄ λ€μμ λ§€νν μ μμ΅λλ€.
- κ³μΈ‘κΈ° μ΄λ¦ CR
- μΈ‘μ κ°μ μ μ©ν μμΉλ
selectorsμ¬μ©νλ CRμ λλ€. - APM μμ΄μ νΈ(CRλΉ νλ)
- APM μμ΄μ νΈ λ²μ
- APM config μν, (env vars)
- λΌμ΄μ μ€ ν€ (μ ν μ¬ν)
λ€μ λͺ λ Ήμ μ€ννμ¬ κ³μΈ‘ CRμ μ€μΉν©λλ€.
$kubectl apply -f ./instrumentation.yamlμ¬κΈ°μλ μ°Έκ³ ν μ μλ μμ ν μΈ‘μ , ν΅κ³.yamlμ΄ μμ΅λλ€.
μ νκΈ°λ₯Ό μ¬μ©νλ λ°©λ²
μ νκΈ°λ₯Ό μ¬μ©νμ¬ CRμ΄ APM μμ΄μ νΈμ μ£Όμ
νλ 리μμ€λ₯Ό μ μ΄ν©λλ€. μΈ κ°μ§ μ νκΈ°λ₯Ό μ¬μ©ν μ μμ΅λλ€. κ°λ³μ μΌλ‘ λλ μ‘°ν©ν΄μ μ¬μ©ν μ μμ΅λλ€. μ νμλ κ²°ν©λ λ λ
Όλ¦¬μ AND(&&) μ°μ°μ μ¬μ©νμ¬ νκ°λ©λλ€.
MatchLabel λ° MatchExpressions
λͺ¨λ μ νμλ matchLabel λ° matchExpressions μ§μν©λλ€.
APM μμ΄μ νΈ
κ³μΈ‘ CR λ΄μμ APM μμ΄μ νΈμ ν΄λΉ λ²μ μ μ§μ ν΄μΌ ν©λλ€. μ¬μ© κ°λ₯ν μ΅μ κΈ°λ₯μ μ΅λν νμ©νλ €λ©΄ μ΅μ λ²μ μ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
μΈμ΄ | μμ | μ¬μ© κ°λ₯ν λ²μ |
|---|---|---|
λ·λ· |
| |
dotnet-windows2022 |
| |
dotnet-windows2025 |
| |
μλ° |
| |
λ Έλμ μ΄μμ€ |
| |
νμ΄μ¬ |
| |
λ£¨λΉ |
| |
νν |
|
μ΄ μλ₯Ό 보μΈμ:
...spec: agent: language: dotnet image: newrelic/newrelic-dotnet-init:latest...APM μ€μ
νκ²½ λ³μ μ¬μ©
λ‘κ·Έ CRμ APM μμ΄μ νΈμ μ€μ μ κ°μννκΈ° μν΄ ν¨λμ νκ²½ λ³μλ₯Ό μ£Όμ νλ κΈ°λ₯μ μ 곡ν©λλ€. μ΄ μλ₯Ό 보μΈμ:
...spec: agent: env: # Example overriding the appName configuration by using a label of the pod - name: NEW_RELIC_APP_NAME valueFrom: fieldRef: fieldPath: metadata.labels['app.kubernetes.io/name']...μμ μμμλ νκ²½ λ³μλ₯Ό μ¬μ©νμ¬ μμ΄μ νΈ μ€μ μ μ μμ μΌλ‘ ꡬμ±νλ λ°©λ²μ 보μ¬λ립λλ€. μ¬μ© κ°λ₯ν μ€μ μ΅μ μ κ° μμ΄μ νΈμ μ€μ λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ.
μ€μ
μ΄λ¬ν νκ²½ λ³μλ μ± λ°°ν¬ λ§€λνμ€νΈμ μ½μ ν μ μμ΅λλ€.
configmap μ¬μ©(μλ°λ§ ν΄λΉ)
Configmapμ μ¬μ©ν λ λ€μ μꡬ μ¬νμ μ°Έκ³ νμΈμ.
- ν€λ³΄λ μ€μ μ
newrelic.yamlμ΄λΌλ ν€μ μ μ₯λμ΄μΌ ν©λλ€. configmapμ μ ν리μΌμ΄μ μ΄λ¦μ΄λ λΌμ΄μ μ€ ν€λ₯Ό μ€μ νλ κ²μ μ§μλμ§ μμ΅λλ€.- μ΄λ¬ν μμ±μ μ€μ νλ €λ©΄ λμ νκ²½ λ³μλ μ¬μ©μ μ μ λΉλ°λ²νΈλ₯Ό μ¬μ©νμΈμ.
apiVersion: newrelic.com/v1beta2kind: Instrumentationmetadata: name: newrelic-instrumentation-java namespace: newrelicspec: agentConfigMap: "my-java-app-config" # This configmap must exist in every namespace that the pod in this `Instrumentation` is targeting agent: ...λΌμ΄μ μ€ ν€ (μ ν μ¬ν)
μ€μΉνλ©΄ μ΄ μμ±λκ³ μ΄κ²μ΄ κΈ°λ³Έ λΌμ΄μΌμ€μ λλ€. APM ν λ λ©νΈλ¦¬λ₯Ό λ€λ₯Έ κ³μ μΌλ‘ 보λ΄μΌ νλ κ²½μ° λ€μ λ¨κ³λ₯Ό λ°λ₯΄μΈμ.
μ λΌμ΄μ μ€ ν€κ° ν¬ν¨λ λΉλ°μ μμ±νλ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.
bash$kubectl create secret generic newrelic-key-secret \>--namespace my-monitored-namespace \>--from-literal=new_relic_license_key=YOUR_NEW_RELIC_INGEST_LICENSE_KEYκ³μΈ‘ CRμμ λΉλ°μ μ°Έμ‘°νλ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.
...spec:licenseKeySecret: the-name-of-the-custom-secret...
κ³μΈ‘ CR μμ
ν
ν΄λ¬μ€ν°μμ λͺ
μμ μΈ λ μ§μ€νΈλ¦¬ μ λμ¬(μ: CRI-O)κ° νμν 컨ν
μ΄λ λ°νμμ μ¬μ©νλ κ²½μ° μ΄λ―Έμ§ κ²½λ‘ μμ docker.io/ μΆκ°νμμμ€. μλ₯Ό λ€λ©΄: image: docker.io/newrelic/newrelic-java-init:latest.
μ ν리μΌμ΄μ μμ APM κ³μΈ‘ μ λ°μ΄νΈ
κΈ°λ³Έμ μΌλ‘ Kubernetes APM μλ μ°κ²°μ ν΄λΉ APM μμ΄μ νΈ μ μ΅μ μ¬μ© κ°λ₯ν λ²μ μ μλμΌλ‘ μ€μΉν©λλ€.
μ ν리μΌμ΄μ λͺ¨λν°λ§μ΄ μμλλ©΄ μ¬μ©μκ° μ λ°μ΄νΈλ₯Ό μ ννμ§ μλ ν μλμΌλ‘ μλ‘μ΄ λ²μ μΌλ‘ μ λ°μ΄νΈλμ§ μμ΅λλ€. νλλ₯Ό μ¬λ°°ν¬νκ±°λ λ°°ν¬λ₯Ό λ€μ μμνμ¬ κΈ°λ₯μ μ λ°μ΄νΈν μ μμ΅λλ€.
μ ν리μΌμ΄μ μμ APM κ³μΈ‘ μ κ±°
μ ν리μΌμ΄μ
μμ APM κ³μΈ‘μ μ κ±°νλ €λ©΄ μ¬μ©λ podLabelSelector λλ namespaceLabelSelector λ΄λΆμ μΌμΉνλ λ μ΄λΈ μ νκΈ°λ₯Ό λ³κ²½νκ±°λ κ³μΈ‘ CRμ μμ ν΄μΌ ν©λλ€. κ·Έλ° λ€μ λ°°ν¬λ₯Ό λ€μ μμν©λλ€. μ κ±° κ³Όμ μ λͺ μ΄ λ°μ κ±Έλ¦¬μ§ μμ΅λλ€.
Kubernetes APM μλ μ°κ²° μ λ°μ΄νΈ
λ²λ€ μ€μΉ
λ€μ λͺ¨λ² μ¬λ‘λ₯Ό μ¬μ©νμ¬ nri-bundle μ°¨νΈ μ
λ°μ΄νΈλ₯Ό μ€νν©λλ€.
$k8s-agents-operator.enabled=trueλ 립ν μ€μΉ
Kubernetes APM μλ μ°κ²°μ μ΅μ λ²μ μΌλ‘ μ
λ°μ΄νΈνλ €λ©΄ helm upgrade λͺ
λ Ήμ μ€ννμΈμ.
$helm upgrade k8s-agents-operator newrelic/k8s-agents-operator -n newrelicKubernetes APM μλ μ°κ²° μ κ±°
λ²λ€ μ€μΉ
nri-bundle μ°¨νΈλ₯Ό μ κ±°νκ±°λ Kubernetes APM μλ μ°κ²°λ§ μ κ±°νλ €λ©΄ λ€μ λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμ¬ helm μ
κ·Έλ μ΄λλ₯Ό μ€νν©λλ€.
$k8s-agents-operator.enabled=falseλ 립ν μ€μΉ
Kubernetes APM μλ μ°κ²°μ μ κ±°νκ³ μμ νλ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.
$helm uninstall k8s-agents-operator -n newrelicλ°μ΄ν° μ°ΎκΈ° λ° μ¬μ©
APM μμ½ νμ΄μ§λ₯Ό μ΄μ©νμ¬ μΈμ¬μ΄νΈλ₯Ό νμΈνκ³ κ³΅μ§μ¬νμ ν΄κ²°νμΈμ.
Kubernetes μμ½ νμ΄μ§λ₯Ό νμΈνμΈμ. μ΄λ λͺ¨λν°μ λ§₯λ½μμ Kubernetes μΈμ¬μ΄νΈλ₯Ό μ 곡ν©λλ€.
μΈμ¦μ
Kubernetes APM μλ μ°κ²°μ μνλ κ²½μ° cert-manager μ§μν μ μμ΅λλ€.
cert-managerHelm μ°¨νΈλ₯Ό μ€μΉνλ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.bash$helm install cert-manager jetstack/cert-manager \>--namespace cert-manager \>--create-namespace \>--set crds.enabled=truevalues.yamlνμΌμμadmissionWebhooks.autoGenerateCert.enabled: falseλ°admissionWebhooks.certManager.enabled: trueμ€μ ν©λλ€. κ·Έλ° λ€μ νμμ²λΌ μ°¨νΈλ₯Ό μ€μΉν©λλ€.
μ¬μ© κ°λ₯ν μ°¨νΈ λ¦΄λ¦¬μ€
μ¬μ© κ°λ₯ν μ°¨νΈλ₯Ό λ³΄λ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.
$helm search repo k8s-agents-operatorμμ£Ό 묻λ μ§λ¬Έ
λ¬Έμ μ ν΄κ²°
λ‘κ·Έκ° ν¬ν¨λμ§ μμ κ²½μ° λ€μμ νμΈν΄μΌ ν©λλ€.
Kubernetes APM μλ μ°κ²°μ μ€μΉν νμλ λ°λμ μ¬λ°°ν¬νκ±°λ ꡬννκ³ , μλ‘μ΄ κΈ°λ₯μ ꡬννμΈμ. ν΄λ¬μ€ν°μμλ μλ κ³μΈ‘λ μλ‘μ΄ κΈ°λ₯λ§ κ΅¬ννλ€, λ°°ν¬νλ€λΌλ μ μ μ μνμΈμ.
μ±μ λ€μμ€νμ΄μ€μ λΉλ°μ΄ μ€μΉλμλμ§ νμΈνλ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.
bash$kubectl get secrets -n NAMESPACEpodLabelSelectorμ¬μ©ν λ CRμ ν΅ν μλ μμ€ν μ νμ±ννλ λ° νμν λ μ΄λΈμ΄ νλμ μλμ§ νμΈνμΈμ. λ§μ°¬κ°μ§λ‘ CR λ΄λΆμμnamespaceLabelSelectorμ¬μ©ν λ λ€μμ€νμ΄μ€μ νμν λ μ΄λΈμ΄ μλμ§ νμΈνμΈμ.bash$kubectl get pod POD_NAME -n NAMESPACE -o jsonpath='{.metadata.annotations}'APM μλ μ°κ²° ν¨λμμ λ‘κ·Έλ₯Ό κ°μ Έμ€λ €λ©΄ λ€μ λͺ λ Ήμ μ€ννμΈμ.
bash$kubectl logs AGENT_OPERATOR_POD -n newrelicμ΄ λͺ λ Ήμ μ€ννμ¬
init컨ν μ΄λκ° μ½μ λκ³ νΉμ νλ λ΄λΆμμ μ±κ³΅μ μΌλ‘ μ€νλμλμ§ νμΈνμΈμ.bash$kubectl describe pod POD_NAME -n NAMESPACE
μ£Όμμ΄ νμν μ΄μ λ²μ μμ λ§μ΄κ·Έλ μ΄μ νλ λ°©λ²
λ²μ 0.14λΆν°, μ곑μ μλ κ³μΈ‘νκΈ° μν΄ λ μ΄μ μ곑 λ°°ν¬ λ§€λνμ€νΈ λ΄μ μ£Όμμ΄ νμνμ§ μμ΅λλ€.
0.14 μ΄μ λ²μ μ λͺ¨λ μ κ±°νκ³ μ΅μ λ¦΄λ¦¬μ€ λ²μ μ μ€μΉνλ κ²μ΄ μ’μ΅λλ€. κ³μΈ‘ CR λ΄μ λ μ΄λΈ μ νκΈ°λ₯Ό νμ©νλ©΄ APM μμ΄μ νΈλ₯Ό μ ννκ² λ°°ν¬ν μ μμΌλ―λ‘ μ£Όμμ΄ νμνμ§ μμ΅λλ€.
μ§μνλ€
Kubernetes APM μλ μ°κ²°μ νμ€ APM μμ΄μ νΈ μ§μ μ μ± μ λ°λΌ λ€μ μΈμ΄μ ν΄λΉ μΈμ΄μ μ΅μ μ§μ λ²μ μ μ§μν©λλ€.
- μλ° μμ΄μ νΈ: 8.12
- .NET μμ΄μ νΈ: 10.25
- λ£¨λΉ μμ΄μ νΈ: 9.10
- Node.js μμ΄μ νΈ: 11.9
- νμ΄μ¬: 9.10
- PHP: 11.12
λ¬Έμ κ° μλ κ²½μ°:
λΉμ·ν λ¬Έμ κ° μλμ§ GitHubμ λ¬Έμ μΉμ μ κ²ν νκ±°λ μ λ¬Έμ λ₯Ό μ¬λ κ²μ κ³ λ €ν΄ λ³΄μΈμ.
λ΄λ λ¦ μ§μν μ μ°λ½νμ¬ λμμ λ°μΌμ€ μ μμ΅λλ€.