使用 Elastic 技术栈构建 Kubernetes 全栈监控(完结)

网友投稿 842 2022-10-14

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

使用 Elastic 技术栈构建 Kubernetes 全栈监控(完结)

接使用 Elastic 技术栈构建 Kubernetes 全栈监控,使用 Elastic 技术栈构建 Kubernetes 全栈监控(二)

七、Elastic APM

Elastic APM 是 Elastic Stack 上用于应用性能监控的工具,它允许我们通过收集传入请求、数据库查询、缓存调用等方式来实时监控应用性能。这可以让我们更加轻松快速定位性能问题。

Elastic APM 是兼容 OpenTracing 的,所以我们可以使用大量现有的库来跟踪应用程序性能。

比如我们可以在一个分布式环境(微服务架构)中跟踪一个请求,并轻松找到可能潜在的性能瓶颈。

Elastic APM 通过一个名为 APM-Server 的组件提供服务,用于收集并向 ElasticSearch 以及和应用一起运行的 agent 程序发送追踪数据。

7.1  安装 APM-Server

首先我们需要在 Kubernetes 集群上安装 APM-Server 来收集 agent 的追踪数据,并转发给 ElasticSearch,这里同样我们使用一个 ConfigMap 来配置:

# apm.configmap.yml---apiVersion: v1kind: ConfigMapmetadata:  namespace: elastic  name: apm-server-config  labels:    app: apm-serverdata:  apm-server.yml: |-    apm-server:      host: "0.0.0.0:8200"    output.elasticsearch:      hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']      username: ${ELASTICSEARCH_USERNAME}      password: ${ELASTICSEARCH_PASSWORD}    setup.kibana:      host: '${KIBANA_HOST:kibana}:${KIBANA_PORT:5601}'---

APM-Server 需要暴露 8200 端口来让 agent 转发他们的追踪数据,新建一个对应的 Service 对象即可:

# apm.service.yml---apiVersion: v1kind: Servicemetadata:  namespace: elastic  name: apm-server  labels:    app: apm-serverspec:  ports:  - port: 8200    name: apm-server  selector:    app: apm-server---

然后使用一个 Deployment 资源对象管理即可:

# apm.deployment.yml---apiVersion: apps/v1kind: Deploymentmetadata:  namespace: elastic  name: apm-server  labels:    app: apm-serverspec:  replicas: 1  selector:    matchLabels:      app: apm-server  template:    metadata:      labels:        app: apm-server    spec:      containers:      - name: apm-server        image: docker.elastic.co/apm/apm-server:7.8.0        env:        - name: ELASTICSEARCH_HOST          value: elasticsearch-client.elastic.svc.cluster.local        - name: ELASTICSEARCH_PORT          value: "9200"        - name: ELASTICSEARCH_USERNAME          value: elastic        - name: ELASTICSEARCH_PASSWORD          valueFrom:            secretKeyRef:              name: elasticsearch-pw-elastic              key: password        - name: KIBANA_HOST          value: kibana.elastic.svc.cluster.local        - name: KIBANA_PORT          value: "5601"        ports:        - containerPort: 8200          name: apm-server        volumeMounts:        - name: config          mountPath: /usr/share/apm-server/apm-server.yml          readOnly: true          subPath: apm-server.yml      volumes:      - name: config        configMap:          name: apm-server-config---

直接部署上面的几个资源对象:

$ kubectl apply -f apm.configmap.yml \                 -f apm.service.yml \                 -f apm.deployment.ymlconfigmap/apm-server-config createdservice/apm-server createddeployment.extensions/apm-server created

当 Pod 处于 Running 状态证明运行成功:

$ kubectl get pods -n elastic -l app=apm-serverNAME READY STATUS RESTARTS AGEapm-server-667bfc5cff-zj8nq 1/1 Running 0 12m

接下来我们可以在第一节中部署的 Spring-Boot 应用上安装一个 agent 应用。

7.2  配置 Java Agent

接下来我们在示例应用程序 spring-boot-simple 上配置一个 Elastic APM Java agent。首先我们需要把 elastic-apm-agent-1.8.0.jar 这个 jar 包程序内置到应用容器中去,在构建镜像的 Dockerfile 文件中添加一行如下所示的命令直接下载该 JAR 包即可:

RUN wget -O /apm-agent.jar https://search.maven.org/remotecontent?filepath=co/elastic/apm/elastic-apm-agent/1.8.0/elastic-apm-agent-1.8.0.jar

完整的 Dockerfile 文件如下所示:

FROM openjdk:8-jdk-alpineENV ELASTIC_APM_VERSION "1.8.0"RUN wget -O /apm-agent.jar https://search.maven.org/remotecontent?filepath=co/elastic/apm/elastic-apm-agent/$ELASTIC_APM_VERSION/elastic-apm-agent-$ELASTIC_APM_VERSION.jarCOPY target/spring-boot-simple.jar /app.jarCMD java -jar /app.jar

然后需要在示例应用中添加上如下依赖关系,这样我们就可以集成 open-tracing 的依赖库或者使用 Elastic APM API 手动检测。

    co.elastic.apm    apm-agent-api    ${elastic-apm.version}    co.elastic.apm    apm-opentracing    ${elastic-apm.version}    io.opentracing.contrib    opentracing-spring-cloud-mongo-starter    ${opentracing-spring-cloud.version}

然后需要修改第一篇文章中使用 Deployment 部署的 Spring-Boot 应用,需要开启 Java agent 并且要连接到 APM-Server。

# spring-boot-simple.deployment.yml---apiVersion: apps/v1kind: Deploymentmetadata:  namespace: elastic  name: spring-boot-simple  labels:    app: spring-boot-simplespec:  selector:    matchLabels:      app: spring-boot-simple  template:    metadata:      labels:        app: spring-boot-simple    spec:      containers:      - image: cnych/spring-boot-simple:0.0.1-SNAPSHOT        imagePullPolicy: Always        name: spring-boot-simple        command:          - "java"          - "-javaagent:/apm-agent.jar"          - "-Delastic.apm.active=$(ELASTIC_APM_ACTIVE)"          - "-Delastic.apm.server_urls=$(ELASTIC_APM_SERVER)"          - "-Delastic.apm.service_name=spring-boot-simple"          - "-jar"          - "app.jar"        env:          - name: SPRING_DATA_MONGODB_HOST            value: mongo          - name: ELASTIC_APM_ACTIVE            value: "true"          - name: ELASTIC_APM_SERVER            value: http://apm-server.elastic.svc.cluster.local:8200        ports:        - containerPort: 8080---

然后重新部署上面的示例应用:

$ kubectl apply -f spring-boot-simple.yml$ kubectl get pods -n elastic -l app=spring-boot-simpleNAME READY STATUS RESTARTS AGEspring-boot-simple-fb5564885-tf68d 1/1 Running 0 5m11s$ kubectl get svc -n elastic -l app=spring-boot-simpleNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEspring-boot-simple NodePort 10.109.55.134 8080:31847/TCP 9d

当示例应用重新部署完成后,执行如下几个请求:

get messages

获取所有发布的 messages 数据:

$ curl -X GET http://k8s.qikqiak.com:31847/message

get messages (慢请求)

使用 sleep= 来模拟慢请求:

$ curl -X GET http://k8s.qikqiak.com:31847/message?sleep=3000

get messages (error)

使用 error=true 来触发一异常:

$ curl -X GET http://k8s.qikqiak.com:31847/message?error=true

现在我们去到 Kibana 页面中路由到 APM 页面,我们应该就可以看到 spring-boot-simple 应用的数据了。

可以查看现在的错误数据:

还可以查看 JVM 的监控数据:

除此之外,我们还可以添加报警信息,就可以在第一时间掌握应用的性能状况了。

八、总结

到这里我们就完成了使用 Elastic Stack 进行 Kubernetes 环境的全栈监控,通过监控指标、日志、性能追踪来了解我们的应用各方面运行情况,加快我们排查和解决各种问题。

9.0  问题排错

关于kibana调取secret密码时,登入kibana内查看密码变量发现变量是一个乱码值,这个目前只在变量挂入kibana容器中发现。

解决办法:将容器变量调用设置成密码

es 自动生成索引时,使用索引模板,生成默认tag 过多,可以通过修改索引模板的方法来进行减少索引建立

出处:http://dwz.date/cxPg

上一篇:CNCF 官方大使张磊:Kubernetes 是一个“数据库”吗?
下一篇:Linux运维工程师前景
相关文章

 发表评论

暂时没有评论,来抢沙发吧~