[TOC] # 江苏电力全链路观测项目实施手册 ## 基础设施 ### 部署nginx ingress controller(如有跳过) - 使用helm chart`/deploy/ingress-nginx`安装 ```bash helm install ingress-nginx . -n ingress-nginx ``` - 如80、443端口不可用,修改`contorller.hostPort` - 修改`controller.ingressResource.enable/default`为true - 如`node`很多,将`controller.kind`改为deployment ,并设置nodeSelector,不然ingress解析不到 ### 部署openebs storage provisioner(如有跳过) ```bash kubectl apply -f deploy/openebs/openebs-operator.yaml ``` ## 数据存储 ### 部署clickhouse - 使用`deploy/clickhouse` - 修改`global.storageClass` - 修改`shard`和`replica` - 修改`auth.username`, `auth.password` - 开启`ingress` - 修改`persistence.storangeClass: openebs-hostpath` ```bash helm install clickhouse . -n obse部署nginx ingress controller(如有跳过)部署nginx ingress controller(如有跳过)部署nginx ingress controller(如有跳过)rve --create-namespace ``` ### 部署tempo - 使用`deploy/tempo` - 开启`otel receiver` ```yaml otlp: protocols: grpc: endpoint: "0.0.0.0:4317" http: endpoint: "0.0.0.0:4318" ``` - 配置`metrics_generator_processors` ```yaml metrics_generator_processors: - 'service-graphs' - 'span-metrics' max_search_bytes_per_trace: 0 ``` - 配置`tempo.metricGenerator`, 指向部署的`prometheus` ```yaml metricsGenerator: enabled: true remoteWriteUrl: "http://prometheus-server.observe.svc.cluster.local:80/api/v1/write" ``` - 配置存储方式 ```yaml persistence: enabled: true storageClassName: openebs-hostpath ``` - 执行部署 ``` helm install tempo . -n observe ``` ### MySQL-(数字化门户) ## 数据收集 ### prometheus - 使用`deploy/prometheus` - 修改`persistentVolume.storageClass` - 执行部署 ```yaml helm install prometheus . -n observe ``` ### opentelemetry-collector - 确定部署`mode` - 配置`exportor` ```yaml otlp: endpoint: "tempo.observe.svc.cluster.local:4317" tls: insecure: true prometheus: endpoint: "0.0.0.0:8889" #namespace: default clickhouse: endpoint: "tcp://clickhouse-headless.observe.svc.cluster.local:9000?dial_timeout=10s&compress=lz4" database: otel username: default password: "cecf@cestong.com" ttl_days: 10 #logs_table: otel_logs #traces_table: otel_traces #metrics_table: otel_metrics timeout: 5s retry_on_failure: enabled: true initial_interval: 5s max_interval: 30s max_elapsed_time: 300s ``` - 开启`otel receiver` ```yaml otlp: protocols: grpc: endpoint: ${MY_POD_IP}:4317 http: endpoint: ${MY_POD_IP}:4318 ``` - 配置`pipeline`,把`otel`收到的`trace`输出至`clickhouse`和`tempo ( otel )` - 配置`pipeline`,把`otel`收到的`metrics`输出至`clickhouse`和`prometheus` - 配置`podAnnotations`,让`prometheus`自动来采集收集到的`metrics` ```yaml podAnnotations: prometheus.io/scrape: "true" prometheus.io/path: /metrics prometheus.io/port: "8889" ``` - 执行部署 ```bash helm install otel-collector . -n observe ``` ## 数字化门户-数据清洗程序 ### 部署流程 1. 部署mysql - git地址:https://git.cestong.com.cn/cecf/cluster-config 所有配置已经修改好,直接部署即可 ```bash cd mysql helm -n observe install mysql . ``` **注意** 当前配置使用的是NodePort向外暴露端口,端口固定为**30306**,客户环境可能需要更换,更换位置如下 ```txt # values.yaml文件 477行 476 nodePorts: 477 mysql: "30306" ``` 2. 初始化sql ```bash # 获取mysql root密码 MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace observe mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d) # 进入到同一个命名空间的mysql客户端的pod中 kubectl run mysql-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:5.7.42-debian-11-r27 --namespace observe --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash # 登录mysql mysql -h mysql.observe.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD" # 选择数据库 use otel; # 执行sql语句 ``` 3. 部署数据清洗程序 - git地址: https://git.cestong.com.cn/cecf/datacleaner - 镜像地址: registry.cestong.com:8150/cecf/digit_portal_handler - 部署方式 ```bash kubectl -n observe apply -f cronjob.yaml ``` **注意** *要修改cronjob.yaml中 mysql 和 clickhouse 的用户及权限* ## 数据可视化展示 ### grafana - 修改`ingress`,配置对应的域名 - 配置`persistence.storageClassName` - 设置`adminPassword` - 执行部署 ```bash helm install grafana . -n observe ``` - 安装`clickhouse`插件 - 设置`tempo`, `prometheus`, `clickhouse`数据源 - 导入`dashboard` ### observe-front/ui - 更改front/ui中的域名 - 编译打包 - 执行部署`deploy/obui` ```yaml kubectl apply -f deployment-front.yaml kubectl apply -f deployment.yaml kubectl apply -f ingress_rewrite.yaml kubectl apply -f ingress.yaml kubectl apply -f svc-front.yaml kubectl apply -f svc.yaml ``` ## 测试验证 ### 部署opentelemetry-demo - 配置`OTEL_COLLECTOR_NAME`指向部署的`opentelemetry-collector` - 执行部署 ```bash helm install otel-demo . -n observe ``` ### 验证效果 ## 真实流量接入 ### 配置java agent - 在目标监控程序中增加Java参数 - '-javaagent:/sidecar/agent/opentelemetry-javaagent.jar' - '-Dotel.resource.attributes=service.name=item-svc' - '-Dotel.traces.exporter=otlp' - '-Dotel.metrics.exporter=otlp' ## 访问控制 ### 创建ingress - grafana 的ingress 已经创建 - obui/obfront的ingress由`deploy/obui`下的配置文件生成 ### 配置域名 - 对于`ingress-nginx`绑定的主机ip, 将域名绑定到这些ip ## 资源估算 | 服务 | CPU | Mem | 存储 | | -------------- | ---- | ---- | ---- | | clickhouse | 4 | 8 | 200G | | tempo | 4 | 8 | 200G | | otel-collector | 3 | 6 | 0 | | prometheus | 2 | 4 | 100G | | grafana | 2 | 4 | 30G | | obui/front | 2 | 2 | 0 | | otel-demo | 4 | 8 | 0 | | 总计 | 21核 | 40G | 530G | ## 资源实际使用 | 服务 | CPU | Mem | 存储 | | -------------------- | -------- | ---- | ---- | | clickhouse | 4 | 8 | 200G | | clickhouse-zookeeper | 0.25/0.5 | | | | tempo | 4 | 8 | 200G | | otel-collector | 3 | 6 | 0 | | prometheus | 2 | 4 | 100G | | grafana | 2 | 4 | 30G | | obui/front | 2 | 2 | 0 | | otel-demo | 4 | 8 | 0 | | 总计 | 21核 | 40G | 530G | 租户名称: observe ### 问题 - [x] docker hub的地址,push - [x] ingress class和storageclass名称 - [ ] 域名转发到ingress上,ingress创建不了 - [ ] prometheus `mustFromJson`