容器化生產環境集成apollo配置中心與skywalking全鏈路追蹤
- 2019 年 11 月 8 日
- 筆記
目錄
(1).前置閱讀
(2).前置說明
(3).基礎鏡像
1.oraclejdk-docker-image
2.oraclejdk-skywalking-docker-image
3.apollo-skywalking-pro鏡像
(4).apollo&skywalking生產級容器化
(5).關鍵配置
(6).特別注意
1.sk-agent和sky-oap一定要配置正確的時區
2.sk-oap的elasticsearch版本選擇
3.製作apollo-skywalking-docker-image鏡像注意sk-plugin選擇
4.apollo-portal開啟多副本要注意配置session親和性
5.使用oraclejdk
6.修改支持的環境
(7).相關文章
(1).前置閱讀
1.阿里雲&kubernetes&微服務生產實踐-6:skywalking-6.4.0生產級別容器化
2.阿里雲&kubernetes&微服務生產實踐-1:apollo架構-1
(2).前置說明
本例相對於官方做了如下幾處改動:
1.修改基礎鏡像為oracle-jdk,並增加redis-cli, telnet等常用工具包。
2.基礎鏡像增加skywalking-agent的支持,通過configmap中的配置參數來決定在啟動apollo服務的時候是否開啟鏈路追蹤。
(3).基礎鏡像
1.oraclejdk-docker-image
第一層基礎鏡像。
使用oraclejdk8製作的鏡像,包含telnet, redis-cli, mysql-client等工具包。
地址: https://github.com/hepyu/oraclejdk-docker-image
2.oraclejdk-skywalking-docker-image
第二層鏡像,基於oraclejdk-docker-image鏡像。
加入了skywalking-agent支持。
地址: https://github.com/hepyu/oraclejdk-skywalking-docker-image
3.apollo-skywalking-pro鏡像
基於鏡像oraclejdk-skywalking-docker-image製作。
(4).apollo&skywalking生產級容器化
筆者提供生產級的配置文件,位於:
https://github.com/hepyu/k8s-app-config/tree/master/product/standard/apollo-skywalking-pro
注意本例配置中pv默認是本地存儲,生產環境需要改為雲存儲。
順次執行:
kubectl apply -f apollo-namespace.yaml
cd apollo-configservice
kubectl apply -f .
cd apollo-adminservice
kubectl apply -f .
cd apollo-portal
kubectl apply -f .
最終的生產效果:
原圖文件位於:
https://github.com/hepyu/k8s-app-config/blob/master/product/standard/apollo-skywalking-pro/images/apollo-skywalking.png

(5).關鍵配置
skywalking的關鍵配置位於config/admin/portal下的config.yaml文件,通過環境變量SKYWALKING_AGENT來配置是否開啟skywalking-agent探針;當然也可以在這裡調整JVM啟動參數。
當配置如下時表示關閉skywalking-agent探針:SKYWALKING_AGENT: ''
SERVICE_NAME: apollo-configservice APOLLO_CONFIG_SERVICE_NAME: apollo-configservice LOG_DIR: /opt/logs/apollo-config-server SERVER_PORT: '8080' SERVER_URL: http://$APOLLO_CONFIG_SERVICE_NAME:$SERVER_PORT TIME_ZONE: Asia/Shanghai SKYWALKING_AGENT: '-javaagent:/app/3rd/skywalking-agent/skywalking-agent.jar=agent.service_name=apollo-configservice-k8s,collector.backend_service=skywalking-c0-oap.skywalking:11800' #SKYWALKING_AGENT: '' JAVA_OPTS: >- -Xms1024m -Xmx1024m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8 -server -XX:-ReduceInitialCardMarks -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=$TIME_ZONE -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.log -XX:HeapDumpPath=$LOG_DIR/ $SKYWALKING_AGENT application-github.properties: | spring.datasource.url=jdbc:mysql://mysql-min.mysql-min:3306/DevApolloConfigDB?characterEncoding=utf8 spring.datasource.username=apollo spring.datasource.password=admin spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect eureka.service.url=http://apollo-configservice/eureka/
(6).特別注意
1.sk-agent和sky-oap一定要配置正確的時區
都要配置: TIME_ZONE: Asia/Shanghai
因為skywalking的默認時區是UTC0,大陸的APP的服務的時區是UTC8,如果sk-agent和sk-oap的時區不一致時,sk-ui不會顯示數據/拓撲。
2.sk-oap的elasticsearch版本選擇
盡量選擇sk使用的版本,比如sk6.4.0用的是es6.3.2那我們搭建es時就要選擇這個版本。避免es版本差異帶來的各種奇怪問題。
3.製作apollo-skywalking-docker-image鏡像注意sk-plugin選擇
參照官方/社區的issue:https://github.com/ctripcorp/apollo/issues/2448
我們的目的是:
a. 監控Apollo-Config、Admin、Portal之間的調用以及拓撲
b. 監控Apollo-Client 與 Config之間的調用及拓撲
第一種情況:Portal與Config/Admin之間採用RestTemplate/HttpClient 發起調用,這個插件在Skywalking支持列表。
第二種情況,Apollo-Client 採用的是 HttpURLConnection 發起Http請求。和 HttpClient 有些區別,默認插件不支持。需要使用可選插件:bootstrap-plugins/apm-jdk-http-plugin-6.4.0.jar,將這個jar包拷貝到plugins目錄下。
4.apollo-portal開啟多副本要注意配置session親和性
config/admin/portal的負載均衡都需要配置:sessionAffinity: ClientIP;
如果你還是用的ingress代理apollo-portal,那麼ingress也需要配置親和性保證session的正確傳遞:
nginx.ingress.kubernetes.io/affinity: cookie
ingress的親和性配置參見文件:
https://github.com/hepyu/k8s-app-config/blob/master/product/standard/apollo-pro/apollo-portal/apollo-portal-ingress.yaml
如果不配置親和性,apollo-portal開啟多副本後將出現無法登陸的現象。
5.使用oraclejdk
因為apollo官方的鏡像里沒有調試工具,如jstat等,很不方便。
6.修改支持的環境
在apolloPortalDB的ServerConfig表中存放了支持的環境:pro,uat,fat,dev,如果只配置了pro,需要把其餘的3個刪除,否則portal會一直報錯:
''' Env is down. env: UAT, failed times: 39, meta server address: http://apollo.meta '''
(7).相關文章
1.官方地址容器化配置地址:
https://github.com/ctripcorp/apollo/tree/master/scripts/apollo-on-kubernetes/kubernetes
2.官方apollo容器化步驟(Step by Step):
https://github.com/ctripcorp/apollo/blob/master/scripts/apollo-on-kubernetes/README.md
3.筆者apollo容器化步驟(Step by Step):
kubernetes-6:使用yaml方式進行apollo容器化