部署方案
根据houyi平台规划,日志归集相关的技术组件都是基于k8s进行部署。
相关部署文件列表如图所示:
对应各个技术组件的部署以最简单的单点方式部署,暂时不考虑高可用性及性能弹性伸缩等非功能需求。
skywalking-oap部署
skywalking-oap主要用于从应用收集服务性能监控信息,并提供接口对UI或第三方提供查询服务。
skywalking-oap-deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: skywalking-oap-deployment
namespace: t-paas
spec:
replicas: 1
selector:
matchLabels:
tier: skywalking-oap
template:
metadata:
labels:
tier: skywalking-oap
spec:
containers:
- name: skywalking-oap-container
image: apache/skywalking-oap-server:6.0.0-GA
imagePullPolicy: IfNotPresent
ports:
- containerPort: 11800
- containerPort: 12800
env:
- name: SW_STORAGE
value: "elasticsearch"
- name: SW_STORAGE_ES_CLUSTER_NODES
value: "elasticsearch-service.t-paas:9200"
由于skywalking 数据需要存储在elasticsearch中,所以需要先部署es。可以参考微服务治理-日志归集-技术选型中ES的部署。
skywalking-oap-service
以CluserIp方式部署service,对外提供11800、12800两个端口:
- 11800端口用于skywalking将应用的服务监控信息收集端口。
- 12800端口用于skywalking对UI提供查询接口。
apiVersion: v1
kind: Service
metadata:
name: sw-service
namespace: t-paas
spec:
ports:
- name: p11800
port: 11800
targetPort: 11800
- name: p12800
port: 12800
targetPort: 12800
selector:
tier: skywalking-oap
skywalking-ui部署
skywalking-ui-deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: skywalking-ui-deployment
namespace: t-paas
spec:
replicas: 1
selector:
matchLabels:
tier: skywalking-ui
template:
metadata:
labels:
tier: skywalking-ui
spec:
containers:
- name: skywalking-ui-container
image: apache/skywalking-ui:6.0.0-GA
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
env:
- name: collector.ribbon.listOfServers
value: "sw-service.t-paas:12800"
- name: collector.ribbon.ReadTimeout
value: "20000"
- name: TZ
value: "Asia/Shanghai"
通过访问skywalking-oap的service名称及12800端口,查询应用性能监控信息,并通过UI展示性能监控界面。
skywalking-ui-service
由于skywalking-ui是web界面,所以在容器外通过端口访问。
所以使用NodePort类型service部署。
apiVersion: v1
kind: Service
metadata:
name: skywalking-ui-service
namespace: t-paas
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
name: sw-ui-port
nodePort: 30081
selector:
tier: skywalking-ui
skywalking-agent部署
上面已经将skywalking的服务端搭建好了,下面主需要在应用中添加skywalking的插件,将应用的性能数据发送给skywalking-oap服务。
通过skywalking的官方文档可以了解,skywalking对应用的影响是松耦合的。不需要对应用做任何修改。
以spring-boot为例,只需要在应用启动时,在参数中添加-javaagent参数就可以了。
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar ${spirng-boot-app}.jar
通过该参数,可以了解到应用镜像中需要包括skywalking-agent相关的jar包及配置文件。
所以本人考虑为skywalking-agent单独生成一个镜像,在应用的deployment中,通过initContainers的方式将skywalking-agent的插件挂载到应用容器中。具体可以查看应用部署的deployment文件。
skywalking-agent镜像生成
以下是生成skywalking-agent镜像的目录:
其中/skywalking-agent目录中的相关信息获取如下:
agent目录说明
agent在server的目录下,插件和配置都包含在包中,请不要改变目录结构
- 配置文件在/config目录中
- 插件全部放置在/plugins目录中.新的插件,也只需要在启动阶段,放在目录中,就自动生效,删除则失效.
- ptional-plugins是可以插件.
修改配置
agent的配置可通过修改配置文件或者添加启动参数配置
vim config/agent.config
- agent.service_name:应用名
- collector.backend_service:server端地址
添加trace-ignore插件
复制optional-plugins里面的apm-trace-ignore-plugin-x.jar到plugins里面
cp optional-plugins/apm-trace-ignore-plugin-6.0.0-GA.jar plugins/
可以通过配置skywalking.trace.ignore_path环境变量去设置忽略的url,多个以,隔开
-Dskywalking.trace.ignore_path=/your/path/1/**,/your/path/2/**
生成skywalking-镜像
在docker环境下执行docker-build.sh脚本
docker build -t skywalking-agent:6.0.0 .
Dockerfile文件如下:
FROM busybox:latest
ADD /agent //agent
应用引入skywalking-agent
app-deployment
- 在应用启动加将skywalking-agent镜像中的/agent目录复制到sky-agent-volume中,
- 再将sky-agent-volume挂载到应用容器的/skywalking路径下。
- 应用容器配置三个环境变量,分别设置:
- 1.ENV_PROFILE -> 应用环境
- 2.SW_AGENT_NAMESPACE -> skywalking代理应用的命名空间。
- 3.SW_AGENT_COLLECTOR_BACKEND_SERVICES -> skywalking-aop的服务主机及端口。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: sc-admin
namespace: default
spec:
replicas: 1
selector:
matchLabels:
tier: sc-admin-server
template:
metadata:
labels:
tier: sc-admin-server
spec:
initContainers:
- name: skywalking-agent-gateway
image: skywalking-agent:6.0.0
command: ["cp", "-rf", "/agent", "/tmp"]
volumeMounts:
- mountPath: /tmp
name: sky-agent-volume
containers:
- name: sc-admin-containers
image: houyi-platform/sc-admin:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6500
env:
- name: ENV_PROFILE
value: dev
- name: SW_AGENT_NAMESPACE
value: houyi-paltform
- name: SW_AGENT_NAME
value: dev_sc-admin
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: sw-service.t-paas:11800
volumeMounts:
- mountPath: /logs
name: tmp
- mountPath: /skywalking
name: sky-agent-volume
volumes:
- name: tmp
hostPath:
path: /D/home/k8s/containers/houyi-platform
- name: sky-agent-volume
emptyDir: {}
其中应用镜像生成的Dockerfile为:
FROM java:8-jre
ENV JAVA_OPTS -javaagent:/skywalking/agent/skywalking-agent.jar -Xms128m -Xmx128m
ADD /zuul-gateway.jar //
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /zuul-gateway.jar --spring.profiles.active=$ENV_PROFILE"]
VOLUME /tmp
从镜像生成的脚本中可以看到应用在启动的时候是如何与skywalking-agent集成在一起的。