容器化生產環境集成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容器化