背景
前阵子调研了ELK+skywalking的集成,后面公司老大说要将服务放入k8s,喊我继续去调研下如何进k8s.
ELK + skywalking & k8s 搭建
之前的文章:
linux 环境 & 应用服务 docker 化 & skywalking Agent 接入
sidecar 模式
sidecar 模式是k8s 中pod的一种模式,是指在一个pod里放入一个辅助镜像和一个应用镜像,这个辅助镜像是帮助应用镜像完成某个功能的,我觉得可以简单的理解成 插件镜像。
K8s(Kubernetes)Sidecar 模式是一种在容器化应用中常用的设计模式,以下是对其的详细介绍:
概念与原理
- 定义:Sidecar 模式是指在一个 Pod 中运行多个容器,其中一个是主容器(应用容器),负责主要业务逻辑,其他容器作为 Sidecar 容器,与主容器协同工作,为其提供辅助功能,如日志收集、监控、代理等。
- 原理:Kubernetes 中的 Pod 是一组紧密相关的容器的集合,它们共享网络命名空间、存储卷等资源。Sidecar 容器与主容器在同一个 Pod 中,能够方便地通过本地网络进行通信,并且可以共享存储卷来实现数据交互。
应用场景
- 日志收集:主容器产生的日志可以通过共享存储卷或本地网络发送给 Sidecar 容器,Sidecar 容器负责将日志发送到集中式日志管理系统,如 Elasticsearch 和 Kibana 组合。
- 监控与指标采集:Sidecar 容器可以收集主容器的性能指标,如 CPU 使用率、内存使用率等,并将这些指标发送到监控系统,如 Prometheus。
- 服务代理:当主容器需要访问外部服务时,Sidecar 容器可以作为代理,对请求进行拦截、处理和转发,实现服务发现、负载均衡、认证授权等功能。
- 配置管理:Sidecar 容器可以从配置中心获取配置信息,并将其注入到主容器中,实现主容器的动态配置更新。
优势
- 提高可维护性和可扩展性:将辅助功能分离到 Sidecar 容器中,使得主容器的业务逻辑更加清晰,易于维护和扩展。
- 增强容器的复用性:Sidecar 容器可以被多个不同的主容器共享,提高了容器的复用性。
- 提高资源利用率:多个容器共享同一个 Pod 的资源,相比于每个功能都独立部署一个 Pod,能够更有效地利用资源。
将应用服务集成skywalking agent 放入k8s里运行
准备dockerfile & 构建镜像
下文中的服务jar包和oap地址要自己调整。
FROM openjdk:8u262-jre
WORKDIR /app
COPY fang.jar /app/fang.jar
ENV JAVA_OPTS="-javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=fang -Dskywalking.collector.backend_service=192.168.7.111:11800"
EXPOSE 8092
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app/fang.jar"]
docker build -f fang-sidecar-dockerfile -t fang:2.0 .
部署 deployment
在k8s集群中的master上运行
apiVersion: apps/v1
kind: Deployment
metadata:
name: fang-java-app-with-skywalking
labels:
app: fang-java-app
version: v1
spec:
replicas: 1 # 指定Pod的副本数
selector:
matchLabels:
app: fang-java-app
template:
metadata:
labels:
app: fang-java-app
spec:
volumes:
- name: skywalking-agent-volume # 定义一个共享卷,用于存放SkyWalking-agent文件
emptyDir: {} # 使用emptyDir类型的卷,生命周期与Pod相同
initContainers:
- name: init-skywalking-agent # 定义一个initContainer
image: apache/skywalking-java-agent:8.13.0-java8 # 使用包含SkyWalking-agent的Docker镜像
volumeMounts:
- name: skywalking-agent-volume # 将共享卷挂载到initContainer中
mountPath: /opt/skywalking/agent # 指定挂载路径
command: ["sh", "-c", "mkdir -p /opt/skywalking/agent && cp -r /skywalking/agent/* /opt/skywalking/agent/"] # 复制SkyWalking-agent文件到挂载路径
containers:
- name: fang # 定义主容器
image: fang:2.0 # 使用包含Java应用的Docker镜像
imagePullPolicy: IfNotPresent # 先用本地的,如果没有再去拉取
volumeMounts:
- name: skywalking-agent-volume # 将共享卷挂载到主容器中
mountPath: /skywalking/agent # 指定挂载路径,与initContainer相同
ports:
- containerPort: 8092 # Java应用监听的端口
---
apiVersion: v1
kind: Service
metadata:
name: fang-service
spec:
selector:
app: fang-java-app # 要和上面pod定义的selector一致。
ports:
- name: http
port: 8092
nodePort: 30001
type: NodePort
kubectl apply -f fang-sidecar-deployment.yaml
查看pods和svc
验证结果
对fang这个服务发起请求,查看日志
再去skywalking-ui里看
可以看到被正确收集到了。
总结
将应用程序和skywalking agent用sidecar模式进行了启动,并且完成了上报监听。