使用ConfigMap管理应用配置
拆分环境
主机名 角色 ip
HDSS7-11.host.com
zk1.od.com(Test环境)
10.4.7.11
HDSS7-12.host.com
zk2.od.com(Prod环境)
10.4.7.12
重配zookeeper
HDSS7-11.host.com上:
复制 /opt/zookeeper/conf/zoo.cfg
123456
tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/datadataLogDir=/data/zookeeper/logsclientPort=2181
HDSS7-12.host.com上:
复制 /opt/zookeeper/conf/zoo.cfg
123456
tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/datadataLogDir=/data/zookeeper/logsclientPort=2181
重启zk(删除数据文件)
复制
123
[root@hdss7-11 ~]# /opt/zookeeper/bin/zkServer.sh restart && /opt/zookeeper/bin/zkServer.sh status[root@hdss7-12 ~]# /opt/zookeeper/bin/zkServer.sh restart && /opt/zookeeper/bin/zkServer.sh status[root@hdss7-21 ~]# /opt/zookeeper/bin/zkServer.sh stop
准备资源配置清单(dubbo-monitor)
在运维主机HDSS7-200.host.com上:
vi /data/k8s-yaml/dubbo-monitor/configmap.yaml
复制
123456789101112131415161718
apiVersion: v1kind: ConfigMapmetadata: name: dubbo-monitor-cm namespace: infradata: dubbo.properties: | dubbo.container=log4j,spring,registry,jetty dubbo.application.name=simple-monitor dubbo.application.owner= dubbo.registry.address=zookeeper://zk1.od.com:2181 dubbo.protocol.port=20880 dubbo.jetty.port=8080 dubbo.jetty.directory=/dubbo-monitor-simple/monitor dubbo.charts.directory=/dubbo-monitor-simple/charts dubbo.statistics.directory=/dubbo-monitor-simple/statistics dubbo.log4j.file=/dubbo-monitor-simple/logs/dubbo-monitor.log dubbo.log4j.level=WARN
应用资源配置清单
在任意一台k8s运算节点执行:
复制
1234
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/configmap.yamlconfigmap/dubbo-monitor-cm created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/deployment.yamldeployment.extensions/dubbo-monitor configured
重新发版,修改dubbo项目的配置文件
修改项目源代码
duboo-demo-service
复制 dubbo-server/src/main/java/config.properties
12
dubbo.registry=zookeeper://zk1.od.com:2181dubbo.port=28080
dubbo-demo-web
复制 dubbo-client/src/main/java/config.properties
1
dubbo.registry=zookeeper://zk1.od.com:2181
使用Jenkins进行CI
略
修改/应用资源配置清单
k8s的dashboard上,修改deployment使用的容器版本,提交应用
验证configmap的配置
在K8S的dashboard上,修改dubbo-monitor的configmap配置为不同的zk,重启POD,浏览器打开http://dubbo-monitor.od.com 观察效果
交付Apollo至Kubernetes集群
Apollo简介
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
官方GitHub地址
Apollo官方地址 官方release包
基础架构
简化模型
交付apollo-configservice
准备软件包
在运维主机HDSS7-200.host.com上:下载官方release包
复制 /opt/src
123456789101112
[root@hdss7-200 src]# ls -l|grep apollo-rw-r--r-- 1 root root 52713404 Feb 16 23:29 apollo-configservice-1.3.0-github.zip[root@hdss7-200 src]# mkdir /data/dockerfile/apollo-configservice && unzip -o apollo-configservice-1.3.0-github.zip -d /data/dockerfile/apollo-configserviceArchive: apollo-configservice-1.3.0-github.zip creating: /data/dockerfile/apollo-configservice/scripts/ inflating: /data/dockerfile/apollo-configservice/config/application-github.properties inflating: /data/dockerfile/apollo-configservice/scripts/shutdown.sh inflating: /data/dockerfile/apollo-configservice/apollo-configservice-1.3.0-sources.jar inflating: /data/dockerfile/apollo-configservice/scripts/startup.sh inflating: /data/dockerfile/apollo-configservice/config/app.properties inflating: /data/dockerfile/apollo-configservice/apollo-configservice-1.3.0.jar inflating: /data/dockerfile/apollo-configservice/apollo-configservice.conf
执行数据库脚本
在数据库主机HDSS7-11.host.com上:注意: MySQL版本应为5.6或以上!
复制 /etc/yum.repos.d/MariaDB.repo
12345
[mariadb]name = MariaDBbaseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.1/centos7-amd64/gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDBgpgcheck=1
复制
1
[root@hdss7-11 ~]# rpm --import https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
复制
1
[root@hdss7-11 ~]# yum update MariaDB-server -y
复制 /etc/my.cnf
123456
[mysql]default-character-set = utf8mb4[mysqld]character_set_server = utf8mb4collation_server = utf8mb4_general_ciinit_connect = "SET NAMES 'utf8mb4'"
数据库脚本地址
复制
123
[root@hdss7-11 ~]# mysql -uroot -pmysql> create database ApolloConfigDB;mysql> source ./apolloconfig.sql
数据库用户授权
复制
1
mysql> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigDB.* to "apolloconfig"@"10.4.7.%" identified by "123456";
修改初始数据
复制
12345678910111213141516
mysql> update ApolloConfigDB.ServerConfig set ServerConfig.Value="http://config.od.com/eureka" where ServerConfig.Key="eureka.service.url";Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from ServerConfig\G*************************** 1. row *************************** Id: 1 Key: eureka.service.url Cluster: default Value: http://config.od.com/eureka Comment: Eureka服务Url,多个service以英文逗号分隔 IsDeleted: DataChange_CreatedBy: default DataChange_CreatedTime: 2019-04-10 15:07:34DataChange_LastModifiedBy: DataChange_LastTime: 2019-04-11 16:28:57
制作Docker镜像
在运维主机HDSS7-200.host.com上:
复制 /data/dockerfile/apollo-configservice
1
[root@hdss7-200 apollo-configservice]# cat config/application-github.properties
复制 /data/dockerfile/apollo-configservice/scripts/startup.sh
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
#!/bin/bashSERVICE_NAME=apollo-configservice## Adjust log dir if necessaryLOG_DIR=/opt/logs/apollo-config-server## Adjust server port if necessarySERVER_PORT=8080APOLLO_CONFIG_SERVICE_NAME=$(hostname -i)SERVER_URL="http://${APOLLO_CONFIG_SERVICE_NAME}:${SERVER_PORT}"## Adjust memory settings if necessary#export JAVA_OPTS="-Xms6144m -Xmx6144m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8"## Only uncomment the following when you are using server jvm#export JAVA_OPTS="$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"########### The following is the same for configservice, adminservice, portal ###########export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"export JAVA_OPTS="$JAVA_OPTS -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.log -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"# Find Javaif [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then javaexe="$JAVA_HOME/bin/java"elif type -p java > /dev/null 2>&1; then javaexe=$(type -p java)elif [[ -x "/usr/bin/java" ]]; then javaexe="/usr/bin/java"else echo "Unable to find Java" exit 1fiif [[ "$javaexe" ]]; then version=$("$javaexe" -version 2>&1 | awk -F '"' '/version/ {print $2}') version=$(echo "$version" | awk -F. '{printf("%03d%03d",$1,$2);}') # now version is of format 009003 (9.3.x) if [ $version -ge 011000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" elif [ $version -ge 010000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" elif [ $version -ge 009000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" else JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC" JAVA_OPTS="$JAVA_OPTS -Xloggc:$LOG_DIR/gc.log -XX:+PrintGCDetails" JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:+CMSClassUnloadingEnabled -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=5M" fifiprintf "$(date) ==== Starting ==== \n"cd `dirname $0`/..chmod 755 $SERVICE_NAME".jar"./$SERVICE_NAME".jar" startrc=$?;if [[ $rc != 0 ]];then echo "$(date) Failed to start $SERVICE_NAME.jar, return code: $rc" exit $rc;fitail -f /dev/null
复制 /data/dockerfile/apollo-configservice/Dockerfile
123456789101112
FROM stanleyws/jre8:8u112ENV VERSION 1.3.0RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ echo "Asia/Shanghai" > /etc/timezoneADD apollo-configservice-${VERSION}.jar /apollo-configservice/apollo-configservice.jarADD config/ /apollo-configservice/configADD scripts/ /apollo-configservice/scriptsCMD ["/apollo-configservice/scripts/startup.sh"]
复制
1234567891011121314151617181920212223242526272829303132333435363738394041
[root@hdss7-200 apollo-configservice]# docker build . -t harbor.od.com/infra/apollo-configservice:v1.3.0Sending build context to Docker daemon 61.91 MBStep 1 : FROM stanleyws/jre8:8u112 ---> fa3a085d6ef1Step 2 : ENV VERSION 1.3.0 ---> [Warning] IPv4 forwarding is disabled. Networking will not work. ---> Running in 685d51b5adb4 ---> feb4c0289f04Removing intermediate container 685d51b5adb4Step 3 : RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone ---> [Warning] IPv4 forwarding is disabled. Networking will not work. ---> Running in eaa05073feeb ---> a3e3fd61ae35Removing intermediate container eaa05073feebStep 4 : ADD apollo-configservice-${VERSION}.jar /apollo-configservice/apollo-configservice.jar ---> be09a59b83a2Removing intermediate container ac6b8af3979bStep 5 : ADD config/ /apollo-configservice/config ---> fb64fc0f3194Removing intermediate container b73c5315ad20Step 6 : ADD scripts/ /apollo-configservice/scripts ---> 96ff3d9b9456Removing intermediate container 67ba203b3101Step 7 : CMD /apollo-configservice/scripts/startup.sh ---> [Warning] IPv4 forwarding is disabled. Networking will not work. ---> Running in 80bd3f53fefc ---> 551ea2ba8de3Removing intermediate container 80bd3f53fefcSuccessfully built 551ea2ba8de3[root@hdss7-200 apollo-configservice]# docker push harbor.od.com/infra/apollo-configservice:v1.3.0The push refers to a repository [harbor.od.com/infra/apollo-configservice]25efb9a44683: Pushed b3572bb46247: Pushed e7994b936025: Pushed 0ff1d078cbc4: Pushed ebfb473df5c2: Pushed aae5c057d1b6: Pushed dee6aef5c2b6: Pushed a464c54f93a9: Pushed v1.3.0: digest: sha256:6a8e4fdda58de0dfba9985ebbf91c4d6f46f5274983d2efa8853b03f4e45fa06 size: 1992
解析域名
DNS主机HDSS7-11.host.com上:
复制 /var/named/od.com.zone
12
mysql 60 IN A 10.4.7.11config 60 IN A 10.4.7.10
准备资源配置清单
在运维主机HDSS7-200.host.com上
复制 /data/k8s-yaml
1
[root@hdss7-200 k8s-yaml]# mkdir /data/k8s-yaml/apollo-configservice && cd /data/k8s-yaml/apollo-configservice
vi deployment.yaml
复制
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: apollo-configservice namespace: infra labels: name: apollo-configservicespec: replicas: 1 selector: matchLabels: name: apollo-configservice template: metadata: labels: app: apollo-configservice name: apollo-configservice spec: volumes: - name: configmap-volume configMap: name: apollo-configservice-cm containers: - name: apollo-configservice image: harbor.od.com/infra/apollo-configservice:v1.3.0 ports: - containerPort: 8080 protocol: TCP volumeMounts: - name: configmap-volume mountPath: /apollo-configservice/config terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent imagePullSecrets: - name: harbor restartPolicy: Always terminationGracePeriodSeconds: 30 securityContext: runAsUser: 0 schedulerName: default-scheduler strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 revisionHistoryLimit: 7 progressDeadlineSeconds: 600
应用资源配置清单
在任意一台k8s运算节点执行:
复制
12345678
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/configmap.yamlconfigmap/apollo-configservice-cm created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/deployment.yamldeployment.extensions/apollo-configservice created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/svc.yamlservice/apollo-configservice created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/ingress.yamlingress.extensions/apollo-configservice created
浏览器访问
http://config.od.com
交付apollo-adminservice
准备软件包
在运维主机HDSS7-200.host.com上:下载官方release包
复制
12345
[root@hdss7-200 src]# ls -l|grep apollo-rw-r--r-- 1 root root 52713404 Feb 16 08:47 apollo-configservice-1.3.0-github.zip-rw-r--r-- 1 root root 49418246 Feb 16 09:54 apollo-adminservice-1.3.0-github.zip[root@hdss7-200 src]# mkdir /data/dockerfile/apollo-adminservice && unzip -o apollo-adminservice-1.3.0-github.zip -d /data/dockerfile/apollo-adminservice
制作Docker镜像
在运维主机HDSS7-200.host.com上:
配置数据库连接串
复制 /data/dockerfile/apollo-adminservice
1
[root@hdss7-200 apollo-adminservice]# cat config/application-github.properties
更新starup.sh
复制 /data/dockerfile/apollo-adminservice/scripts/startup.sh
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
#!/bin/bashSERVICE_NAME=apollo-adminservice## Adjust log dir if necessaryLOG_DIR=/opt/logs/apollo-adminservice## Adjust server port if necessarySERVER_PORT=8080APOLLO_ADMIN_SERVICE_NAME=$(hostname -i)# SERVER_URL="http://localhost:${SERVER_PORT}"SERVER_URL="http://${APOLLO_ADMIN_SERVICE_NAME}:${SERVER_PORT}"## Adjust memory settings if necessary#export JAVA_OPTS="-Xms2560m -Xmx2560m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=1536m -XX:MaxNewSize=1536m -XX:SurvivorRatio=8"## Only uncomment the following when you are using server jvm#export JAVA_OPTS="$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"########### The following is the same for configservice, adminservice, portal ###########export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"export JAVA_OPTS="$JAVA_OPTS -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.log -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"# Find Javaif [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then javaexe="$JAVA_HOME/bin/java"elif type -p java > /dev/null 2>&1; then javaexe=$(type -p java)elif [[ -x "/usr/bin/java" ]]; then javaexe="/usr/bin/java"else echo "Unable to find Java" exit 1fiif [[ "$javaexe" ]]; then version=$("$javaexe" -version 2>&1 | awk -F '"' '/version/ {print $2}') version=$(echo "$version" | awk -F. '{printf("%03d%03d",$1,$2);}') # now version is of format 009003 (9.3.x) if [ $version -ge 011000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" elif [ $version -ge 010000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" elif [ $version -ge 009000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" else JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC" JAVA_OPTS="$JAVA_OPTS -Xloggc:$LOG_DIR/gc.log -XX:+PrintGCDetails" JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:+CMSClassUnloadingEnabled -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=5M" fifiprintf "$(date) ==== Starting ==== \n"cd `dirname $0`/..chmod 755 $SERVICE_NAME".jar"./$SERVICE_NAME".jar" startrc=$?;if [[ $rc != 0 ]];then echo "$(date) Failed to start $SERVICE_NAME.jar, return code: $rc" exit $rc;fitail -f /dev/null
写Dockerfile
复制 /data/dockerfile/apollo-adminservice/Dockerfile
123456789101112
FROM stanleyws/jre8:8u112ENV VERSION 1.3.0RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ echo "Asia/Shanghai" > /etc/timezoneADD apollo-adminservice-${VERSION}.jar /apollo-adminservice/apollo-adminservice.jarADD config/ /apollo-adminservice/configADD scripts/ /apollo-adminservice/scriptsCMD ["/apollo-adminservice/scripts/startup.sh"]
制作镜像并推送
复制
12345678910111213141516171819202122232425262728293031323334353637
[root@hdss7-200 apollo-adminservice]# docker build . -t harbor.od.com/infra/apollo-adminservice:v1.3.0Sending build context to Docker daemon 58.31 MBStep 1 : FROM stanleyws/jre8:8u112 ---> fa3a085d6ef1Step 2 : ENV VERSION 1.3.0 ---> Using cache ---> feb4c0289f04Step 3 : RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone ---> Using cache ---> a3e3fd61ae35Step 4 : ADD apollo-adminservice-${VERSION}.jar /apollo-adminservice/apollo-adminservice.jar ---> 6a1eb9565777Removing intermediate container 7196df9af6afStep 5 : ADD config/ /apollo-adminservice/config ---> 9f364b732d46Removing intermediate container 9b24669c6c78Step 6 : ADD scripts/ /apollo-adminservice/scripts ---> b7bc5517b0fcRemoving intermediate container f3e34e759148Step 7 : CMD /apollo-adminservice/scripts/startup.sh ---> [Warning] IPv4 forwarding is disabled. Networking will not work. ---> Running in 18c6597914b4 ---> 82145db3ee88Removing intermediate container 18c6597914b4Successfully built 82145db3ee88[root@hdss7-200 apollo-adminservice]# docker push harbor.od.com/infra/apollo-adminservice:v1.3.0docker push harbor.od.com/infra/apollo-adminservice:v1.3.0The push refers to a repository [harbor.od.com/infra/apollo-adminservice]19b1ca6c066d: Pushed 8fa6cde49908: Pushed 0b2c9b9226cc: Pushed ebfb473df5c2: Mounted from infra/apollo-configservice aae5c057d1b6: Mounted from infra/apollo-configservice dee6aef5c2b6: Mounted from infra/apollo-configservice a464c54f93a9: Mounted from infra/apollo-configservice v1.3.0: digest: sha256:75367caab9bad3d0d281eb3324451a0734e84b6aa3ee860e38ad758d7166a7d1 size: 1785
准备资源配置清单
在运维主机HDSS7-200.host.com上
复制 /data/k8s-yaml
1
[root@hdss7-200 k8s-yaml]# mkdir /data/k8s-yaml/apollo-adminservice && cd /data/k8s-yaml/apollo-adminservice
vi deployment.yaml
复制
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: apollo-adminservice namespace: infra labels: name: apollo-adminservicespec: replicas: 1 selector: matchLabels: name: apollo-adminservice template: metadata: labels: app: apollo-adminservice name: apollo-adminservice spec: volumes: - name: configmap-volume configMap: name: apollo-adminservice-cm containers: - name: apollo-adminservice image: harbor.od.com/infra/apollo-adminservice:v1.3.0 ports: - containerPort: 8080 protocol: TCP volumeMounts: - name: configmap-volume mountPath: /apollo-adminservice/config terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent imagePullSecrets: - name: harbor restartPolicy: Always terminationGracePeriodSeconds: 30 securityContext: runAsUser: 0 schedulerName: default-scheduler strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 revisionHistoryLimit: 7 progressDeadlineSeconds: 600
应用资源配置清单
在任意一台k8s运算节点执行:
复制
1234
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-adminservice/configmap.yamlconfigmap/apollo-adminservice-cm created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-adminservice/deployment.yamldeployment.extensions/apollo-adminservice created
浏览器访问
http://config.od.com
交付apollo-portal
准备软件包
在运维主机HDSS7-200.host.com上:下载官方release包
复制
12345678910111213141516
[root@hdss7-200 src]# ls -l|grep apollo-rw-r--r-- 1 root root 52713404 Feb 16 08:37 apollo-configservice-1.3.0-github.zip-rw-r--r-- 1 root root 49418246 Feb 16 09:54 apollo-adminservice-1.3.0-github.zip-rw-r--r-- 1 root root 36459359 Feb 16 10:00 apollo-portal-1.3.0-github.zip[root@hdss7-200 src]# mkdir /data/dockerfile/apollo-portal && unzip -o apollo-portal-1.3.0-github.zip -d /data/dockerfile/apollo-portalArchive: apollo-portal-1.3.0-github.zip inflating: /data/dockerfile/apollo-portal/scripts/shutdown.sh inflating: /data/dockerfile/apollo-portal/apollo-portal.conf inflating: /data/dockerfile/apollo-portal/apollo-portal-1.3.0-sources.jar creating: /data/dockerfile/apollo-portal/config/ inflating: /data/dockerfile/apollo-portal/config/application-github.properties inflating: /data/dockerfile/apollo-portal/scripts/startup.sh inflating: /data/dockerfile/apollo-portal/config/apollo-env.properties inflating: /data/dockerfile/apollo-portal/config/app.properties inflating: /data/dockerfile/apollo-portal/apollo-portal-1.3.0.jar
执行数据库脚本
在数据库主机HDSS7-11.host.com上:数据库脚本地址
复制
123
[root@hdss7-11 ~]# mysql -uroot -pmysql> create database ApolloPortalDB;mysql> source ./apolloportal.sql
数据库用户授权
复制
1
mysql> grant INSERT,DELETE,UPDATE,SELECT on ApolloPortalDB.* to "apolloportal"@"172.7.%" identified by "123456";
制作Docker镜像
在运维主机HDSS7-200.host.com上:
配置数据库连接串
复制 /data/dockerfile/apollo-portal
1
[root@hdss7-200 apollo-portal]# cat config/application-github.properties
配置Portal的meta service
复制 /data/dockerfile/apollo-portal/config/apollo-env.properties
1
dev.meta=http://config.od.com
更新starup.sh
复制 /data/dockerfile/apollo-portal/scripts/startup.sh
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
#!/bin/bashSERVICE_NAME=apollo-portal## Adjust log dir if necessaryLOG_DIR=/opt/logs/apollo-portal-server## Adjust server port if necessarySERVER_PORT=8080APOLLO_PORTAL_SERVICE_NAME=$(hostname -i)# SERVER_URL="http://localhost:$SERVER_PORT"SERVER_URL="http://${APOLLO_PORTAL_SERVICE_NAME}:${SERVER_PORT}"## Adjust memory settings if necessary#export JAVA_OPTS="-Xms2560m -Xmx2560m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=1536m -XX:MaxNewSize=1536m -XX:SurvivorRatio=8"## Only uncomment the following when you are using server jvm#export JAVA_OPTS="$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"########### The following is the same for configservice, adminservice, portal ###########export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"export JAVA_OPTS="$JAVA_OPTS -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.log -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"# Find Javaif [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then javaexe="$JAVA_HOME/bin/java"elif type -p java > /dev/null 2>&1; then javaexe=$(type -p java)elif [[ -x "/usr/bin/java" ]]; then javaexe="/usr/bin/java"else echo "Unable to find Java" exit 1fiif [[ "$javaexe" ]]; then version=$("$javaexe" -version 2>&1 | awk -F '"' '/version/ {print $2}') version=$(echo "$version" | awk -F. '{printf("%03d%03d",$1,$2);}') # now version is of format 009003 (9.3.x) if [ $version -ge 011000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" elif [ $version -ge 010000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" elif [ $version -ge 009000 ]; then JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace" else JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC" JAVA_OPTS="$JAVA_OPTS -Xloggc:$LOG_DIR/gc.log -XX:+PrintGCDetails" JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:+CMSClassUnloadingEnabled -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=5M" fifiprintf "$(date) ==== Starting ==== \n"cd `dirname $0`/..chmod 755 $SERVICE_NAME".jar"./$SERVICE_NAME".jar" startrc=$?;if [[ $rc != 0 ]];then echo "$(date) Failed to start $SERVICE_NAME.jar, return code: $rc" exit $rc;fitail -f /dev/null
写Dockerfile
复制 /data/dockerfile/apollo-portal/Dockerfile
123456789101112
FROM stanleyws/jre8:8u112ENV VERSION 1.3.0RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ echo "Asia/Shanghai" > /etc/timezoneADD apollo-portal-${VERSION}.jar /apollo-portal/apollo-portal.jarADD config/ /apollo-portal/configADD scripts/ /apollo-portal/scriptsCMD ["/apollo-portal/scripts/startup.sh"]
复制
123456789101112131415161718192021222324252627282930313233343536
[root@hdss7-200 apollo-portal]# docker build . -t harbor.od.com/infra/apollo-portal:v1.3.0Sending build context to Docker daemon 43.35 MBStep 1 : FROM stanleyws/jre8:8u112 ---> fa3a085d6ef1Step 2 : ENV VERSION 1.3.0 ---> Using cache ---> feb4c0289f04Step 3 : RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone ---> Using cache ---> a3e3fd61ae35Step 4 : ADD apollo-portal-${VERSION}.jar /apollo-portal/apollo-portal.jar ---> cfcf63e8eedcRemoving intermediate container 860b55bd3fc5Step 5 : ADD config/ /apollo-portal/config ---> 3ee780369431Removing intermediate container 6b67ee4224b5Step 6 : ADD scripts/ /apollo-portal/scripts ---> 42c9aea2e9e3Removing intermediate container 2dcf8d1bf4cfStep 7 : CMD /apollo-portal/scripts/startup.sh ---> [Warning] IPv4 forwarding is disabled. Networking will not work. ---> Running in 9162dab8b63a ---> 0c020b79c36fRemoving intermediate container 9162dab8b63aSuccessfully built 0c020b79c36f[root@hdss7-200 apollo-portal]# docker push harbor.od.com/infra/apollo-portal:v1.3.0docker push harbor.od.com/infra/apollo-portal:v1.3.0The push refers to a repository [harbor.od.com/infra/apollo-portal]e7c0e96ded4e: Pushed 0076c5344476: Pushed 3851a45d7440: Pushed ebfb473df5c2: Mounted from infra/apollo-adminservice aae5c057d1b6: Mounted from infra/apollo-adminservice dee6aef5c2b6: Mounted from infra/apollo-adminservice a464c54f93a9: Mounted from infra/apollo-adminservice v1.3.0: digest: sha256:1aa30aac8642cceb97c053b7d74632240af08f64c49b65d8729021fef65628a4 size: 1785
解析域名
DNS主机HDSS7-11.host.com上:
复制 /var/named/od.com.zone
1
portal 60 IN A 10.4.7.10
准备资源配置清单
在运维主机HDSS7-200.host.com上
复制 /data/k8s-yaml
1
[root@hdss7-200 k8s-yaml]# mkdir /data/k8s-yaml/apollo-portal && cd /data/k8s-yaml/apollo-portal
vi deployment.yaml
复制
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: apollo-portal namespace: infra labels: name: apollo-portalspec: replicas: 1 selector: matchLabels: name: apollo-portal template: metadata: labels: app: apollo-portal name: apollo-portal spec: volumes: - name: configmap-volume configMap: name: apollo-portal-cm containers: - name: apollo-portal image: harbor.od.com/infra/apollo-portal:v1.3.0 ports: - containerPort: 8080 protocol: TCP volumeMounts: - name: configmap-volume mountPath: /apollo-portal/config terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent imagePullSecrets: - name: harbor restartPolicy: Always terminationGracePeriodSeconds: 30 securityContext: runAsUser: 0 schedulerName: default-scheduler strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 revisionHistoryLimit: 7 progressDeadlineSeconds: 600
应用资源配置清单
在任意一台k8s运算节点执行:
复制
12345678
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/configmap.yamlconfigmap/apollo-portal-cm created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/deployment.yamldeployment.extensions/apollo-portal created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/svc.yamlservice/apollo-portal created[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/ingress.yamlingress.extensions/apollo-portal created
浏览器访问
http://portal.od.com
实战dubbo微服务接入Apollo配置中心
改造dubbo-demo-service项目
使用IDE拉取项目(这里使用git bash作为范例)
复制
1
$ git clone git@gitee.com/stanleywang/dubbo-demo-service.git
切到apollo分支
复制
1
$ git checkout -b apollo
修改pom.xml
复制 dubbo-server/pom.xml
12345
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.1.0</version></dependency>
复制 dubbo-server/pom.xml
1234567
<resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <filtering>false</filtering></resource>
增加resources目录
复制 /d/workspace/dubbo-demo-service/dubbo-server/src/main
123
$ mkdir -pv resources/META-INFmkdir: created directory 'resources'mkdir: created directory 'resources/META-INF'
修改config.properties文件
复制 /d/workspace/dubbo-demo-service/dubbo-server/src/main/resources/config.properties
12
dubbo.registry=${dubbo.registry}dubbo.port=${dubbo.port}
修改srping-config.xml文件
复制 /d/workspace/dubbo-demo-service/dubbo-server/src/main/resources/spring-config.xml
1
xmlns:apollo="http://www.ctrip.com/schema/apollo"
复制 /d/workspace/dubbo-demo-service/dubbo-server/src/main/resources/spring-config.xml
1
http://www.ctrip.com/schema/apollo http://www.ctrip.com/schema/apollo.xsd
复制 /d/workspace/dubbo-demo-service/dubbo-server/src/main/resources/spring-config.xml
复制 /d/workspace/dubbo-demo-service/dubbo-server/src/main/resources/spring-config.xml
1
<!-- <context:property-placeholder location="classpath:config.properties"/> -->
增加app.properties文件
复制 /d/workspace/dubbo-demo-service/dubbo-server/src/main/resources/META-INF/app.properties
1
app.id=dubbo-demo-service
提交git中心仓库(gitee)
复制
1
$ git push origin apollo
配置apollo-portal
创建项目
部门
样例部门1(TEST1)
应用id
dubbo-demo-service
应用名称
dubbo服务提供者
应用负责人
apollo|apollo
项目管理员
apollo|apollo
提交
进入配置页面
新增配置项1
Key
dubbo.registry
Value
zookeeper://zk1.od.com:2181
选择集群
DEV
提交
新增配置项2
Key
dubbo.port
Value
20880
选择集群
DEV
提交
发布配置
点击发布 ,配置生效
使用jenkins进行CI
略(注意记录镜像的tag)
上线新构建的项目
准备资源配置清单
运维主机HDSS7-200.host.com上:
复制 /data/k8s-yaml/dubbo-demo-service/deployment.yaml
1234567891011121314151617181920212223242526272829303132333435363738394041424344
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: dubbo-demo-service namespace: app labels: name: dubbo-demo-servicespec: replicas: 1 selector: matchLabels: name: dubbo-demo-service template: metadata: labels: app: dubbo-demo-service name: dubbo-demo-service spec: containers: - name: dubbo-demo-service image: harbor.od.com/app/dubbo-demo-service:apollo_190119_1815 ports: - containerPort: 20880 protocol: TCP env: - name: C_OPTS value: -Denv=dev -Dapollo.meta=http://config.od.com - name: JAR_BALL value: dubbo-server.jar imagePullPolicy: IfNotPresent imagePullSecrets: - name: harbor restartPolicy: Always terminationGracePeriodSeconds: 30 securityContext: runAsUser: 0 schedulerName: default-scheduler strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 revisionHistoryLimit: 7 progressDeadlineSeconds: 600
注意: 增加了env段配置注意: docker镜像新版的tag
应用资源配置清单
在任意一台k8s运算节点上执行:
复制
12
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-demo-service/deployment.yamldeployment.extensions/dubbo-demo-service configured
观察项目运行情况
http://dubbo-monitor.od.com
改造dubbo-demo-web
略
配置apollo-portal
创建项目
部门
样例部门1(TEST1)
应用id
dubbo-demo-web
应用名称
dubbo服务消费者
应用负责人
apollo|apollo
项目管理员
apollo|apollo
提交
进入配置页面
新增配置项1
Key
dubbo.registry
Value
zookeeper://zk1.od.com:2181
选择集群
DEV
提交
发布配置
点击发布 ,配置生效
使用jenkins进行CI
略(注意记录镜像的tag)
上线新构建的项目
准备资源配置清单
运维主机HDSS7-200.host.com上:
复制 /data/k8s-yaml/dubbo-demo-consumer/deployment.yaml
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
kind: DeploymentapiVersion: extensions/v1beta1metadata: name: dubbo-demo-consumer namespace: app labels: name: dubbo-demo-consumerspec: replicas: 1 selector: matchLabels: name: dubbo-demo-consumer template: metadata: labels: app: dubbo-demo-consumer name: dubbo-demo-consumer spec: containers: - name: dubbo-demo-consumer image: harbor.od.com/app/dubbo-demo-consumer:apllo_190120_1815 ports: - containerPort: 20880 protocol: TCP - containerPort: 8080 protocol: TCP env: - name: C_OPTS value: -Denv=dev -Dapollo.meta=http://config.od.com - name: JAR_BALL value: dubbo-client.jar imagePullPolicy: IfNotPresent imagePullSecrets: - name: harbor restartPolicy: Always terminationGracePeriodSeconds: 30 securityContext: runAsUser: 0 schedulerName: default-scheduler strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 revisionHistoryLimit: 7 progressDeadlineSeconds: 600
注意: 增加了env段配置注意: docker镜像新版的tag
应用资源配置清单
在任意一台k8s运算节点上执行:
复制
12
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-demo-web/deployment.yamldeployment.extensions/dubbo-demo-consumer configured
通过Apollo配置中心动态维护项目的配置
以dubbo-demo-service项目为例,不用修改代码
实战维护多套dubbo微服务环境
生产实践
迭代新需求/修复BUG(编码->提GIT)
测试环境发版,测试(应用通过编译打包发布至TEST命名空间)
测试通过,上线(应用镜像直接发布至PROD命名空间)
系统架构
主机名 角色 ip
HDSS7-11.host.com
zk-test(测试环境Test)
10.4.7.11
HDSS7-12.host.com
zk-prod(生产环境Prod)
10.4.7.12
HDSS7-21.host.com
kubernetes运算节点
10.4.7.21
HDSS7-22.host.com
kubernetes运算节点
10.4.7.22
HDSS7-200.host.com
运维主机,harbor仓库
10.4.7.200
环境 命名空间 应用
测试环境(TEST)
test
apollo-config,apollo-admin
测试环境(TEST)
test
dubbo-demo-service,dubbo-demo-web
生产环境(PROD)
prod
apollo-config,apollo-admin
生产环境(PROD)
prod
dubbo-demo-service,dubbo-demo-web
ops环境(infra)
infra
jenkins,dubbo-monitor,apollo-portal
修改/添加域名解析
DNS主机HDSS7-11.host.com上:
复制 /var/named/od.com.zone
123456
zk-test 60 IN A 10.4.7.11zk-prod 60 IN A 10.4.7.12config-test 60 IN A 10.4.7.10config-prod 60 IN A 10.4.7.10demo-test 60 IN A 10.4.7.10demo-prod 60 IN A 10.4.7.10
Apollo的k8s应用配置
删除app命名空间内应用,创建test命名空间,创建prod命名空间
删除infra命名空间内apollo-configservice,apollo-adminservice应用
数据库内删除ApolloConfigDB,创建ApolloConfigTestDB,创建ApolloConfigProdDB
复制
12345678910111213
mysql> drop database ApolloConfigDB;mysql> create database ApolloConfigTestDB;mysql> use ApolloConfigTestDB;mysql> source ./apolloconfig.sqlmysql> update ApolloConfigTestDB.ServerConfig set ServerConfig.Value="http://config-test.od.com/eureka" where ServerConfig.Key="eureka.service.url";mysql> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigTestDB.* to "apolloconfig"@"10.4.7.%" identified by "123456";mysql> create database ApolloConfigProdDB;mysql> use ApolloConfigProdDB;mysql> source ./apolloconfig.sqlmysql> update ApolloConfigProdDB.ServerConfig set ServerConfig.Value="http://config-prod.od.com/eureka" where ServerConfig.Key="eureka.service.url";mysql> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigProdDB.* to "apolloconfig"@"10.4.7.%" identified by "123456";
准备apollo-config,apollo-admin的资源配置清单(各2套)
注: apollo-config/apollo-admin的configmap配置要点
复制
123456
application-github.properties: | # DataSource spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigTestDB?characterEncoding=utf8 spring.datasource.username = apolloconfig spring.datasource.password = 123456 eureka.service.url = http://config-test.od.com/eureka
复制
123456
application-github.properties: | # DataSource spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigProdDB?characterEncoding=utf8 spring.datasource.username = apolloconfig spring.datasource.password = 123456 eureka.service.url = http://config-prod.od.com/eureka
依次应用,分别发布在test和prod命名空间
修改apollo-portal的configmap并重启portal
复制
123
apollo-env.properties: | TEST.meta=http://config-test.od.com PROD.meta=http://config-prod.od.com
Apollo的portal配置
管理员工具
删除应用、集群、AppNamespace,将已配置应用删除
系统参数
Key
apollo.portal.envs
Value
TEST,PROD
查询
保存
新建dubbo-demo-service和dubbo-demo-web项目
在TEST/PROD环境分别增加配置项并发布
发布dubbo微服务
准备dubbo-demo-service和dubbo-demo-web的资源配置清单(各2套)
依次应用,分别发布至app-test和app-prod命名空间
使用dubbo-monitor查验
互联网公司技术部的日常
产品经理整理需求,需求评审,出产品原型
开发同学夜以继日的开发,提测
测试同学使用Jenkins持续集成,并发布至测试环境
验证功能,通过->待上线or打回->修改代码
提交发版申请,运维同学将测试后的包发往生产环境
无尽的BUG修复(笑cry)