经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
skywalking容器化部署docker镜像构建k8s从测试到可用
来源:jb51  时间:2022/3/1 11:38:59  对本文有异议

前言碎语

skywalking是个非常不错的apm产品,但是在使用过程中有个非常蛋疼的问题,在基于es的存储情况下,es的数据一有问题,就会导致整个skywalking web ui服务不可用,然后需要agent端一个服务一个服务的停用,然后服务重新部署后好,全部走一遍。这种问题同样也会存在skywalking的版本升级迭代中。而且apm 这种过程数据是允许丢弃的,默认skywalking中关于trace的数据记录只保存了90分钟。故博主准备将skywalking的部署容器化,一键部署升级。下文是整个skywalking 容器化部署的过程。

目标:将skywalking的docker镜像运行在k8s的集群环境中提供服务

docker镜像构建

  1. FROM registry.cn-xx.xx.com/keking/jdk:1.8
  2. ADD apache-skywalking-apm-incubating/ /opt/apache-skywalking-apm-incubating/
  3. RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone && chmod +x /opt/apache-skywalking-apm-incubating/config/setApplicationEnv.sh && chmod +x /opt/apache-skywalking-apm-incubating/webapp/setWebAppEnv.sh && chmod +x /opt/apache-skywalking-apm-incubating/bin/startup.sh && echo "tail -fn 100 /opt/apache-skywalking-apm-incubating/logs/webapp.log" >> /opt/apache-skywalking-apm-incubating/bin/startup.sh
  4.  
  5. EXPOSE 8080 10800 11800 12800
  6. CMD /opt/apache-skywalking-apm-incubating/config/setApplicationEnv.sh && sh /opt/apache-skywalking-apm-incubating/webapp/setWebAppEnv.sh && /opt/apache-skywalking-apm-incubating/bin/startup.sh

在编写Dockerfile时需要考虑几个问题:skywalking中哪些配置需要动态配置(运行时设置)?怎么保证进程一直运行(skywalking 的startup.sh和tomcat中 的startup.sh类似)?

application.yml

  1. #cluster:
  2. # zookeeper:
  3. # hostPort: localhost:2181
  4. # sessionTimeout: 100000
  5. naming:
  6. jetty:
  7. #OS real network IP(binding required), for agent to find collector cluster
  8. host: 0.0.0.0
  9. port: 10800
  10. contextPath: /
  11. cache:
  12. # guava:
  13. caffeine:
  14. remote:
  15. gRPC:
  16. # OS real network IP(binding required), for collector nodes communicate with each other in cluster. collectorN --(gRPC) --> collectorM
  17. host: #real_host
  18. port: 11800
  19. agent_gRPC:
  20. gRPC:
  21. #os real network ip(binding required), for agent to uplink data(trace/metrics) to collector. agent--(grpc)--> collector
  22. host: #real_host
  23. port: 11800
  24. # Set these two setting to open ssl
  25. #sslCertChainFile: $path
  26. #sslPrivateKeyFile: $path
  27.  
  28. # Set your own token to active auth
  29. #authentication: xxxxxx
  30. agent_jetty:
  31. jetty:
  32. # OS real network IP(binding required), for agent to uplink data(trace/metrics) to collector through HTTP. agent--(HTTP)--> collector
  33. # SkyWalking native Java/.Net/node.js agents don't use this.
  34. # Open this for other implementor.
  35. host: 0.0.0.0
  36. port: 12800
  37. contextPath: /
  38. analysis_register:
  39. default:
  40. analysis_jvm:
  41. default:
  42. analysis_segment_parser:
  43. default:
  44. bufferFilePath: ../buffer/
  45. bufferOffsetMaxFileSize: 10M
  46. bufferSegmentMaxFileSize: 500M
  47. bufferFileCleanWhenRestart: true
  48. ui:
  49. jetty:
  50. # Stay in `localhost` if UI starts up in default mode.
  51. # Change it to OS real network IP(binding required), if deploy collector in different machine.
  52. host: 0.0.0.0
  53. port: 12800
  54. contextPath: /
  55. storage:
  56. elasticsearch:
  57. clusterName: #elasticsearch_clusterName
  58. clusterTransportSniffer: true
  59. clusterNodes: #elasticsearch_clusterNodes
  60. indexShardsNumber: 2
  61. indexReplicasNumber: 0
  62. highPerformanceMode: true
  63. # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
  64. bulkActions: 2000 # Execute the bulk every 2000 requests
  65. bulkSize: 20 # flush the bulk every 20mb
  66. flushInterval: 10 # flush the bulk every 10 seconds whatever the number of requests
  67. concurrentRequests: 2 # the number of concurrent requests
  68. # Set a timeout on metric data. After the timeout has expired, the metric data will automatically be deleted.
  69. traceDataTTL: 2880 # Unit is minute
  70. minuteMetricDataTTL: 90 # Unit is minute
  71. hourMetricDataTTL: 36 # Unit is hour
  72. dayMetricDataTTL: 45 # Unit is day
  73. monthMetricDataTTL: 18 # Unit is month
  74. #storage:
  75. # h2:
  76. # url: jdbc:h2:~/memorydb
  77. # userName: sa
  78. configuration:
  79. default:
  80. #namespace: xxxxx
  81. # alarm threshold
  82. applicationApdexThreshold: 2000
  83. serviceErrorRateThreshold: 10.00
  84. serviceAverageResponseTimeThreshold: 2000
  85. instanceErrorRateThreshold: 10.00
  86. instanceAverageResponseTimeThreshold: 2000
  87. applicationErrorRateThreshold: 10.00
  88. applicationAverageResponseTimeThreshold: 2000
  89. # thermodynamic
  90. thermodynamicResponseTimeStep: 50
  91. thermodynamicCountOfResponseTimeSteps: 40
  92. # max collection's size of worker cache collection, setting it smaller when collector OutOfMemory crashed.
  93. workerCacheMaxSize: 10000
  94. #receiver_zipkin:
  95. # default:
  96. # host: localhost
  97. # port: 9411
  98. # contextPath: /

webapp.yml

  1. server:
  2. port: 8080
  3. collector:
  4. path: /graphql
  5. ribbon:
  6. ReadTimeout: 10000
  7. listOfServers: #real_host:10800
  8. security:
  9. user:
  10. admin:
  11. password: #skywalking_password

动态配置:密码,grpc等需要绑定主机的ip都需要运行时设置,这里我们在启动skywalking的startup.sh只之前,先执行了两个设置配置的脚本,通过k8s在运行时设置的环境变量来替换需要动态配置的参数

setApplicationEnv.sh

  1. #!/usr/bin/env sh
  2. sed -i "s/#elasticsearch_clusterNodes/${elasticsearch_clusterNodes}/g" /opt/apache-skywalking-apm-incubating/config/application.yml
  3. sed -i "s/#elasticsearch_clusterName/${elasticsearch_clusterName}/g" /opt/apache-skywalking-apm-incubating/config/application.yml
  4. sed -i "s/#real_host/${real_host}/g" /opt/apache-skywalking-apm-incubating/config/application.yml

setWebAppEnv.sh

  1. #!/usr/bin/env sh
  2. sed -i "s/#skywalking_password/${skywalking_password}/g" /opt/apache-skywalking-apm-incubating/webapp/webapp.yml
  3. sed -i "s/#real_host/${real_host}/g" /opt/apache-skywalking-apm-incubating/webapp/webapp.yml

保持进程存在:通过在skywalking 启动脚本startup.sh末尾追加"tail -fn 100 /opt/apache-skywalking-apm-incubating/logs/webapp.log",来让进程保持运行,并不断输出webapp.log的日志

Kubernetes中部署

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: skywalking
  5. namespace: uat
  6. spec:
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. app: skywalking
  11. template:
  12. metadata:
  13. labels:
  14. app: skywalking
  15. spec:
  16. imagePullSecrets:
  17. - name: registry-pull-secret
  18. nodeSelector:
  19. apm: skywalking
  20. containers:
  21. - name: skywalking
  22. image: registry.cn-xx.xx.com/keking/kk-skywalking:5.2
  23. imagePullPolicy: Always
  24. env:
  25. - name: elasticsearch_clusterName
  26. value: elasticsearch
  27. - name: elasticsearch_clusterNodes
  28. value: 172.16.16.129:31300
  29. - name: skywalking_password
  30. value: xxx
  31. - name: real_host
  32. valueFrom:
  33. fieldRef:
  34. fieldPath: status.podIP
  35. resources:
  36. limits:
  37. cpu: 1000m
  38. memory: 4Gi
  39. requests:
  40. cpu: 700m
  41. memory: 2Gi
  42.  
  43. ---
  44. apiVersion: v1
  45. kind: Service
  46. metadata:
  47. name: skywalking
  48. namespace: uat
  49. labels:
  50. app: skywalking
  51. spec:
  52. selector:
  53. app: skywalking
  54. ports:
  55. - name: web-a
  56. port: 8080
  57. targetPort: 8080
  58. nodePort: 31180
  59. - name: web-b
  60. port: 10800
  61. targetPort: 10800
  62. nodePort: 31181
  63. - name: web-c
  64. port: 11800
  65. targetPort: 11800
  66. nodePort: 31182
  67. - name: web-d
  68. port: 12800
  69. targetPort: 12800
  70. nodePort: 31183
  71. type: NodePort

Kubernetes部署脚本中唯一需要注意的就是env中关于pod ip的获取,skywalking中有几个ip必须绑定容器的真实ip,这个地方可以通过环境变量设置到容器里面去

文末结语

整个skywalking容器化部署从测试到可用大概耗时1天,其中花了个多小时整了下谭兄的skywalking-docker镜像(https://hub.docker.com/r/wutang/skywalking-docker/),发现有个脚本有权限问题(谭兄反馈已解决,还没来的及测试),以及有几个地方自己不是很好控制,便build了自己的docker镜像,其中最大的问题还是解决集群中网络通讯的问题,一开始我把skywalking中的服务ip都设置为0.0.0.0,然后通过集群的nodePort映射出来,这个时候的agent通过集群ip+31181是可以访问到naming服务的,然后通过naming服务获取到的collector gRPC服务缺变成了0.0.0.0:11800, 这个地址agent肯定访问不到collector的,后面通过绑定pod ip的方式解决了这个问题。

以上就是skywalking容器化部署docker镜像构建k8s从测试到可用的详细内容,更多关于skywalking容器化部署docker镜像构建k8s的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号