多套環(huán)境的數(shù)據(jù)庫隔離,域名訪問,差異化配置,香!快解鎖!
?本文主要介紹 Zadig 服務(wù)管理的變量配置能力,通過一套配置,實現(xiàn)多環(huán)境的隔離:
- 數(shù)據(jù)庫隔離:每個環(huán)境的業(yè)務(wù)數(shù)據(jù)獨立存放在不同的數(shù)據(jù)庫中,互不影響
- 差異化域名訪問:使用不同的域名地址訪問不同的環(huán)境
- 差異化業(yè)務(wù)配置:業(yè)務(wù)配置管理在 Nacos、Apollo 等配置中心,不同的環(huán)境使用不同的配置
數(shù)據(jù)庫隔離
適用:不同環(huán)境的業(yè)務(wù)數(shù)據(jù)互相隔離,一個數(shù)據(jù)庫對應(yīng)多個連接地址,或連接不同的數(shù)據(jù)庫均適用。
配置服務(wù)變量
如圖中 vote 服務(wù),該服務(wù)數(shù)據(jù)庫相關(guān)配置被管理在 ConfigMap 中的,并通過 volume 掛載到應(yīng)用中。在 Zadig 中,我們將數(shù)據(jù)庫配置項抽取為 Zadig 的全局變量 mgo_addr 和 mgo_db,并為其配置默認(rèn)值。
- mgo_addr 默認(rèn)值設(shè)置:220.16.0.43,可根據(jù)實際情況進(jìn)行配置。
- mgo_db 默認(rèn)值設(shè)置:$Product$_$EnvName$_vote ,這里我們用到了系統(tǒng)內(nèi)置全局變量 $Product$、$EnvName$,分別表示項目名稱和環(huán)境名稱。
變量配置生效
創(chuàng)建環(huán)境時,配置中的變量可以使用默認(rèn)值,也可以重新指定。
環(huán)境創(chuàng)建時,變量會被自動渲染,效果如下圖。在 dev 環(huán)境中被渲染為:simple-vote-service-dev-vote,qa 環(huán)境中被渲染為:simple-vote-service-qa-vote
圖例中服務(wù) K8s YAML 配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: vote
name: vote-rc-origin
spec:
replicas: 1
selector:
matchLabels:
app: vote
version: rc-origin
template:
metadata:
labels:
app: vote
version: rc-origin
spec:
containers:
- image: dockersamples/examplevotingapp_vote:before
name: vote-e2e
ports:
- containerPort: 80
name: vote
volumeMounts:
- name: config-volume
mountPath: /app/config
volumes:
- name: config-volume
configMap:
name: vote-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: vote-config
data:
SERVICE_MGO_ADDR: {{.mgo_addr}}
SERVICE_MGO_DB: {{.mgo_db}}
SERVICE_MGO_MODE: strong
差異化域名訪問
適用:在 Zadig 中創(chuàng)建多套環(huán)境,使用不同的域名訪問不同的環(huán)境
配置泛域名
給集群入口配置一個泛域名,比如:*.koderover.com,確保域名 DNS 正確解析到集群 Ingress 控制器 [1] LoadBalancer 的外網(wǎng) IP 上。
配置服務(wù)變量
此例中為業(yè)務(wù)入口配置外網(wǎng)訪問地址 host ,Zadig 中配置全局變量: {{.domain}},Value 設(shè)為:vote-$EnvName$.koderover.com
創(chuàng)建環(huán)境時,系統(tǒng)會自動渲染變量,效果圖示如下。
圖例中服務(wù)的 K8s YAML 配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: vote
name: vote-rc-origin
spec:
replicas: 1
selector:
matchLabels:
app: vote
version: rc-origin
template:
metadata:
labels:
app: vote
version: rc-origin
spec:
containers:
- image: dockersamples/examplevotingapp_vote:before
name: vote-e2e
ports:
- containerPort: 80
name: vote
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: vote
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 100m
spec:
rules:
- host: {{.domain}}
http:
paths:
- path: /
backend:
serviceName: vote
servicePort: 5000
差異化業(yè)務(wù)配置
適用:服務(wù)的業(yè)務(wù)配置在第三方配置中心管理(比如 Nacos、Apollo 等),不同環(huán)境使用不同的配置項。下面以一套 Apollo 配置中心舉例,通過 Zadig 管理和使用不同環(huán)境的業(yè)務(wù)配置。
配置服務(wù)變量
以 myapp 服務(wù)為例,我們需要在 Zadig 中設(shè)置 Apollo 配置參數(shù)與 Zadig 環(huán)境變量的對應(yīng)關(guān)系。
在 Zadig 中定義的配置項(可以根據(jù)情況進(jìn)行設(shè)置):
- APOLLO_APP_NAMESPACE:Apollo 配置中心的命名空間(Namespace),使用 Zadig 自定義變量 apollo_app_namespace 為其賦值,默認(rèn)值設(shè)為 zadig.dev
- APOLLO_APP_ID:Apollo 配置中心的應(yīng)用(Application),使用 Zadig 系統(tǒng)內(nèi)置變量 $Service$ 為其賦值。
- APOLLO_APP_ENV:Apollo 配置中心的環(huán)境(Enviroment),使用 Zadig 系統(tǒng)內(nèi)置變量 $EnvName$ 為其賦值。
- APOLLO_APP_CLUSTER:Apollo 配置中心中的集群(Cluster),用 Zadig 自定義變量 apollo_app_cluster 為其賦值,默認(rèn)值設(shè)為 local。
變量配置生效
當(dāng)環(huán)境拉起或myapp 服務(wù)啟動時,會去相應(yīng)的配置中心獲取服務(wù)配置。
uat 環(huán)境效果:
qa 環(huán)境效果:
圖例中服務(wù)的 K8s YAML 配置如下:
apiVersion: v1
kind: Service
metadata:
name: a
labels:
app: a
spec:
ports:
- name: http
port: 80
targetPort: 8080
selector:
app: a
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: a
labels:
app: a
spec:
selector:
matchLabels:
app: a
replicas: 1
template:
metadata:
labels:
app: a
spec:
containers:
- name: myapp-1
image: koderover.tencentcloudcr.com/koderover-demo/myapp-1:v0.1__linux_amd64
imagePullPolicy: Always
command: ["/myapp-1"]
args: ["--downstream-addr", "$(DOWNSTREAM_ADDR)", "--headers", "$(HEADERS)"]
env:
- name: DOWNSTREAM_ADDR
value: "b"
- name: HEADERS
value: "x-request-id"
- name: APOLLO_APP_NAMESPACE
value: {{.apollo_app_namespace}}
- name: APOLLO_APP_ID
value: $Service$
- name: APOLLO_APP_ENV
value: $EnvName$
- name: APOLLO_APP_CLUSTER
value: {{.apollo_app_cluster}}
ports:
- containerPort: 8080
resources:
limits:
cpu: 100m
memory: 100Mi
小結(jié)?
本文主要闡述了如何使用 Zadig 中的變量能力來更高效的配置環(huán)境,只需要維護(hù)一份配置就可以實現(xiàn)不同環(huán)境的業(yè)務(wù)數(shù)據(jù)隔離、差異化域名、差異化業(yè)務(wù)配置等能力。當(dāng)環(huán)境數(shù)量需求高時,可大大降低服務(wù)配置的管理負(fù)擔(dān)。除了文中提及到的變量,可閱 變量配置 | Zadig 文檔 [2] 解鎖更多。社區(qū)小伙伴日常使用中還發(fā)現(xiàn)哪些讓人 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/#變量配置?