In this example, you will learn how to use the java agent injector.
The java agent injector is a component of the operator, so you need to follow Operator installation instrument to install the operator firstly.
Let's take a demo deployment for example.
# demo1.yaml apiVersion: apps/v1 kind: Deployment metadata: name: demo1 namespace: default spec: selector: matchLabels: app: demo1 template: metadata: labels: app: demo1 spec: containers: - name: demo1 image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1 command: ["java"] args: ["-jar","/app.jar"] ports: - containerPort: 8085 readinessProbe: httpGet: path: /hello port: 8085 initialDelaySeconds: 3 periodSeconds: 3 failureThreshold: 10
Firstly, set the injection label in your namespace as below.
kubectl label namespace default(your namespace) swck-injection=enabled
Secondly, set the injection label for your target Deployment/StatefulSet.
kubectl -n default patch deployment demo1 --patch '{ "spec": { "template": { "metadata": { "labels": { "swck-java-agent-injected": "true" } } } } }'
Then the pods create by the Deployments/StatefulSets would be recreated with agent injected.
The injected pods would be like this:
spec: containers: - args: - -jar - /app.jar command: - java env: - name: JAVA_TOOL_OPTIONS value: -javaagent:/sky/agent/skywalking-agent.jar image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1 name: demo1 - mountPath: /sky/agent name: sky-agent initContainers: - args: - -c - mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent command: - sh image: apache/skywalking-java-agent:8.10.0-java8 name: inject-skywalking-agent volumeMounts: - mountPath: /sky/agent name: sky-agent volumes: - emptyDir: {} name: sky-agent
Then you can get the final agent configuration and the pod as below.
$ kubectl get javaagent NAME PODSELECTOR SERVICENAME BACKENDSERVICE app-demo1-javaagent app=demo1 demo1 127.0.0.1:11800 $ kubectl get pod -l app=demo1(the podSelector) NAME READY STATUS RESTARTS AGE demo1-5fbb6fcd98-cq5ws 1/1 Running 0 54s
Get the javaagent's yaml for more datails.
$ kubectl get javaagent app-demo1-javaagent -o yaml apiVersion: operator.skywalking.apache.org/v1alpha1 kind: JavaAgent metadata: creationTimestamp: "2022-08-16T12:09:34Z" generation: 1 name: app-demo1-javaagent namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: demo1-7fdffc7b95 uid: 417c413f-0cc0-41f9-b6eb-0192eb8c8622 resourceVersion: "25067" uid: 1cdab012-784c-4efb-b5d2-c032eb2fb22a spec: backendService: 127.0.0.1:11800 podSelector: app=demo1 serviceName: Your_ApplicationName status: creationTime: "2022-08-16T12:09:34Z" expectedInjectiedNum: 1 lastUpdateTime: "2022-08-16T12:10:04Z" realInjectedNum: 1
Suppose that injection label had been set for Namespace and Deployments/StatefulSets as previous said.
Apply SwAgent CR with correct label selector and container matcher:
# SwAgent.yaml apiVersion: operator.skywalking.apache.org/v1alpha1 kind: SwAgent metadata: name: swagent-demo namespace: default spec: containerMatcher: '' selector: javaSidecar: name: swagent-demo image: apache/skywalking-java-agent:8.16.0-java8 env: - name: "SW_LOGGING_LEVEL" value: "DEBUG" - name: "SW_AGENT_COLLECTOR_BACKEND_SERVICES" value: "skywalking-system-oap:11800" sharedVolumeName: "sky-agent-demo" optionalPlugins: - "webflux" - "cloud-gateway-2.1.x"
kubectl -n default apply swagent.yaml
You can also get SwAgent CR by:
kubectl -n default get SwAgent NAME AGE swagent-demo 38s
Now the pod is still the old one, because pod could not load the SwAgent config automatically.
So you need to recreate pod to load SwAgent config. For the pods created by Deployment/StatefulSet, you can just simply delete the old pod.
# verify pods to be delete kubectl -n default get pods -l app=demo1 # delete pods kubectl -n default delete pods -l app=demo1
After the pods recreated, we can get injected pod as below.
kubectl -n default get pods -l app=demo1
spec: containers: - args: - -jar - /app.jar command: - java env: - name: JAVA_TOOL_OPTIONS value: -javaagent:/sky/agent/skywalking-agent.jar=agent.service_name=demo1,collector.backend_service=skywalking-system-oap.skywalking-system:11800 - name: SW_LOGGING_LEVEL value: DEBUG - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES value: skywalking-system-oap.default.svc:11800 image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1 name: demo1 - mountPath: /sky/agent name: sky-agent-demo initContainers: - args: - -c - mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent && cd /sky/agent/optional-plugins/ && ls | grep -E "webflux|cloud-gateway-2.1.x" | xargs -i cp {} /sky/agent/plugins/ command: - sh image: apache/skywalking-java-agent:8.16.0-java8 name: swagent-demo volumeMounts: - mountPath: /sky/agent name: sky-agent-demo volumes: - emptyDir: {} name: sky-agent-demo
Suppose that injection label had been set for Namespace and Deployments/StatefulSets as previous said.
Then add agent configuration and sidecar configuration to annotations as below.
# demo1_anno.yaml apiVersion: apps/v1 kind: Deployment metadata: name: demo1 namespace: default spec: selector: matchLabels: app: demo1 template: metadata: annotations: strategy.skywalking.apache.org/inject.Container: "demo1" agent.skywalking.apache.org/agent.service_name: "app" agent.skywalking.apache.org/agent.sample_n_per_3_secs: "6" agent.skywalking.apache.org/agent.class_cache_mode: "MEMORY" agent.skywalking.apache.org/agent.ignore_suffix: "'jpg,.jpeg'" plugins.skywalking.apache.org/plugin.mount: "'plugins,activations'" plugins.skywalking.apache.org/plugin.mongodb.trace_param: "true" plugins.skywalking.apache.org/plugin.influxdb.trace_influxql: "false" optional.skywalking.apache.org: "trace|webflux|cloud-gateway-2.1.x" optional-reporter.skywalking.apache.org: "kafka" labels: swck-java-agent-injected: "true" app: demo1 spec: containers: - name: demo1 image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1 command: ["java"] args: ["-jar","/app.jar"] ports: - containerPort: 8085 readinessProbe: httpGet: path: /hello port: 8085 initialDelaySeconds: 3 periodSeconds: 3 failureThreshold: 10
Then we can get injected pod as below:
kubectl -n default get pods -l app=demo1
spec: containers: - image: nginx:1.16.1 imagePullPolicy: IfNotPresent name: nginx - args: - -jar - /app.jar command: - java env: - name: JAVA_TOOL_OPTIONS value: -javaagent:/sky/agent/skywalking-agent.jar=agent.ignore_suffix='jpg,.jpeg',agent.service_name=app,agent.class_cache_mode=MEMORY,agent.sample_n_per_3_secs=6,plugin.mongodb.trace_param=true,plugin.influxdb.trace_influxql=false,plugin.mount='plugins,activations' image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1 name: demo1 ports: - containerPort: 8085 protocol: TCP readinessProbe: failureThreshold: 10 httpGet: path: /hello port: 8085 scheme: HTTP initialDelaySeconds: 3 periodSeconds: 3 successThreshold: 1 timeoutSeconds: 1 volumeMounts: - mountPath: /sky/agent name: sky-agent initContainers: - args: - -c - mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent && cd /sky/agent/optional-plugins/ && ls | grep -E "trace|webflux|cloud-gateway-2.1.x" | xargs -i cp {} /sky/agent/plugins/ && cd /sky/agent/optional-reporter-plugins/ && ls | grep -E "kafka" | xargs -i cp {} /sky/agent/plugins/ command: - sh image: apache/skywalking-java-agent:8.16.0-java8 name: inject-skywalking-agent volumeMounts: - mountPath: /sky/agent name: sky-agent volumes: - emptyDir: {} name: sky-agent
Then you can get the final agent configuration and the pod as below.
$ kubectl get javaagent NAME PODSELECTOR SERVICENAME BACKENDSERVICE app-demo1-javaagent app=demo1 app 127.0.0.1:11800 $ kubectl get pod -l app=demo1(the podSelector) NAME READY STATUS RESTARTS AGE demo1-d48b96467-p7zrv 1/1 Running 0 5m25s
Get the javaagent's yaml for more datails.
$ kubectl get javaagent app-demo1-javaagent -o yaml apiVersion: operator.skywalking.apache.org/v1alpha1 kind: JavaAgent metadata: creationTimestamp: "2022-08-16T12:18:53Z" generation: 1 name: app-demo1-javaagent namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: demo1-d48b96467 uid: 2b7f1ac4-b459-41cd-8568-ecd4578ca457 resourceVersion: "26187" uid: c2b2f3e2-9442-4465-9423-d24249b2c53b spec: agentConfiguration: agent.class_cache_mode: MEMORY agent.ignore_suffix: '''jpg,.jpeg''' agent.sample_n_per_3_secs: "6" agent.service_name: app optional-plugin: trace|webflux|cloud-gateway-2.1.x optional-reporter-plugin: kafka plugin.influxdb.trace_influxql: "false" plugin.mongodb.trace_param: "true" plugin.mount: '''plugins,activations''' backendService: 127.0.0.1:11800 podSelector: app=demo1 serviceName: app status: creationTime: "2022-08-16T12:18:53Z" expectedInjectiedNum: 1 lastUpdateTime: "2022-08-16T12:19:18Z" realInjectedNum: 1