官方参考:
如何使用java探针注入器?
配置两个demo,建立调用关系,
首先创建一个基础镜像dockerfile
from centos
先安装java
参考: linux rpm方式安装java
JAVA_HOME=/usr/java/jdk1.8.0-x64
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
vi /etc/profile
source /etc/profile
java -version
需要安装maven,并修改镜像地址为阿里的,方便下载
参考:Linux中maven下载、安装、配置详细教程
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
vim /etc/profile
export MAVEN_HOME=/root/maven/apache-maven-3.8.8
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
source /etc/profile
mvn -version
build the springboot and springcloudgateway image
推送到仓库
harbor/yourharbor/base:v0.0.1
下载这两个demo的代码
$ git clone https://github.com/dashanji/swck-spring-cloud-k8s-demo
$ cd swck-spring-cloud-k8s-demo && make
打成镜像并推送至仓库
使用es作为存储,需要创建storage
参考:Storage Usage
vi storage-swck.yamlapiVersion: operator.skywalking.apache.org/v1alpha1
kind: Storage
metadata:name: swck-storagenamespace: develop
spec:type: elasticsearchconnectType: externaladdress: "http://your-elasticsearch:9200" #ES地址,如果在其它命令空间,需要在域名后面添加命名空间,例如:.develop#security: #user:# secretName: defaultkubectl apply -f storage-swck.yaml
检查安装是否成功
kubectl get storage -n develop
安装证书管理器(cert-manger)
wget https://github.com/jetstack/cert-manager/releases/download/v1.13.3/cert-manager.yaml
kubectl apply -f cert-manager.yaml
检查安装是否成功
kubectl get pod -n cert-manager
安装SWCK operator
mkdir swck & cd swck
wget https://archive.apache.org/dist/skywalking/swck/0.6.1/skywalking-swck-0.6.1-bin.tgz
tar -xvf skywalking-swck-0.6.1-bin.tgz
operator有个镜像需要修改
参考:(问题解决) 缺少gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0
kubectl apply -f /config/operator-bundle.yaml
检查安装是否成功
kubectl get pod -n skywalking-swck-system
部署oap和ui
在 develop 命名空间中部署 OAPServer 组件和 UI 组件。
wget https://raw.githubusercontent.com/apache/skywalking-swck/master/operator/config/samples/default.yaml
cp default.yaml oap-ui-default.xmlvi oap-ui-default.xml
apiVersion: operator.skywalking.apache.org/v1alpha1
kind: OAPServer
metadata:name: defaultnamespace: develop
spec:version: 9.2.0instances: 1image: apache/skywalking-oap-server:9.2.0service:template:type: ClusterIPstorage:name: swck-storage
---
apiVersion: operator.skywalking.apache.org/v1alpha1
kind: UI
metadata:name: defaultnamespace: develop
spec:version: 9.2.0instances: 1image: apache/skywalking-ui:9.2.0OAPServerAddress: http://default-oap:12800service:template:type: NodePortingress:host: demo.ui.skywalking
#yaml中的9.2.0版本不需要修改,
9.5和9.7版本均不能自动生成sw_record索引
(Skywalking is missing the 'sw_records-all' index. #10910);
name: default也要修改,改完之后各种异常
安装
kubectl apply -f oap-ui-default.xmlkubectl get oapserver -n develop
kubectl get ui -n developkubectl get pod -A|grep def
查看oap和ui的日志,看否成功
kibana检查数据是否进入ES
查看SW开头的索引
修改configMap中的oap地址
kubectl edit configmap skywalking-swck-java-agent-configmap -n skywalking-swck-system
改成develop空间的地址,前面已安装到develop空间中了,default-oap.develop:11800
在当前空间中使用这个oap地址,
注意:如果在develop空间中的服务也需要使用这个默认配置,可以在develop空间中修改这个configmap
部署 spring boot 应用
创建 springboot-system 命名空间。
$ kubectl create namespace springboot-system
给 springboot-system 命名空间打上标签使能 java 探针注入器。
$ kubectl label namespace springboot-system swck-injection=enabled
接下来为 spring boot 应用对应的部署文件 springboot.yaml ,其中使用了 annotation 覆盖默认的探针配置,比如 service_name ,将其覆盖为 backend-service 。
[root@yourLinux swck]# vi springboot.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: demo-springbootnamespace: springboot-system
spec:selector:matchLabels:app: demo-springboottemplate:metadata:labels:swck-java-agent-injected: "true" # enable the java agent injectorapp: demo-springbootannotations:strategy.skywalking.apache.org/agent.Overlay: "true" # enable the agent overlayagent.skywalking.apache.org/agent.service_name: "backend-service" # agent.skywalking.apache.org/collector.backend_service: "default-oap.default:11800"spec:containers:- name: springbootimagePullPolicy: IfNotPresentimage: yourharborIP/yourharbor/app:v0.0.1command: ["java"]args: ["-jar","/app.jar"]
---
apiVersion: v1
kind: Service
metadata:name: demonamespace: springboot-system
spec:type: ClusterIPports:- name: 8085-tcpport: 8085protocol: TCPtargetPort: 8085selector:app: demo-springboot
在 springboot-system 命名空间中部署 spring boot 应用。
$ kubectl apply -f springboot.yaml
查看部署情况。
$ kubectl get pod -n springboot-system
通过 JavaAgent 查看最终注入的 java 探针配置。
$ kubectl get javaagent -n springboot-system
部署 spring cloud gateway 应用
创建 gateway-system 命名空间。
$ kubectl create namespace gateway-system
给 gateway-system 命名空间打上标签使能 java 探针注入器。
$ kubectl label namespace gateway-system swck-injection=enabled
kubectl get ns --show-labels
接下来为 spring cloud gateway 应用对应的部署文件 springgateway.yaml ,其中使用了 annotation 覆盖默认的探针配置,比如 service_name ,将其覆盖为 gateway-service 。此外,在使用 spring cloud gateway 时,我们需要在探针配置中添加 spring cloud gateway 插件。
容器中:/sky/agent/optional-plugins/目录下有这个apm(cloud-gateway-3.x)
需要注意的是,在使用 annotation 覆盖探针配置之前,需要增加 strategy.skywalking.apache.org/agent.Overlay: "true" 来使覆盖生效。
[root@yourLinux swck]# cat springgateway.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: demo-gatewayname: demo-gatewaynamespace: gateway-system
spec:selector:matchLabels:app: demo-gatewaytemplate:metadata:labels:swck-java-agent-injected: "true"app: demo-gatewayannotations:strategy.skywalking.apache.org/agent.Overlay: "true"agent.skywalking.apache.org/agent.service_name: "gateway-service" # agent.skywalking.apache.org/collector.backend_service: "default-oap.default:11800"optional.skywalking.apache.org: "cloud-gateway-3.x" # add spring cloud gateway pluginspec:containers:- image: yourharborIP/yourharbor/gateway:v0.0.1name: gatewaycommand: ["java"]args: ["-jar","/gateway.jar"]
---
apiVersion: v1
kind: Service
metadata:name: service-gatewaynamespace: gateway-system
spec:type: ClusterIPports:- name: 9999-tcpport: 9999protocol: TCPtargetPort: 9999selector:app: demo-gateway
在 gateway-system 命名空间中部署 spring cloud gateway 应用。
$ kubectl apply -f springgateway.yaml
查看部署情况。
$ kubectl get pod -n gateway-system
通过 JavaAgent 获取最终注入的java探针配置。
检查javaagent
$ kubectl get javaagent -n gateway-system
查看UI暴露的nodePort
kubectl get service default-ui -n develop
查看gateway地址及端口
kubectl get service service-gateway -n gateway-system
跑几百个请求测试一下
for i in {1..100}; do curl http://yourip:9999/gateway/hello && echo ""; done
打开ui查看
一个服务启动后,通过如下命令可以看到是否探针是否启动成功,oap使用的是哪个
kubectl get javaagent -A
通过describe命令可以观察一下initContainer中,javaagent是如何加到你的app中的
kubectl describe pod -l app=demo-springboot -n springboot-systemkubectl describe pod -l app=demo-gateway -n gateway-system
日志
pom.xml引入依赖:
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
logback.xml添加appender
参考:
kywalking部署之后日志不显示