如果你还不知道 Skywalking agent 是什么, 请点击这里查看 Probe 或者 这里查看快速了解agent ,由于我这边大部分都是 JAVA 服务,所以下文以 Java 中使用 agent 为例,提供了以下三种方式供你选择
查看官方 docker hub 提供的 基础镜像 ,只需要在你构建服务镜像是 From 这个镜像即可,直接集成到 Jenkins 中可以更加方便
提供这种方式的原因是:官方的镜像属于精简镜像,并且是 openjdk ,可能很多命令没有,需要自己二次安装,以下是我构建的过程
这个现在 oracle 有点恶心了,wget 各种不行,然后我放弃了,直接从 官网 下载了
下载 skywalking 官方发行包 ,并解压(以6.3.0为例)
wget https://www.apache.org/dyn/closer.cgi/skywalking/6.3.0/apache-skywalking-apm-6.3.0.tar.gz && tar -zxvf apache-skywalking-apm-6.3.0.tar.gz
通过以下 dockerfile 构建基础镜像
FROM alpine:3.8 ENV LANG=C.UTF-8 RUN set -eux && / apk update && apk upgrade && / wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub &&/ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-2.30-r0.apk &&/ apk --no-cache add unzip vim curl git bash ca-certificates glibc-2.30-r0.apk file && / rm -rf /var/lib/apk/* &&/ mkdir -p /usr/skywalking/agent/ # A streamlined jre ADD jdk1.8.0_221/ /usr/java/jdk1.8.0_221/ ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/ # set env ENV JAVA_HOME /usr/java/jdk1.8.0_221 ENV PATH ${PATH}:${JAVA_HOME}/bin # run container with base path:/ WORKDIR / CMD bash
这里由于 alpine 是基于mini lib 的,但是 java 需要 glibc ,所以加入了 glibc 相关的东西,最后构建出的镜像大小在 490M 左右,应为加了挺多命令还是有点大,仅供参考,同样构建出的镜像也可以直接配置到 jenkins 中。
如果你们的服务是部署在 Kubernetes 中,你还可以使用这种方式来使用 Skywalking Agent ,这种方式的好处在与不需要修改原来的基础镜像,也不用重新构建新的服务镜像,而是以sidecar 模式,通过共享volume的方式将agent 所需的相关文件挂载到已经存在的服务镜像中
下载skywalking 官方发行包 ,并解压
wget https://www.apache.org/dyn/closer.cgi/skywalking/6.3.0/apache-skywalking-apm-6.3.0.tar.gz && tar -zxvf apache-skywalking-apm-6.3.0.tar.gz
通过以下 dockerfile 进行构建
FROM busybox:latest ENV LANG=C.UTF-8 RUN set -eux && mkdir -p /usr/skywalking/agent/ ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/ WORKDIR /
注意:这里我没有在dockerfile中下载skywalking 发行包是因为保证构建出的 sidecar 镜像保持最小,bosybox 只有700 k左右,加上 agent 最后大小小于20M
apiVersion: apps/v1 kind: Deployment metadata: labels: name: demo-sw name: demo-sw spec: replicas: 1 selector: matchLabels: name: demo-sw template: metadata: labels: name: demo-sw spec: initContainers: - image: registry-hz.rubikstack.com/library/sidecar-sw:latest name: sw-agent-sidecar imagePullPolicy: IfNotPresent command: ['sh'] args: ['-c','mkdir -p /skywalking/agent && cp -r /usr/skywalking/agent/* /skywalking/agent'] volumeMounts: - mountPath: /skywalking/agent name: sw-agent containers: - image: nginx:1.7.9 name: nginx volumeMounts: - mountPath: /usr/skywalking/agent name: sw-agent ports: - containerPort: 80 volumes: - name: sw-agent emptyDir: {}
以上是挂载 sidecar 的 deployment.yaml 文件,以nginx 作为服务为例,主要是通过共享 volume 的方式挂载 agent,首先 initContainers 通过 sw-agent 卷挂载了 sw-agent-sidecar 中的 /skywalking/agent ,并且将上面构建好的镜像中的 agent 目录 cp 到了 /skywalking/agent 目录,完成之后 nginx 启动时也挂载了 sw-agent 卷,并将其挂载到了容器的 /usr/skywalking/agent 目录,这样就完成了共享过程。
这样除去 ServiceMesh 以外,我能想到的方式就介绍完了,希望可以帮助到你。最后给 Skywalking 一个 Star 吧 ,国人的骄傲。