k8s配置中心实战-多环境交付apollo三组件

目录

  • k8s配置中心实战-多环境交付apollo三组件
    • 1.环境准备工作
      • 1.1 zk环境拆分
      • 1.2 namespace分环境
      • 1.3 数据库拆分
        • 1.3.1 修改初始化脚本并导入
        • 1.3.2 修改数据库中eureka地址
      • 1.4 变动原有资源配置启动
        • 1.4.1 修改portal的cm资源配置清单
        • 1.4.2 任意节点应用修改
    • 2 部署新环境的APOLLO服务
      • 2.1 先创建出所需目录和文件
      • 2.2 部署test环境的configservice
        • 2.2.1 修改configmap资源清单
        • 2.2.2 修改dp,ns,inress资源清单
        • 2.2.3 应用资源配置
      • 2.3 部署test环境的adminservice
        • 2.3.1 修改configmap资源清单
        • 2.3.2 修改dp资源清单
        • 2.3.3 应用资源配置清单
      • 2.4 部署prod环境的configservice
        • 2.4.1 修改configmap资源清单
        • 2.4.2 修改dp,ns,inress资源清单
        • 2.4.3 应用资源配置
      • 2.5 部署prod环境的adminservice
        • 2.5.1 修改configmap资源清单
        • 2.5.2 修改dp资源清单
        • 2.5.3 应用资源配置清单
      • 2.6 启动portal服务
        • 2.6.1 清理数据库
        • 2.6.2 启动portal
        • 2.6.3 验证部署结果
        • 2.6.4 添加test环境的配置
        • 2.6.5 添加prod环境的配置
    • 3 分环境交付dubbo服务
      • 3.1 交付test环境dubbo服务
        • 3.1.1 修改server资源配置清单
        • 3.1.2 修改consumer资源配置清单
      • 3.2 交付prod环境dubbo服务
        • 3.2.1 修改server资源配置清单
        • 3.2.2 修改consumer资源配置清单
      • 3.3 关于dp中的apollo域名
    • 4 验证并模拟发布
      • 4.1 验证访问两个环境
      • 4.2 模拟发版:
        • 4.2.1 用jenkins构建新镜像
        • 4.2.2 发布test环境
        • 4.2.3 发布prod环境

          1.环境准备工作

          先删除infra名称空间中部署的apollo服务
          1. kubectl delete -f http://k8s-yaml.zq.com/apollo-configservice/dp.yaml
          2. kubectl delete -f http://k8s-yaml.zq.com/apollo-adminservice/dp.yaml
          3. kubectl delete -f http://k8s-yaml.zq.com/apollo-portal/dp.yaml
          要进行分环境,需要将现有实验环境进行拆分
  1. portal服务,可以各个环境共用,只部署一套
  2. adminservice和configservice必须要分开每个环境一套
  3. zk和namespace也要区分环境

    1.1 zk环境拆分

    zk拆分最简单,只需要在dns那里修改解析规则即可:
    同时添加好apollo、dubbo两个环境的域名解析
    1. vi /var/named/zq.com.zone
    2. zk-test A 10.4.7.11
    3. zk-prod A 10.4.7.12
    4. apollo-testconfig A 10.4.7.10
    5. apollo-prodconfig A 10.4.7.10
    6. dubbo-testdemo A 10.4.7.10
    7. dubbo-proddemo A 10.4.7.10
    8. # 重启服务
    9. systemctl restart named.service

    1.2 namespace分环境

    分别创建test 和prod两个名称空间
    1. kubectl create ns test
    2. kubectl create ns prod
    给新名称空间创建secret授权
    1. kubectl create secret docker-registry harbor \
    2. --docker-server=harbor.zq.com \
    3. --docker-username=harbor \
    4. --docker-password=Harbor12345 \
    5. -n test
    6. kubectl create secret docker-registry harbor \
    7. --docker-server=harbor.zq.com \
    8. --docker-username=harbor \
    9. --docker-password=Harbor12345 \
    10. -n prod

    1.3 数据库拆分

    因实验资源有限,故使用分库的形式模拟分环境

    1.3.1 修改初始化脚本并导入

    数据库再7.11上哦
    分别创建ApolloConfigTestDB和ApolloConfigProdDB
    1. # 复制为新sql
    2. cp apolloconfig.sql apolloconfigTest.sql
    3. cp apolloconfig.sql apolloconfigProd.sql
    4. # 替换关键字
    5. sed -i 's#ApolloConfigDB#ApolloConfigTestDB#g' apolloconfigTest.sql
    6. sed -i 's#ApolloConfigDB#ApolloConfigProdDB#g' apolloconfigProd.sql
    7. # 导入数据库
    8. mysql -uroot -p123456 < apolloconfigTest.sql
    9. mysql -uroot -p123456 < apolloconfigProd.sql

    1.3.2 修改数据库中eureka地址

    这里用到了两个新的域名,域名解析已经在添加zk域名那里一起加了
    1. mysql -uroot -p123456
    2. # 1.修改eureka注册中心配置
    3. > update ApolloConfigProdDB.ServerConfig set ServerConfig.Value="http://apollo-prodconfig.zq.com/eureka" where ServerConfig.Key="eureka.service.url";
    4. > update ApolloConfigTestDB.ServerConfig set ServerConfig.Value="http://apollo-testconfig.zq.com/eureka" where ServerConfig.Key="eureka.service.url";
    5. # 2.在portl库中增加支持fat环境和pro环境
    6. > update ApolloPortalDB.ServerConfig set Value='fat,pro' where Id=1;
    7. # 3.授权数据库访问用户
    8. > grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigProdDB.* to "apollo"@"10.4.7.%";
    9. > grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigTestDB.* to "apollo"@"10.4.7.%";

    1.4 变动原有资源配置启动

    1.4.1 修改portal的cm资源配置清单

    7.200运维机操作,增加两个新环境的支持
    1. cd /data/k8s-yaml/apollo-portal/
    2. sed -i '$a\ fat.meta=http://apollo-testconfig.zq.com' cm.yaml
    3. sed -i '$a\ pro.meta=http://apollo-prodconfig.zq.com' cm.yaml
    4. # 查看结果
    5. apollo-portal]# tail -4 cm.yaml
    6. apollo-env.properties: |
    7. dev.meta=http://apollo-config.zq.com
    8. fat.meta=http://apollo-testconfig.zq.com
    9. pro.meta=http://apollo-prodconfig.zq.com

    1.4.2 任意节点应用修改

    1. kubectl apply -f http://k8s-yaml.zq.com/apollo-portal/cm.yaml

    2 部署新环境的APOLLO服务

    7.200运维机操作,

    2.1 先创建出所需目录和文件

    1. cd /data/k8s-yaml
    2. mkdir -p test/{apollo-adminservice,apollo-configservice,dubbo-demo-server,dubbo-demo-consumer}
    3. mkdir -p prod/{apollo-adminservice,apollo-configservice,dubbo-demo-server,dubbo-demo-consumer}
    4. # 查看结果
    5. k8s-yaml]# ll {test,prod}
    6. prod:
    7. total 0
    8. drwxr-xr-x 2 root root 6 May 13 22:50 apollo-adminservice
    9. drwxr-xr-x 2 root root 6 May 13 22:50 apollo-configservice
    10. drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-consumer
    11. drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-server
    12. test:
    13. total 0
    14. drwxr-xr-x 2 root root 6 May 13 22:50 apollo-adminservice
    15. drwxr-xr-x 2 root root 6 May 13 22:50 apollo-configservice
    16. drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-consumer
    17. drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-server
    将之前的资源配置清单cp到对应环境的目录中,便于修改:
    1. cp /data/k8s-yaml/apollo-configservice/* ./test/apollo-configservice/
    2. cp /data/k8s-yaml/apollo-configservice/* ./prod/apollo-configservice/
    3. cp /data/k8s-yaml/apollo-adminservice/* ./test/apollo-adminservice/
    4. cp /data/k8s-yaml/apollo-adminservice/* ./prod/apollo-adminservice/

    2.2 部署test环境的configservice

    2.2.1 修改configmap资源清单

    要修改ns,数据库库名,eureka地址
    1. cd /data/k8s-yaml/test/apollo-configservice/
    2. sed -ri 's#(namespace:) infra#\1 test#g' cm.yaml
    3. sed -i 's#ApolloConfigDB#ApolloConfigTestDB#g' cm.yaml
    4. sed -i 's#apollo-config.zq.com#apollo-testconfig.zq.com#g' cm.yaml

    2.2.2 修改dp,ns,inress资源清单

    1. # 1.dp只需要修改namesapce空间
    2. sed -ri 's#(namespace:) infra#\1 test#g' dp.yaml
    3. # 2.svc同样只需要修改namespace
    4. sed -ri 's#(namespace:) infra#\1 test#g' svc.yaml
    5. # 3.ingress需要修改namespace和域名
    6. sed -ri 's#(namespace:) infra#\1 test#g' ingress.yaml
    7. sed -i 's#apollo-config.zq.com#apollo-testconfig.zq.com#g' ingress.yaml

    2.2.3 应用资源配置

    任意节点应用配置
    1. kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/cm.yaml
    2. kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/dp.yaml
    3. kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/svc.yaml
    4. kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/ingress.yaml
    浏览器检查
    浏览器输入http://apollo-testconfig.zq.com,查看测试环境的apollo注册中心是否已有服务注册K8S(12)配置中心实战-多环境交付apollo三组件 - 图1
    服务已经注册进来了

    2.3 部署test环境的adminservice

    2.3.1 修改configmap资源清单

    要修改ns,数据库库名,eureka地址
    1. cd /data/k8s-yaml/test/apollo-adminservice/
    2. sed -ri 's#(namespace:) infra#\1 test#g' cm.yaml
    3. sed -i 's#ApolloConfigDB#ApolloConfigTestDB#g' cm.yaml
    4. sed -i 's#apollo-config.zq.com#apollo-testconfig.zq.com#g' cm.yaml

    2.3.2 修改dp资源清单

    1. # 1.dp只需要修改namesapce空间
    2. sed -ri 's#(namespace:) infra#\1 test#g' dp.yaml

    2.3.3 应用资源配置清单

    1. kubectl apply -f http://k8s-yaml.zq.com/test/apollo-adminservice/cm.yaml
    2. kubectl apply -f http://k8s-yaml.zq.com/test/apollo-adminservice/dp.yaml
    浏览器检查:
    浏览器输入http://apollo-testconfig.zq.com,查看测试环境的apollo注册中心是否已有adminservice服务注册

    2.4 部署prod环境的configservice

    套路基本上都是一样使用的

    2.4.1 修改configmap资源清单

    要修改ns,数据库库名,eureka地址
    1. cd /data/k8s-yaml/prod/apollo-configservice/
    2. sed -ri 's#(namespace:) infra#\1 prod#g' cm.yaml
    3. sed -i 's#ApolloConfigDB#ApolloConfigProdDB#g' cm.yaml
    4. sed -i 's#apollo-config.zq.com#apollo-prodconfig.zq.com#g' cm.yaml

    2.4.2 修改dp,ns,inress资源清单

    1. # 1.dp只需要修改namesapce空间
    2. sed -ri 's#(namespace:) infra#\1 prod#g' dp.yaml
    3. # 2.svc同样只需要修改namespace
    4. sed -ri 's#(namespace:) infra#\1 prod#g' svc.yaml
    5. # 3.ingress需要修改namespace和域名
    6. sed -ri 's#(namespace:) infra#\1 prod#g' ingress.yaml
    7. sed -i 's#apollo-config.zq.com#apollo-prodconfig.zq.com#g' ingress.yaml

    2.4.3 应用资源配置

    任意节点应用配置
    1. kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/cm.yaml
    2. kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/dp.yaml
    3. kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/svc.yaml
    4. kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/ingress.yaml
    浏览器检查
    浏览器输入http://apollo-prodconfig.zq.com,查看测试环境的apollo注册中心是否已有服务注册K8S(12)配置中心实战-多环境交付apollo三组件 - 图2
    服务已经注册进来了

    2.5 部署prod环境的adminservice

    2.5.1 修改configmap资源清单

    要修改ns,数据库库名,eureka地址
    1. cd /data/k8s-yaml/prod/apollo-adminservice/
    2. sed -ri 's#(namespace:) infra#\1 prod#g' cm.yaml
    3. sed -i 's#ApolloConfigDB#ApolloConfigProdDB#g' cm.yaml
    4. sed -i 's#apollo-config.zq.com#apollo-prodconfig.zq.com#g' cm.yaml

    2.5.2 修改dp资源清单

    1. # 1.dp只需要修改namesapce空间
    2. sed -ri 's#(namespace:) infra#\1 prod#g' dp.yaml

    2.5.3 应用资源配置清单

    1. kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-adminservice/cm.yaml
    2. kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-adminservice/dp.yaml
    浏览器检查:
    浏览器输入http://apollo-prodconfig.zq.com,查看测试环境的apollo注册中心是否已有adminservice服务注册

    2.6 启动portal服务

    两个服务都已经注册进来了后,删除portal数据库中存储的关于之前项目的配置,再来启动portal项目

    2.6.1 清理数据库

    1. mysql -uroot -p123456
    2. > use ApolloPortalDB;
    3. > truncate table App;
    4. > truncate table AppNamespace;
    K8S(12)配置中心实战-多环境交付apollo三组件 - 图3

    2.6.2 启动portal

    1. kubectl apply -f http://k8s-yaml.zq.com/apollo-portal/cm.yaml
    2. kubectl apply -f http://k8s-yaml.zq.com/apollo-portal/dp.yaml
    3. kubectl apply -f http://k8s-yaml.zq.com/apollo-portal/svc.yaml
    4. kubectl apply -f http://k8s-yaml.zq.com/apollo-portal/ingress.yaml

    2.6.3 验证部署结果

    打开http://apollo-portal.zq.com,创建两个项目如下:
AppId 应用名称 部门
dubbo-demo-service dubbo服务提供者 研发部
dubbo-demo-web dubbo服务消费者 运维部

项目创建成功后,能看到左侧环境列表中有FATPRO,表示正确

2.6.4 添加test环境的配置

dubbo-demo-service

key value 备注
dubbo.registry zookeeper://zk-test.zq.com:2181 注册中心地址
dubbo.port 20880 dubbo服务监听端口

dubbo-demo-web

key value 备注
dubbo.registry zookeeper://zk-test.zq.com:2181 注册中心地址

2.6.5 添加prod环境的配置

dubbo-demo-service

key value 备注
dubbo.registry zookeeper://zk-prod.zq.com:2181 注册中心地址
dubbo.port 20880 dubbo服务监听端口

dubbo-demo-web

key value 备注
dubbo.registry zookeeper://zk-prod.zq.com:2181 注册中心地址

3 分环境交付dubbo服务

3.1 交付test环境dubbo服务

  1. cd /data/k8s-yaml/
  2. cp ./dubbo-server/* ./test/dubbo-demo-server/
  3. cp ./dubbo-consumer/* ./test/dubbo-demo-consumer/

3.1.1 修改server资源配置清单

只修改dp的ns配置和apollo配置

  1. cd /data/k8s-yaml/test/dubbo-demo-server
  2. sed -ri 's#(namespace:) app#\1 test#g' dp.yaml
  3. sed -i 's#Denv=dev#Denv=fat#g' dp.yaml
  4. sed -i 's#apollo-config.zq.com#apollo-testconfig.zq.com#g' dp.yaml

任意node应用资源清单:

  1. kubectl apply -f http://k8s-yaml.zq.com/test/dubbo-demo-server/dp.yaml

3.1.2 修改consumer资源配置清单

修改资源清单

  1. cd /data/k8s-yaml/test/dubbo-demo-consumer
  2. # 1.修改dp中的ns配置和apollo配置
  3. sed -ri 's#(namespace:) app#\1 test#g' dp.yaml
  4. sed -i 's#Denv=dev#Denv=fat#g' dp.yaml
  5. sed -i 's#apollo-config.zq.com#apollo-testconfig.zq.com#g' dp.yaml
  6. # 2.修改svc中的ns配置
  7. sed -ri 's#(namespace:) app#\1 test#g' svc.yaml
  8. # 3.修改ingress中的ns配置和域名
  9. sed -ri 's#(namespace:) app#\1 test#g' ingress.yaml
  10. sed -i 's#dubbo-demo.zq.com#dubbo-testdemo.zq.com#g' ingress.yaml

添加域名解析

由于最开始已经统一做了域名解析,这里就不单独添加了 如果没有添加域名解析的话,需要去添加dubbo-testdemo.zq.com的解析

任意node应用资源清单:

  1. kubectl apply -f http://k8s-yaml.zq.com/test/dubbo-demo-consumer/dp.yaml
  2. kubectl apply -f http://k8s-yaml.zq.com/test/dubbo-demo-consumer/svc.yaml
  3. kubectl apply -f http://k8s-yaml.zq.com/test/dubbo-demo-consumer/ingress.yaml

3.2 交付prod环境dubbo服务

  1. cd /data/k8s-yaml/
  2. cp ./dubbo-server/* ./prod/dubbo-demo-server/
  3. cp ./dubbo-consumer/* ./prod/dubbo-demo-consumer/

3.2.1 修改server资源配置清单

只修改dp的ns配置和apollo配置

  1. cd /data/k8s-yaml/prod/dubbo-demo-server
  2. sed -ri 's#(namespace:) app#\1 prod#g' dp.yaml
  3. sed -i 's#Denv=dev#Denv=pro#g' dp.yaml
  4. sed -i 's#apollo-config.zq.com#apollo-prodconfig.zq.com#g' dp.yaml

任意node应用资源清单:

  1. kubectl apply -f http://k8s-yaml.zq.com/prod/dubbo-demo-server/dp.yaml

3.2.2 修改consumer资源配置清单

修改资源清单

  1. cd /data/k8s-yaml/prod/dubbo-demo-consumer
  2. # 1.修改dp中的ns配置和apollo配置
  3. sed -ri 's#(namespace:) app#\1 prod#g' dp.yaml
  4. sed -i 's#Denv=dev#Denv=pro#g' dp.yaml
  5. sed -i 's#apollo-config.zq.com#apollo-prodconfig.zq.com#g' dp.yaml
  6. # 2.修改svc中的ns配置
  7. sed -ri 's#(namespace:) app#\1 prod#g' svc.yaml
  8. # 3.修改ingress中的ns配置和域名
  9. sed -ri 's#(namespace:) app#\1 prod#g' ingress.yaml
  10. sed -i 's#dubbo-demo.zq.com#dubbo-proddemo.zq.com#g' ingress.yaml

添加域名解析

由于最开始已经统一做了域名解析,这里就不单独添加了 如果没有添加域名解析的话,需要去添加dubbo-proddemo.zq.com的解析

任意node应用资源清单:

  1. kubectl apply -f http://k8s-yaml.zq.com/prod/dubbo-demo-consumer/dp.yaml
  2. kubectl apply -f http://k8s-yaml.zq.com/prod/dubbo-demo-consumer/svc.yaml
  3. kubectl apply -f http://k8s-yaml.zq.com/prod/dubbo-demo-consumer/ingress.yaml

3.3 关于dp中的apollo域名

  1. dp.yaml中配置的-Dapollo.meta=http://apollo-testconfig.zq.com
  2. 其实可以直接使用-Dapollo.meta=http://apollo-configservice:8080
  3. 也直接使用svc资源名称调用,这样还可以少走一次外网解析,相当于走内网
  4. 因为不同环境的apollo名称空间都不一样,而svc只在当前namespace中生效

K8S(12)配置中心实战-多环境交付apollo三组件 - 图4

4 验证并模拟发布

4.1 验证访问两个环境

分别访问以下域名,看是否可以出来网页内容
test:http://dubbo-testdemo.zq.com/hello?name=noah
prod:http://dubbo-proddemo.zq.com/hello?name=noah

4.2 模拟发版:

任意修改码云上的dubbo-demo-web项目的say方法返回内容
路径dubbo-client/src/main/java/com/od/dubbotest/action/HelloAction.java

4.2.1 用jenkins构建新镜像

参数如下:

参数名 参数值
app_name dubbo-demo-consumer
image_name app/dubbo-demo-consumer
git_repo git@gitee.com:noah-luo/dubbo-demo-web.git
git_ver apollo
add_tag 200513_1808
mvn_dir ./
target_dir ./dubbo-client/target
mvn_cmd mvn clean package -Dmaven.test.skip=true
base_image base/jre8:8u112
maven 3.6.1

4.2.2 发布test环境

构建成功,然后我们在测试环境发布此版本镜像
修改测试环境的dp.yaml

  1. cd /data/k8s-yaml/test/dubbo-demo-consumer
  2. sed -ri 's#(dubbo-demo-consumer:apollo).*#\1_200513_1808#g' dp.yaml

应用修改后的资源配置清单:

  1. kubectl apply -f http://k8s-yaml.zq.com/test/dubbo-demo-consumer/dp.yaml

访问http://dubbo-testdemo.zq.com/hello?name=noah看是否有我们更改的内容

4.2.3 发布prod环境

镜像在测试环境测试没有问题后,直接使用该镜像发布生产环境,不在重新打包,避免发生错误
同样修改prod环境的dp.yaml,并且应用该资源配置清单

  1. cd /data/k8s-yaml/prod/dubbo-demo-server
  2. sed -ri 's#(dubbo-demo-consumer:apollo).*#\1_200513_1808#g' dp.yaml

应用修改后的资源配置清单:

  1. kubectl apply -f http://k8s-yaml.zq.com/test/dubbo-demo-consumer/dp.yaml

已经上线到生产环境,这样一套完整的分环境使用apollo配置中心发布流程已经可以使用了,并且真正做到了一次构建,多平台使用