若是你還不知道 Skywalking agent 是什麼,請點擊這裏查看 Probe 或者這裏查看快速瞭解agent,因爲我這邊大部分都是 JAVA 服務,因此下文以 Java 中使用 agent 爲例,提供瞭如下三種方式供你選擇html
查看官方 docker hub 提供的基礎鏡像,只須要在你構建服務鏡像是 From 這個鏡像便可,直接集成到 Jenkins 中能夠更加方便java
提供這種方式的緣由是:官方的鏡像屬於精簡鏡像,而且是 openjdk ,可能不少命令沒有,須要本身二次安裝,如下是我構建的過程nginx
下載 oracle jdkgit
這個如今 oracle 有點噁心了,wget 各類不行,而後我放棄了,直接從官網下載了github
下載 skywalking 官方發行包,並解壓(以6.3.0爲例)docker
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 構建基礎鏡像shell
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 中。apache
若是大家的服務是部署在 Kubernetes 中,你還可使用這種方式來使用 Skywalking Agent ,這種方式的好處在與不須要修改原來的基礎鏡像,也不用從新構建新的服務鏡像,而是以sidecar 模式,經過共享volume的方式將agent 所需的相關文件掛載到已經存在的服務鏡像中vim
構建 skywalking agent sidecar 鏡像的方法api
下載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
如何使用 sidecar 呢?
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: innerpeacez/sw-agent-sidecar: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 吧,國人的驕傲。