主要思路是将配置好的agent打成镜像,通过k8s的初始化容器initContainers将agent目录挂载到所运行的pod中去,在pod中的容器就能访问到agent目录,从而实现接入探针,收集数据。
1、在skywalking的agent目录的同级目录下编写dockerfile用于把agent探针打包成镜像,可以单独建一个目录来放agent和dockerfile,看起来比较清晰。Dockerfile内容如下:
FROM busybox:latest
COPY ./agent/ /skywalking/agent/
这里是以busybox为基础镜像将agent打包成镜像。没有busybox的可以先docker pull busybox
拉取基础镜像。
运行dockerfile,将agent打成镜像:
docker build -t reg.harbor.com/skw/skywalking-agent:6.4.0 .
将镜像push到你的镜像仓库(dockerhub、harbor等)中供k8s拉取:
docker push reg.harbor.com/skw/skywalking-agent:6.4.0
2、修改SpringBoot程序dockerfile和kubernetes的yml文件。
修改每个应用的dockerfile的endtypoint。(不要把路径搞混)
ENTRYPOINT [“java”, “-javaagent:/opt/agent/skywalking-agent.jar”, “-jar”, “/usr/app/demoApplication.jar”]
这里-javaagent的路径要和kubernetes的yml文件挂载的路径一定要搞清楚。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: demo-app-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: demo-app
spec:
initContainers:
- name: skywalking-agent
image: reg.harbor.com/skw/skywalking-agent:latest
command: ['cp','-rf','/skywalking/agent','/tmp']
volumeMounts:
- mountPath: /tmp
name: skw-agent-volume
containers:
- name: demo-app
image: reg.harbor.com/demos/demo-app:test
ports:
- containerPort: 8001
env:
- name: TZ
value: Asia/Shanghai
volumeMounts:
- mountPath: /opt
name: skw-agent-volume
imagePullSecrets:
- name: demo-app-secret
volumes:
- name: skw-agent-volume
emptyDir: {}
上面的k8s的deployment的配置中挂载了一个name为skw-agent-volume
的volumes空目录,悉k8s的都知道pod内的容器都能共享这个volumes目录。
这里定义了一个name为skywalking-agent
的初始化容器initContainers
,他的任务就是拉取agent镜像,把该镜像内/skywalking/agent
目录拷贝到/tmp
内,/tmp
目录内就有了agent。
通过volumeMounts
把skw-agent-volume
挂载到初始化容器的的/tmp
目录下。demo-app容器把skw-agent-volume
挂载到/opt
目录下。
这时skw-agent-volume
目录中就共享了/opt
目录和/tmp
目录中的所有内容。
上面修改的dockerfile的执行参数-javaagent:/opt/agent/skywalking-agent.jar
,在demo-app容器内,就能访问到/opt/agent/skywalking-agent.jar
拿到探针。
执行:
kubectl apply -f demo-app-deployment.yml
正常执行的话,打开skywalking的UI就能看到有数据了。
向服务发一次请求,在拓扑图里能看到应用的拓扑图。