8.1-Skywalking的整体架构及特性
一、为什么需要链路追踪
随着云计算和微服务架构的普及,越来越多的企业开始采用分布式架构开放应用程序。在这种复杂的架构中,应用程序的性能问题变得更加棘手,传统的单机监测工具已经无法满足需求。
二、Skywalking简介
Skywalking 是国内开源的基于字节码注入的调用链分析一级应用监控分析工具。
特点:支持多种插件、UI功能比较强,接入端无代码浸入。目前使用厂商最多,版本更新较快,已成为Apache基金会顶级项目。
Skywalking是一个开源的APM(Application Performance Management)系统,可以帮助开发人员对分布式应用程序进行监控和调优,帮助用户快速定位应用程序中的性能瓶颈和故障点,
官方站点:https://skywalking.apache.org/
Skywalking-Kubernetes:https://github.com/apache/skywalking-kubernetes
三、主要功能
主要功能包括以下几个方面:
- 服务性能监控:对分布式应用程序进行实时性能监控,包括服务响应时间、吞吐量、错误率等指标,帮助用户快速发现性能问题和瓶颈
- 分布式追踪:对分布式应用程序进行追踪,包括跨进程、跨服务、跨线程的追踪,帮助用户了解应用程序的运行情况和性能瓶颈。
- 应用拓扑图:生成应用程序的拓扑图,展示应用程序中哥哥服务之间的依赖关系和调用关系,帮助用户了解应用程序的整体架构和运行情况。
- 告警和通知:根据用户设置的规则进行告警和通知,内置Webhooks发送事件通知,支持通过HTTP、gRPC、Slack等方式。
- 支持多类型应用:Jave、.Net Core、PHP、NodeJS、Golang、LUA、Rust、C++等
- 轻量高效:无需大数据组件,无需大量的硬件资源,且对应用实例的负载销户极低。
- 模块化:UI、存储、集群管理都有多种机制可选
- 开源技术:邮箱的可视化解决方案,社区比较活跃,版本更新较快。
https://skywalking.apache.org/docs/#SkyWalking
四、APM对比
4.1 商业版
- 听云
- 博睿宏远
4.2 开源版
- Pinpoint:韩国团队开源的APM产品,运用字节码增强技术,只需要再启动时增加启动参数即可实现APM功能,对代码无侵入,目前支持Java和PHP语言,底层采用Hbase来存储数据,探针搜集的数据力度非常细,但性能损耗非常大,因其出现的时间较长,完成度也很高,文档也较为丰富,应用的公司较多。
- Zipkin:由Twitter公司开放并开源,基于Java语言实现,侵入性相对于CAT要低一点,需要对web.xml 等相关配置文件进行修改,对系统有一定的侵入性,Zipkin可以轻松与Spring Cloud进行集成,也是SpringCloud推荐的APM系统。
- Jaeger:是Uber推出的一款开源分布式追踪系统,主要使用go语言开发,对业务代码侵入性较少
- SkyWalking:Skywalking是由国内开源爱好者开源并提交到Apeche孵化的开源项目,2017年12月SkyWalking成为Apache国内首个个人服务项目,2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目,目前Skywalking支持Java、.net、NodeJS、Go、Python等探针,数据存储支持MySQL、ElasticSearch等,SkyWalking与Pinpoint相同,对业务代码无侵入,不过探针残疾数据力度相较于Pinpoint来说略粗,但性能表现优秀,目前SkyWalking增长势头强劲,社区活跃,中文文档齐全,SkyWalking支持很多框架,包括很多国产框架,例如,Dubbo、gRPC、SOFARPC等,同时也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入SkyWalking
五、架构原理
SkyWalking在逻辑上分为四个部分:Agent,OAP,Storage和UI
- Agent:在应用中,收集Trace、Log、Metrics等监控数据,使用RPC、RESTfulAPI、Kafka等Transport传输方式,发送给OAP服务。
- OAP:首先Receiver 接收Agent发送的监控数据,然后Aggregator进行聚合计算,之后存储到Storage外部存储器,最终提供给GUI查询数据。
- Storage:存储监控数据,支持Elasticearch、MySQL、TiDB、H2等多种数据库
- 数据展示:Skywalking的Web UI会将分析结果展示给用户,包括应用程序的性能指标、调用链信息、拓扑图等,帮助用户快速定位性能问题和瓶颈。
六、部分功能预览
8.2-基于Helm的Skywalking部署管理
官网:https://github.com/apache/skywalking-helm
一、认识Skywalking 组件
- Skywalking OAP Server:Skywalking OAP Server 是Skywalking分析系统的核心组件之一。
主要负责接收和处理来自Skywalking Agent的数据,并数据存储到后端存储中(如Elasticsearch 或者MySQL)
OAP Server 还会对数据进行预处理、聚合和压缩,一提高数据处理和存储的效率 - Skywalking UI:Skywalking UI是Skywalking分析系统的Web UI.
用户展示应用程序的性能指标、调用链信息、拓扑图等分析结果
用户可以通过Skywalking UI快速定位应用程序中的性能问题和瓶颈 - Skywalking ES Init:Skywalking ES Init 是用于初始化Elasticsearch的工具。
可快速创建Elasticsearch 索引和映射,以便存储和查询Skywalking分析系统的数据 - Elasticsearch:Elasticsearch 是一个开源的分布式搜索和分析引擎,用于存储Skywalking 分析系统的数据
Skywalking OAP Search 会将数据存储到Elasticsearch 中,并通过Elasticsearch 进行数据查询和分析。
二、部署配置
2.1 控制器方式部署
2.1.1 部署ES(集群版)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es
namespace: devops
spec:
serviceName: elasticsearch
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
imagePullSecrets:
- name: harborsecret
initContainers:
- name: increase-vm-max-map
image: busybox:latest
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: busybox:latest
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
ports:
- name: rest
containerPort: 9200
- name: inter
containerPort: 9300
resources:
limits:
cpu: 1000m
requests:
cpu: 1000m
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
env:
- name: cluster.name
value: k8s-logs
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: cluster.initial_master_nodes
value: "es-0,es-1,es-2"
- name: discovery.zen.minimum_master_nodes
value: "2"
- name: discovery.seed_hosts
value: "elasticsearch"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx2048m"
- name: network.host
value: "0.0.0.0"
volumeClaimTemplates:
- metadata:
name: data
labels:
app: elasticsearch
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: nfs-storage
resources:
requests:
storage: 50Gi
---
kind: Service
apiVersion: v1
metadata:
name: elasticsearch
namespace: devops
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node
---
kind: Service
apiVersion: v1
metadata:
name: elasticsearch-client
namespace: devops
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node
2.1.2 部署ES(单机版)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: devops
spec:
replicas: 1
selector:
matchLabels:
app: elasticsearch
serviceName: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- env:
- name: ES_JAVA_OPTS
value: -Xms2048m -Xmx2048m
- name: node.data
value: "true"
- name: node.master
value: "true"
- name: path.data
value: /usr/share/elasticsearch/data
# 自定义集群名
- name: cluster.name
value: es-cluster
# 定义节点名,使用metadata.name名称
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
# 初始化集群时,ES从中选出master节点
- name: cluster.initial_master_nodes
# 对应metadata.name名称加编号,编号从0开始
value: "elasticsearch-0"
- name: discovery.zen.minimum_master_nodes
value: "1"
# 发现节点的地址,discovery.seed_hosts的值应包括所有master候选节点
# 如果discovery.seed_hosts的值是一个域名,且该域名解析到多个IP地址,那么es将处理其所有解析的IP地址。
- name: discovery.seed_hosts
value: "elasticsearch"
name: elasticsearch
image: elasticsearch:7.17.4
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- |
sysctl -w vm.max_map_count=262144
ulimit -l unlimited
ulimit -n 65536
chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data
ports:
- containerPort: 9200
name: 9200tcp2
protocol: TCP
- containerPort: 9300
name: 9300tcp2
protocol: TCP
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "1"
memory: 2Gi
# 设置挂载目录
volumeMounts:
- name: elasticsearch-data
mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
# 对应容器中volumeMounts.name
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: nfs-storage
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: devops
spec:
clusterIP: None
ports:
- name: elasticsearch-in
port: 9300
protocol: TCP
targetPort: 9300
- name: elasticsearch-out
port: 9200
protocol: TCP
targetPort: 9200
selector:
app: elasticsearch
type: ClusterIP
2.1.3 部署RBAC
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: skywalking
name: skywalking-oap
namespace: devops
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: skywalking
namespace: devops
labels:
app: skywalking
rules:
- apiGroups: [""]
resources: ["pods", "endpoints", "services", "nodes"]
verbs: ["get", "watch", "list"]
- apiGroups: ["extensions"]
resources: ["deployments", "replicasets"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: skywalking
namespace: devops
labels:
app: skywalking
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: skywalking
subjects:
- kind: ServiceAccount
name: skywalking-oap
namespace: devops
2.1.4 数据初始化Job
apiVersion: batch/v1
kind: Job
metadata:
name: "skywalking-es-init"
namespace: devops
labels:
app: skywalking-job
spec:
template:
metadata:
name: "skywalking-es-init"
labels:
app: skywalking-job
spec:
serviceAccountName: skywalking-oap
restartPolicy: Never
initContainers:
- name: wait-for-elasticsearch
image: busybox:1.30
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'for i in $(seq 1 60); do nc -z -w3 elasticsearch 9200 && exit 0 || sleep 5; done; exit 1']
containers:
- name: oap
image: skywalking.docker.scarf.sh/apache/skywalking-oap-server:8.9.0
imagePullPolicy: IfNotPresent
env:
- name: JAVA_OPTS
value: "-Xmx2g -Xms2g -Dmode=init"
- name: SW_STORAGE
value: elasticsearch
- name: SW_STORAGE_ES_CLUSTER_NODES
value: "elasticsearch:9200"
volumeMounts:
volumes:
2.1.5 部署OAP
---
apiVersion: v1
kind: Service
metadata:
name: oap-svc
namespace: devops
labels:
app: oap
spec:
type: ClusterIP
ports:
- port: 11800
name: grpc
- port: 12800
name: rest
selector:
app: oap
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: oap
name: oap
namespace: devops
spec:
replicas: 1
selector:
matchLabels:
app: oap
template:
metadata:
labels:
app: oap
spec:
serviceAccountName: skywalking-oap
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
app: "skywalking"
initContainers:
- name: wait-for-elasticsearch
image: busybox:1.30
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'for i in $(seq 1 60); do nc -z -w3 elasticsearch.devops.svc 9200 && exit 0 || sleep 5; done; exit 1']
containers:
- name: oap
image: skywalking.docker.scarf.sh/apache/skywalking-oap-server:8.9.0
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 12800
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
tcpSocket:
port: 12800
initialDelaySeconds: 15
periodSeconds: 20
ports:
- containerPort: 11800
name: grpc
- containerPort: 12800
name: rest
env:
- name: JAVA_OPTS
value: "-Dmode=no-init -Xmx2g -Xms2g"
- name: SW_CLUSTER
value: kubernetes
- name: SW_CLUSTER_K8S_NAMESPACE
value: "default"
- name: SW_CLUSTER_K8S_LABEL
value: "app=skywalking,release=skywalking,component=oap"
# 记录数据
- name: SW_CORE_RECORD_DATA_TTL
value: "2"
# Metrics数据
- name: SW_CORE_METRICS_DATA_TTL
value: "2"
- name: SKYWALKING_COLLECTOR_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: SW_STORAGE
value: elasticsearch
- name: SW_STORAGE_ES_CLUSTER_NODES
value: "elasticsearch.devops.svc:9200"
2.1.6 部署UI
---
apiVersion: v1
kind: Service
metadata:
labels:
app: ui
name: ui-svc
namespace: devops
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
protocol: TCP
selector:
app: ui
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
namespace: devops
labels:
app: ui
spec:
replicas: 1
selector:
matchLabels:
app: ui
template:
metadata:
labels:
app: ui
spec:
affinity:
containers:
- name: ui
image: skywalking.docker.scarf.sh/apache/skywalking-ui:8.9.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: page
env:
- name: SW_OAP_ADDRESS
value: http://oap-svc:12800 #根据oap的svc一致
2.1.7 部署Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: devops
name: skywalking-ingress
spec:
ingressClassName: nginx
rules:
- host: skywalking.ikubernetesi.cloud
http:
paths:
- pathType: Prefix
backend:
service:
name: ui-svc
port:
number: 8080
path: /
2.2 Helm方式部署
设置环境变量
# 配置安装helm软件的名称
export SKYWALKING_RELEASE_NAME=skywalking
# 配置skywalking安装到k8s的命名空间
export SKYWALKING_RELEASE_NAMESPACE=devops
# 配置helm仓库名称
export REPO=skywalking
helm 添加仓库
helm repo add ${REPO} https://apache.jfrog.io/artifactory/skywalking-helm
下载Skywalking 安装包
helm pull ${REPO}/skywalking --untar
修改values.yaml
elasticsearch:
...
config:
host: elasticsearch.devops.svc
password:
port:
http: 9200
user:
enabled: false
...
oap:
antiAffinity: soft
dynamicConfigEnabled: false
env: null
envoy:
als:
enabled: false
image:
pullPolicy: IfNotPresent
repository: skywalking.docker.scarf.sh/apache/skywalking-oap-server
tag: 8.9.0
....
ui:
image:
pullPolicy: IfNotPresent
repository: skywalking.docker.scarf.sh/apache/skywalking-ui
tag: 8.9.0
部署升级
# 安装部署
helm install skywalking skywalking -n devops --values ./skywalking/values.yaml
# 更新
$ helm upgrade skywalking skywalking -n devops --values ./skywalking/values.yaml
# 卸载
helm uninstall skywalking -ndevops
创建基于Helm方式的Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: devops
name: skywalking-ingress
spec:
ingressClassName: nginx
rules:
- host: skywalking.ikubernetesi.cloud
http:
paths:
- pathType: Prefix
backend:
service:
name: skywalking-ui
port:
number: 8080
path: /
3、用于Skywalking ui访问控制的secret
Skywalking 的ui界面默认没有访问控制,可以通过基于Nginx Ingress的basic auth方案,实现自定义服务的外部验证
注意:创建secret之前通过htpasswd工具生成的记录用户名密码的文件的名称必须为auth,不然访问报错503
## 生成auth
htpasswd -c auth admin
New password:
Re-type new password:
Adding password for user admin
## 基于auth创建secret
kubectl -n devops create secret generic ui-auth --from-file=auth
secret/ui-auth created
## 重新配置ingress路由
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: devops
name: skywalking-ingress
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: ui-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - admin'
spec:
ingressClassName: nginx
rules:
- host: skywalking.ikubernetesi.cloud
http:
paths:
- pathType: Prefix
backend:
service:
name: skywalking-ui
port:
number: 8080
path: /
4、总结
基于Kubernetes的SkyWalking 部署方式总结如下:
- 弹性伸缩:Kubernetes 是一个流行的容器编排平台,它提供自动伸缩的能力。当负载增加时,可以通过调整副本数量来自动扩展SkyWalking服务实例,以适应更大的监控要求
- 故障恢复:Kubernetes 提供高可用性和故障恢复机制。如果某个SkyWalking服务实例出现故障或崩溃,Kubernrtes能自动重启该实例或将其替换为新实例,从而确保监控服务的连续性。
- 资源管理:Kubernetes 具有强大的资源管理功能。通过配置资源限制和请求,可以为SkyWalking 分配适当的计算资源(如CPU何内存),以满足监控服务的性能要求。同时,Kubernetes还支持资源配额和优先级设置,以确保Skywalking应用程序在共享的集群环境中获得公平的资源分配
- 安装和部署建行:Kubernetes提供了简介的部署和管理方式。使用Kubernetes部署SkyWalking,可以通过声明性的配置文件及比较成熟的Helm方式部署,使用Kubernetes资源对象(如:Deployment、Service、Ingress等)来管理应用的声明周期。提高了可维护性和可重复性
- 与微服务集成:Kubernetes 与微服务架构天生契合。SkyWalking作为一个分布式追踪和监控系统,可以无缝地与Kubernetes中的微服务应用程序集成。它能够自动发现和跟踪各个微服务之间的调用关系,提供全面的分布式追踪和性能监控
总的来说:基于Kubernetes 的SkyWalking 部署方式充分利用了Kubernetes的弹性伸缩、故障恢复、资源管理和简化部署等优势。
这种部署方式使SkyWalking 能更好地适应动态的监控需求,并与微服务架构进门集成,提高效率、可靠的分布式追踪和监控能力。
标签:8.1,8.2,name,app,elasticsearch,Skywalking,skywalking,metadata From: https://www.cnblogs.com/pythonlx/p/17924401.html