多套環境的數據庫隔離,域名訪問,差異化配置,香!快解鎖!
?本文主要介紹 Zadig 服務管理的變量配置能力,通過一套配置,實現多環境的隔離:
- 數據庫隔離:每個環境的業務數據獨立存放在不同的數據庫中,互不影響
- 差異化域名訪問:使用不同的域名地址訪問不同的環境
- 差異化業務配置:業務配置管理在 Nacos、Apollo 等配置中心,不同的環境使用不同的配置
數據庫隔離
適用:不同環境的業務數據互相隔離,一個數據庫對應多個連接地址,或連接不同的數據庫均適用。
配置服務變量
如圖中 vote 服務,該服務數據庫相關配置被管理在 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
圖例中服務 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 中創建多套環境,使用不同的域名訪問不同的環境
配置泛域名
給集群入口配置一個泛域名,比如:*.koderover.com,確保域名 DNS 正確解析到集群 Ingress 控制器 [1] LoadBalancer 的外網 IP 上。
配置服務變量
此例中為業務入口配置外網訪問地址 host ,Zadig 中配置全局變量: {{.domain}},Value 設為:vote-$EnvName$.koderover.com
創建環境時,系統會自動渲染變量,效果圖示如下。
圖例中服務的 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
差異化業務配置
適用:服務的業務配置在第三方配置中心管理(比如 Nacos、Apollo 等),不同環境使用不同的配置項。下面以一套 Apollo 配置中心舉例,通過 Zadig 管理和使用不同環境的業務配置。
配置服務變量
以 myapp 服務為例,我們需要在 Zadig 中設置 Apollo 配置參數與 Zadig 環境變量的對應關系。
在 Zadig 中定義的配置項(可以根據情況進行設置):
- APOLLO_APP_NAMESPACE:Apollo 配置中心的命名空間(Namespace),使用 Zadig 自定義變量 apollo_app_namespace 為其賦值,默認值設為 zadig.dev
- APOLLO_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 環境效果:
圖例中服務的 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
小結?
本文主要闡述了如何使用 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/#變量配置?