k8s容器云架构之dubbo微服务— K8S(12)配置中心实战-多环境交付apollo三组件

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 博客地址:https://www.cnblogs.com/sseban哔哩哔哩:https://space.bilibili.com/394449264k8s配置中心实战-多环境交付apollo三组件

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服务

kubectl delete -f http://k8s-yaml.zq.com/apollo-configservice/dp.yaml
kubectl delete -f http://k8s-yaml.zq.com/apollo-adminservice/dp.yaml
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两个环境的域名解析

vi /var/named/zq.com.zone
zk-test       A    10.4.7.11
zk-prod       A    10.4.7.12
apollo-testconfig A    10.4.7.10
apollo-prodconfig A    10.4.7.10
dubbo-testdemo    A    10.4.7.10
dubbo-proddemo    A    10.4.7.10
# 重启服务
systemctl restart named.service

1.2 namespace分环境

分别创建test 和prod两个名称空间

kubectl create ns test
kubectl create ns prod

给新名称空间创建secret授权

kubectl create secret docker-registry harbor \
    --docker-server=harbor.zq.com \
    --docker-username=harbor \
    --docker-password=Harbor12345 \
    -n test
kubectl create secret docker-registry harbor \
    --docker-server=harbor.zq.com \
    --docker-username=harbor \
    --docker-password=Harbor12345 \
    -n prod

1.3 数据库拆分

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

1.3.1 修改初始化脚本并导入

数据库再7.11上哦

分别创建ApolloConfigTestDB和ApolloConfigProdDB

# 复制为新sql
cp apolloconfig.sql apolloconfigTest.sql
cp apolloconfig.sql apolloconfigProd.sql
# 替换关键字
sed -i 's#ApolloConfigDB#ApolloConfigTestDB#g' apolloconfigTest.sql
sed -i 's#ApolloConfigDB#ApolloConfigProdDB#g' apolloconfigProd.sql
# 导入数据库
mysql -uroot -p123456 < apolloconfigTest.sql
mysql -uroot -p123456 < apolloconfigProd.sql

1.3.2 修改数据库中eureka地址

这里用到了两个新的域名,域名解析已经在添加zk域名那里一起加了

mysql -uroot -p123456
# 1.修改eureka注册中心配置
> update ApolloConfigProdDB.ServerConfig set ServerConfig.Value="http://apollo-prodconfig.zq.com/eureka" where ServerConfig.Key="eureka.service.url";
> update ApolloConfigTestDB.ServerConfig set ServerConfig.Value="http://apollo-testconfig.zq.com/eureka" where ServerConfig.Key="eureka.service.url";
# 2.在portl库中增加支持fat环境和pro环境
> update ApolloPortalDB.ServerConfig set Value='fat,pro' where Id=1;
# 3.授权数据库访问用户
> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigProdDB.* to "apollo"@"10.4.7.%";
> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigTestDB.* to "apollo"@"10.4.7.%";

1.4 变动原有资源配置启动

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

7.200运维机操作,增加两个新环境的支持

cd /data/k8s-yaml/apollo-portal/
sed -i '$a\    fat.meta=http://apollo-testconfig.zq.com' cm.yaml
sed -i '$a\    pro.meta=http://apollo-prodconfig.zq.com' cm.yaml
# 查看结果
apollo-portal]# tail -4 cm.yaml
  apollo-env.properties: |
    dev.meta=http://apollo-config.zq.com
    fat.meta=http://apollo-testconfig.zq.com
    pro.meta=http://apollo-prodconfig.zq.com

1.4.2 任意节点应用修改

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

2 部署新环境的APOLLO服务

7.200运维机操作,

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

cd /data/k8s-yaml
mkdir -p test/{apollo-adminservice,apollo-configservice,dubbo-demo-server,dubbo-demo-consumer}
mkdir -p prod/{apollo-adminservice,apollo-configservice,dubbo-demo-server,dubbo-demo-consumer}
# 查看结果
k8s-yaml]# ll {test,prod}
prod:
total 0
drwxr-xr-x 2 root root 6 May 13 22:50 apollo-adminservice
drwxr-xr-x 2 root root 6 May 13 22:50 apollo-configservice
drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-consumer
drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-server
test:
total 0
drwxr-xr-x 2 root root 6 May 13 22:50 apollo-adminservice
drwxr-xr-x 2 root root 6 May 13 22:50 apollo-configservice
drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-consumer
drwxr-xr-x 2 root root 6 May 13 22:50 dubbo-demo-server

将之前的资源配置清单cp到对应环境的目录中,便于修改:

cp /data/k8s-yaml/apollo-configservice/* ./test/apollo-configservice/
cp /data/k8s-yaml/apollo-configservice/* ./prod/apollo-configservice/
cp /data/k8s-yaml/apollo-adminservice/* ./test/apollo-adminservice/
cp /data/k8s-yaml/apollo-adminservice/* ./prod/apollo-adminservice/

2.2 部署test环境的configservice

2.2.1 修改configmap资源清单

要修改ns,数据库库名,eureka地址

cd /data/k8s-yaml/test/apollo-configservice/
sed -ri 's#(namespace:) infra#\1 test#g' cm.yaml
sed -i 's#ApolloConfigDB#ApolloConfigTestDB#g' cm.yaml
sed -i 's#apollo-config.zq.com#apollo-testconfig.zq.com#g' cm.yaml

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

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

2.2.3 应用资源配置

任意节点应用配置

kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/cm.yaml
kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/dp.yaml
kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/svc.yaml
kubectl apply -f http://k8s-yaml.zq.com/test/apollo-configservice/ingress.yaml

浏览器检查

浏览器输入http://apollo-testconfig.zq.com,查看测试环境的apollo注册中心是否已有服务注册

服务已经注册进来了

2.3 部署test环境的adminservice

2.3.1 修改configmap资源清单

要修改ns,数据库库名,eureka地址

cd /data/k8s-yaml/test/apollo-adminservice/
sed -ri 's#(namespace:) infra#\1 test#g' cm.yaml
sed -i 's#ApolloConfigDB#ApolloConfigTestDB#g' cm.yaml
sed -i 's#apollo-config.zq.com#apollo-testconfig.zq.com#g' cm.yaml

2.3.2 修改dp资源清单

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

2.3.3 应用资源配置清单

kubectl apply -f http://k8s-yaml.zq.com/test/apollo-adminservice/cm.yaml
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地址

cd /data/k8s-yaml/prod/apollo-configservice/
sed -ri 's#(namespace:) infra#\1 prod#g' cm.yaml
sed -i 's#ApolloConfigDB#ApolloConfigProdDB#g' cm.yaml
sed -i 's#apollo-config.zq.com#apollo-prodconfig.zq.com#g' cm.yaml

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

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

2.4.3 应用资源配置

任意节点应用配置

kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/cm.yaml
kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/dp.yaml
kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/svc.yaml
kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-configservice/ingress.yaml

浏览器检查

浏览器输入http://apollo-prodconfig.zq.com,查看测试环境的apollo注册中心是否已有服务注册

服务已经注册进来了

2.5 部署prod环境的adminservice

2.5.1 修改configmap资源清单

要修改ns,数据库库名,eureka地址

cd /data/k8s-yaml/prod/apollo-adminservice/
sed -ri 's#(namespace:) infra#\1 prod#g' cm.yaml
sed -i 's#ApolloConfigDB#ApolloConfigProdDB#g' cm.yaml
sed -i 's#apollo-config.zq.com#apollo-prodconfig.zq.com#g' cm.yaml

2.5.2 修改dp资源清单

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

2.5.3 应用资源配置清单

kubectl apply -f http://k8s-yaml.zq.com/prod/apollo-adminservice/cm.yaml
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 清理数据库

mysql -uroot -p123456
> use ApolloPortalDB;
> truncate table App;
> truncate table AppNamespace;

image.png

2.6.2 启动portal

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

2.6.3 验证部署结果

打开http://apollo-portal.zq.com,创建两个项目如下:

image.png

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

2.6.4 添加test环境的配置

dubbo-demo-service

image.png

2.6.5 添加prod环境的配置

dubbo-demo-service

image.png

dubbo-demo-web

image.png

3 分环境交付dubbo服务

3.1 交付test环境dubbo服务

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

3.1.1 修改server资源配置清单

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

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

任意node应用资源清单:

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

3.1.2 修改consumer资源配置清单

修改资源清单

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

添加域名解析

由于最开始已经统一做了域名解析,这里就不单独添加了

如果没有添加域名解析的话,需要去添加dubbo-testdemo.zq.com的解析

任意node应用资源清单:

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

3.2 交付prod环境dubbo服务

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

3.2.1 修改server资源配置清单

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

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

任意node应用资源清单:

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

3.2.2 修改consumer资源配置清单

修改资源清单

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

添加域名解析

由于最开始已经统一做了域名解析,这里就不单独添加了

如果没有添加域名解析的话,需要去添加dubbo-proddemo.zq.com的解析

任意node应用资源清单:

kubectl apply -f http://k8s-yaml.zq.com/prod/dubbo-demo-consumer/dp.yaml
kubectl apply -f http://k8s-yaml.zq.com/prod/dubbo-demo-consumer/svc.yaml
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中生效

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构建新镜像

参数如下:

image.png

4.2.2 发布test环境

构建成功,然后我们在测试环境发布此版本镜像

修改测试环境的dp.yaml

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

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

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,并且应用该资源配置清单

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

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

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

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
5天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
5天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
6天前
|
存储 监控 Docker
探索微服务架构下的容器化部署
本文旨在深入探讨微服务架构下容器化部署的关键技术与实践,通过分析Docker容器技术如何促进微服务的灵活部署和高效管理,揭示其在现代软件开发中的重要性。文章将重点讨论容器化技术的优势、面临的挑战以及最佳实践策略,为读者提供一套完整的理论与实践相结合的指导方案。
|
7天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
7天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
7天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
22天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
23天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
1月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
120 17

相关产品

  • 容器服务Kubernetes版