本文主要介绍Zadig服务管理的可变配置能力。通过一套配置,实现多种环境的隔离:数据库隔离:各个环境的业务数据独立存储在不同的数据库中,互不影响差异化的域名访问:使用不同的域名地址访问不同的环境差异化的业务配置:业务配置管理在Nacos、Apollo等配置中心,不同环境使用不同的配置数据库进行隔离:不同环境的业务数据相互隔离,一个数据库对应多个连接地址,或者连接到不同的数据库适用。如投票服务所示配置服务变量。服务数据库的相关配置在ConfigMap中进行管理,通过volume挂载到应用中。在Zadig中,我们将数据库配置项抽取出来作为Zadig的全局变量mgo_addr和mgo_db,并为其配置默认值。mgo_addr默认设置为220.16.0.43,可根据实际情况配置。mgo_db默认值设置:$Product$_$EnvName$_vote,这里我们使用系统内置的全局变量$Product$、$EnvName$,分别代表项目名称和环境名称。变量配置生效创建环境时,配置中的变量可以使用默认值,也可以重新指定。创建环境时,会自动渲染变量,如下图所示。在dev环境中,呈现为:simple-vote-service-dev-vote,在qa环境中,呈现为:simple-vote-service-qa-vote。图例中服务K8sYAML配置如下:apiVersion:apps/v1kind:Deploymentmetadata:labels:app:votename:vote-rc-originspec:replicas:1selector:matchLabels:app:voteversion:rc-origintemplate:元数据:标签:应用程序:投票版本:rc-origin规范:容器:-图像:dockersamples/examplevotingapp_vote:在名称之前:vote-e2e端口:-containerPort:80名称:votevolumeMounts:-名称:config-volumemountPath:/app/配置卷:-名称:配置卷configMap:名称:投票配置---apiVersion:v1kind:ConfigMap元数据:名称:投票配置数据:SERVICE_MGO_ADDR:{{.mgo_addr}}SERVICE_MGO_DB:{{.mgo_db}}SERVICE_MGO_MODE:strong适用于差异化域名访问:在Zadig中创建多个环境,使用不同的域名访问配置不同环境下的泛域名为集群入口配置一个泛域名,如:*.koderover.com,保证域名DNS正确解析到集群Ingress控制器[1]负载均衡器在外网IP上配置服务变量。本例中业务入口配置外网访问地址host,在zadig中配置全局变量:{{.domain}},Value设置为:vote-$EnvName$.koderover.com时创建环境,系统会自动渲染变量,效果图如下。图例中服务的K8sYAML配置如下:apiVersion:apps/v1kind:Deploymentmetadata:labels:app:votename:vote-rc-originspec:replicas:1selector:matchLabels:app:voteversion:rc-origin模板:元数据:标签:应用程序:投票版本:rc-origin规范:容器:-图像:dockersamples/examplevotingapp_vote:在名称之前:投票-e2e端口:-containerPort:80名称:投票---apiVersion:扩展/v1beta1kind:Ingressmetadata:name:voteannotations:nginx.ingress.kubernetes.io/proxy-body-size:100mspec:rules:-host:{{.domain}}http:paths:-path:/backend:serviceName:voteservicePort:5000区分业务配置适用:服务的业务配置在第三方配置中心(如Nacos、Apollo等)进行管理,不同的环境使用不同的配置项。下面以一套Apollo配置中心为例,通过Zadig管理和使用不同环境下的业务配置。配置服务变量以myapp服务为例,我们需要在Zadig中设置Apollo配置参数与Zadig环境变量的对应关系。Zadig中定义的配置项(可根据情况设置):APOLLO_APP_NAMESPACE:Apollo配置中心的命名空间(Namespace),使用Zadig自定义变量apollo_app_namespace为其赋值,默认值设置为zadig。devAPOLLO_APP_ID:Apollo配置中心的应用(Application),使用Zadig系统内置变量$Service$为其赋值。APOLLO_APP_ENV:Apollo配置中心的环境(Enviroment),使用Zadig系统内置变量$EnvName$为其赋值。APOLLO_APP_CLUSTER:Apollo配置中心的Cluster,使用Zadig自定义变量apollo_app_cluster为其赋值,默认值设置为local。变量配置生效当环境拉起或者myapp服务启动时,会去对应的配置中心获取服务配置。uat环境效果:qa环境效果:图例中服务的K8sYAML配置如下:apiVersion:v1kind:Servicemetadata:name:alabels:app:aspec:ports:-name:httpport:80targetPort:8080selector:app:a---apiVersion:apps/v1kind:Deploymentmetadata:name:alabels:app:aspec:selector:matchLabels:app:areplicas:1template:metadata:labels:app:aspec:containers:-name:myapp-1图像:koderover.tencentcloudcr.com/koderover-demo/myapp-1:v0.1__linux_amd64imagePullPolicy:Always命令:["/myapp-1"]args:["--downstream-addr","$(DOWNSTREAM_ADDR)","--headers","$(HEADERS)"]env:-名称:DOWNSTREAM_ADDR值:"b"-名称:HEADERS值:"x-request-id"-名称:APOLLO_APP_NAMESPACE值:{{.apollo_app_namespace}}-名称:APOLLO_APP_ID值:$Service$-名称:APOLLO_APP_ENV值:$EnvName$-name:APOLLO_APP_CLUSTERvalue:{{.apollo_app_cluster}}ports:-containerPort:8080resources:limits:cpu:100mmemory:100Mi总结本文主要讲解如何使用Zadig中的可变能力更高效的配置环境.只需要维护一个配置,就可以实现不同环境下业务数据的隔离,差异化的域名,差异化的业务配置。当环境数量多时,可以大大减轻服务配置的管理负担。除了文中提到的变量,见变量配置|Zadig文档[2]以解锁更多内容。社区成员在日常使用中也会发现一些Aha或不舒服的姿势。欢迎戳论坛https://community.koderover.com/top分享你的场景~参考链接:[1]https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/[2]https://docs.koderover.com/zadig/v1.13.0/project/service/k8s/#变量配置
