獨立配置中心k8s作為配置中心" />

国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

摸魚心法第一章——和配置文件說拜拜

來源: 責編: 時間:2023-08-05 11:44:34 5155觀看
導讀為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配置中心的區別
獨立配置中心k8s作為配置中心

為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

對比就對比,簡單對比下獨立配置中心和k8s作為配置中心的區別D1928資訊網——每日最新資訊28at.com


D1928資訊網——每日最新資訊28at.com

獨立配置中心D1928資訊網——每日最新資訊28at.com

k8s作為配置中心D1928資訊網——每日最新資訊28at.com

學習成本D1928資訊網——每日最新資訊28at.com

1.運維要學習搭建、維護D1928資訊網——每日最新資訊28at.com

2.研發和研發都需要學習配置中心的工具、系統如何使用D1928資訊網——每日最新資訊28at.com

1.熟悉yaml/json語法即D1928資訊網——每日最新資訊28at.com

2.研發只需要解析環境變量,無需關注注入細節D1928資訊網——每日最新資訊28at.com

適配工作量D1928資訊網——每日最新資訊28at.com

  1. 代碼需要引入對應配置中心的庫進行開發
  2. 需要在對應的配置中心管理

  1. 服務直接解析環境變量即可
  2. k8s原生支持環境變量,并且支持通過configmap,secret資源注入到服務的環境變量中

集群維護成本D1928資訊網——每日最新資訊28at.com

額外維護成本D1928資訊網——每日最新資訊28at.com

保證集群etcd穩定即可,無額外成本D1928資訊網——每日最新資訊28at.com

服務發現D1928資訊網——每日最新資訊28at.com

支持服務發現D1928資訊網——每日最新資訊28at.com

支持服務發現D1928資訊網——每日最新資訊28at.com

云資源費用D1928資訊網——每日最新資訊28at.com

增加成本D1928資訊網——每日最新資訊28at.com

無額外成本D1928資訊網——每日最新資訊28at.com

對比結果出來后,群里的研發也覺得k8s作為配置中心不錯了D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

我這里想問問在看文章的同學:是不是都覺得運維的東西很簡單?還有是不是個鍋都甩給運維?像這樣的研發你身邊多么還是說你也是這樣的研發? D1928資訊網——每日最新資訊28at.com

繼續今天的話題,既然服務要在k8s里運行,同時也要把k8s作為配置中心使用,那服務適配需要做些啥? 咱們先列一個清單D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

服務要優雅的適配容器化環境,需要解決以下問題D1928資訊網——每日最新資訊28at.com

  • 避免繁瑣的定義和解析服務環境變量
  • 服務在本地調試下和容器環境運行兩種場景下,對于環境變量的解析需要無縫切換
  • 服務的dockerfile可根據服務信息自動生成,盡量避免人工操作

1.首先說環境變量的問題

從本地開發和容器運行兩個角度來看,本地開發的時候讀取配文件比讀取環境變量方便,容器運行中讀取環境變量比讀取配置文件方便,我想說你倆擱這卡bug呢?D1928資訊網——每日最新資訊28at.com

但是這個問題其實不難,解決邏輯也很簡單。那就是采用覆寫的思路,如果環境變量里讀取到了值就用環境變量的,否則就用代碼里的值。D1928資訊網——每日最新資訊28at.com

那按照這個思路是得有一個配置文件,然后服務讀取這個配置文件?可惜這個和我們團隊的一個追求相違背——代碼及文檔D1928資訊網——每日最新資訊28at.com

說到文檔,插個題外話,對于寫文檔這事兒。。。D1928資訊網——每日最新資訊28at.com

看別人的東西,你TM文檔呢? D1928資訊網——每日最新資訊28at.com

做自己的東西,這TM還用寫文檔?D1928資訊網——每日最新資訊28at.com

回到環境變量這個問題來,其實在代碼里面定義變量并提供覆寫的能力就足夠了。考慮到在本地開發調試的時候,需要頻繁修改變量的值,無論是修改代碼里的變量值或者修改環境變量還是稍顯麻煩,所以覆寫的信息可以來源于環境變量或一個覆寫的變量文件D1928資訊網——每日最新資訊28at.com

流程如下D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

針對提供反射機制的編程語言結合一定的規則,環境變量的key可以直接從定義的結構體里獲取無需額外維護。無反射類型的編程語言也可以按照這個思路實現,只是稍顯麻煩。這樣環境變量的問題解決了,然后就是dockerfile的問題D1928資訊網——每日最新資訊28at.com

2.dockerfile如何自動生成

我們再看看剛才列的清單D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

首先說說核心問題如何編譯,有兩種方式D1928資訊網——每日最新資訊28at.com

1.直接在dockerfile里面寫編譯過程

直接手寫dockerfile沒有問題,因為服務的開發人員最清楚自己的服務需要怎么編譯,但是不同的服務總會出現差異化的編譯過程,這樣從代碼自動生成dockerfile的角度來講不可控D1928資訊網——每日最新資訊28at.com

2.makefile文件

通過makefile來執行編譯步驟就解決了差異化的問題,在dockerfile里只需要執行類似make build的固定命令便完成了服務編譯全過程。自動化工具按照固定的dockerfile模板生成文件,makefile完成具體的編譯過程,這樣服務編譯與工具完美解耦D1928資訊網——每日最新資訊28at.com

核心問題解決了,至于dockerfile如何生成,每種編程語言都可以采用自身語言提供的模板庫進行生成dockerfile了。即便不用模板,拼接字符串也是可以的,條條大路通羅馬。D1928資訊網——每日最新資訊28at.com

然后我們再談談為什么會有編譯鏡像和運行鏡像的區別,我們看看下面這個流程D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

從流程可以看出,服務在k8s里面啟動時會從鏡像倉庫拉去服務鏡像,這里存在一個網絡傳輸的問題,內網都不說了,如果從公網拉鏡像,并發量高一點,拉的再頻繁點,不管是固定帶寬還是按流量計費,老話說得好,這不就是小刀剌了貔貅腚——拉的都是錢D1928資訊網——每日最新資訊28at.com

所以我們期望的是鏡像足夠小,這樣在部署服務的時候更快更省錢,尤其是首次部署的時候(這里涉及到docker 分層的問題不做展開)。編譯鏡像一般都非常龐大并不適合作為運行鏡像使用,只需要提供編譯環境,編譯完成后將編譯后的文件放入一個很小的運行鏡像中即可D1928資訊網——每日最新資訊28at.com

以我們團隊采用的是Golang語言為例,編譯鏡像目前采用的1.20.5-buster,AMD64的鏡像大小為275M,ARM的鏡像大小為264M,運行鏡像采用的是gcr.io/distroless/static-debian11,最終運行鏡像大小在20M左右,這不得起飛了啊,拉鏡像就跟玩兒一樣。D1928資訊網——每日最新資訊28at.com

好了,今天的文章主要分享了在容器化環境下,通過拋棄服務配置文件而采用環境變量的形式來解決配置注入的問題,自動生成dockerfile需要避免的坑,希望對在走容器化道路的同學有所幫助。如果大家想聽聽其他的可以留言或者私信我們。D1928資訊網——每日最新資訊28at.com

接下來就是Golang的福利時間,我們將這個變量注入的庫進行了開源。現在用gin框架寫個demo來演示環境變量注入和生成dockerfile。(我們在gin框架上加了一點點東西,這樣更好用)D1928資訊網——每日最新資訊28at.com

首先創建一個工程目錄D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

global/config.go這個文件長這樣D1928資訊網——每日最新資訊28at.com

package globalimport (  "github.com/kunlun-qilian/conflogger"  "github.com/kunlun-qilian/confserver"  "github.com/kunlun-qilian/confx")func init() {  confx.SetConfX("demo-docker", "..")  confx.ConfP(&Config)}var Config = struct {  Logger  *conflogger.Log  Server  *confserver.Server  TestEnv string `env:""`# 環境變量標記,只要有這個標記則支持注入}{  Server: &confserver.Server{    Port: 80,    Mode: "debug",  },  TestEnv: "123",}
github.com/kunlun-qilian/confx這個庫的作用就是注入環境變量和生成dockerfile,單獨出來了一個庫,只要是這個工程目錄結構都可以使用

運行之后會生成config/default.yml,這個環境變量文件就是每次啟動服務后根據上述global/config.go文件自動生成的默認配置文件,這個文件是作為后續本地覆寫配置文件的藍本,免得不知道環境變量是啥,環境變量規則是“服務名__環境變量名”D1928資訊網——每日最新資訊28at.com

DEMO_DOCKER__Logger_Level: ""DEMO_DOCKER__Logger_Output: AlwaysDEMO_DOCKER__Server_Mode: debugDEMO_DOCKER__Server_UseH2C: "false"DEMO_DOCKER__TestEnv: "123"

demo里加入了一個接口來返回TestEnv的值D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

在本地開發的時候需要覆寫默認值的時候,只需要在config目錄下加入一個叫做 local.yml(這個放gitignore里)的文件并添加想替換的值D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

重新運行一下服務,再看接口,變量被local.yml里面的值替換了D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com

然后我們再通過當前命令行會話中注入一個環境變量,然后啟動D1928資訊網——每日最新資訊28at.com

export DEMO_DOCKER__TestEnv=terminal_789 && go run main.go

值又被替換成了環境變量的值,有了這個還要啥自行車?D1928資訊網——每日最新資訊28at.com

圖片圖片D1928資訊網——每日最新資訊28at.com


再看看生成的dockerfile,下面這個就是自動生成的默認dockerfileD1928資訊網——每日最新資訊28at.com

FROM dockerproxy.com/library/golang:1.20-buster AS build-envFROM build-env AS builderWORKDIR /go/srcCOPY ./ ./# buildRUN make build WORKSPACE=demo-docker# runtimeFROM gcr.dockerproxy.com/distroless/static-debian11COPY --from=builder /go/src/cmd/demo-docker/demo-docker /go/bin/demo-dockerEXPOSE 80ARG PROJECT_NAMEARG PROJECT_VERSIONENV PROJECT_NAME=${PROJECT_NAME} PROJECT_VERSION=${PROJECT_VERSION}WORKDIR /go/binENTRYPOINT ["/go/bin/demo-docker"]

上文中提到的幾個配置信息,咱們定義了一個結構,包含了編譯鏡像,運行鏡像,GOPROXY代理,openapi文件,奧,差點忘了這篇不涉及到openapi,篇幅有限這個在后續篇章里講,你們懂的D1928資訊網——每日最新資訊28at.com

type DockerConfig struct {  BuildImage   string  RuntimeImage string  GoProxy      GoProxyConfig  Openapi      bool}type GoProxyConfig struct {  ProxyOn bool  Host    string}

在global/config.go中的init方法中,留了入口D1928資訊網——每日最新資訊28at.com

func init() {  confx.SetConfX("demo-docker", "..", confx.DockerConfig{    BuildImage:   "private-harbor.xxx.com/xxx/builder:v1.0.0",    RuntimeImage: "private-harbor.xxx.com/xxx/runtime:v1.0.0",    GoProxy: confx.GoProxyConfig{      ProxyOn: true,      Host:    "https://goproxy.cn,direct",    },  })  confx.ConfP(&Config)}

然后我們再重新運行一下看看結果,編譯鏡像、運行鏡像、代理都更新了D1928資訊網——每日最新資訊28at.com

FROM private-harbor.xxx.com/xxx/builder:v1.0.0 AS build-envFROM build-env AS builderARG GOPROXY=https://goproxy.cn,directWORKDIR /go/srcCOPY ./ ./# buildRUN make build WORKSPACE=demo-docker# runtimeFROM private-harbor.xxx.com/xxx/runtime:v1.0.0COPY --from=builder /go/src/cmd/demo-docker/demo-docker /go/bin/demo-dockerEXPOSE 80ARG PROJECT_NAMEARG PROJECT_VERSIONENV PROJECT_NAME=${PROJECT_NAME} PROJECT_VERSION=${PROJECT_VERSION}WORKDIR /go/binENTRYPOINT ["/go/bin/demo-docker"]

如果服務有多個端口怎么處理?還是從global/config.go中下手,增加一個 TestPort 的變量,tag中加上 `env:"opt,expose"`D1928資訊網——每日最新資訊28at.com

var Config = struct {  Logger  *conflogger.Log  Server  *confserver.Server  TestEnv string `env:""`  TestPort int `env:"opt,expose"` # 看這里,看這里}{  Server: &confserver.Server{    Port: 80,    Mode: "debug",  },  TestEnv:  "123",  TestPort: 9090,}

然后咱們再運行一次,9090端口暴露出來了,這帶手表了,帶啥手表了?D1928資訊網——每日最新資訊28at.com

FROM private-harbor.xxx.com/xxx/builder:v1.0.0 AS build-envFROM build-env AS builderARG GOPROXY=https://goproxy.cn,directWORKDIR /go/srcCOPY ./ ./# buildRUN make build WORKSPACE=demo-docker# runtimeFROM private-harbor.xxx.com/xxx/runtime:v1.0.0COPY --from=builder /go/src/cmd/demo-docker/demo-docker /go/bin/demo-dockerEXPOSE 9090EXPOSE 80ARG PROJECT_NAMEARG PROJECT_VERSIONENV PROJECT_NAME=${PROJECT_NAME} PROJECT_VERSION=${PROJECT_VERSION}WORKDIR /go/binENTRYPOINT ["/go/bin/demo-docker"]

最后貼上全球最大同。。不對,是github鏈接,后續我們還會逐步開源一些工具D1928資訊網——每日最新資訊28at.com

工具包confx: https://github.com/kunlun-qilian/confx本文的demo:  https://github.com/kunlun-qilian/gin-demo


D1928資訊網——每日最新資訊28at.com

本文鏈接:http://www.rrqrq.com/showinfo-26-79-0.html摸魚心法第一章——和配置文件說拜拜

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Rust中的高吞吐量流處理

下一篇: 掘力計劃第 20 期:Flutter 混合開發的混亂之治

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
成人激情午夜影院| 亚洲一二三四久久| 一区二区三区日本| 国产精品v欧美精品v日本精品动漫| 在线观看视频一区二区| 亚洲日穴在线视频| 国产精品xnxxcom| 久久影音资源网| 懂色av一区二区夜夜嗨| 日韩亚洲电影在线| 国产精品羞羞答答xxdd | 在线看一区二区| 日韩制服丝袜av| 久久国产直播| 亚洲超丰满肉感bbw| 一区二区三区免费看| 亚洲人成7777| 一区二区国产日产| 亚洲一区二区在线视频| 亚洲人久久久| 亚洲免费观看高清完整版在线 | 国产精品久久综合| 欧美日韩综合网| 中文字幕的久久| 国产精品二区在线| 中文字幕亚洲区| 日韩视频在线观看国产| 亚洲毛片av在线| 亚洲激情一区| 一区二区在线看| 久久久久看片| 另类的小说在线视频另类成人小视频在线 | 欧美日韩视频一区二区三区| 国产三级精品三级| 国产精品jizz在线观看美国| 国产精品久久久久久福利一牛影视| 91免费观看视频| 亚洲国产精品精华液2区45| 国产综合亚洲精品一区二| 综合亚洲深深色噜噜狠狠网站| 国产一区日韩欧美| 日韩久久一区二区| 亚洲女同在线| 久久精品国产精品亚洲精品 | 久久久国产综合精品女国产盗摄| 欧美日本亚洲韩国国产| 国产精品的网站| 国产亚洲成人一区| 日本欧美一区二区在线观看| 欧美人狂配大交3d怪物一区| 国产裸体歌舞团一区二区| 精品国产一区二区三区忘忧草| 91美女精品福利| ...xxx性欧美| 久久天天狠狠| 国产高清不卡二三区| 国产女同互慰高潮91漫画| 99成人在线| 蜜臀a∨国产成人精品| 欧美一区二区三区电影| 欧美高清不卡| 亚洲乱码中文字幕| 91高清在线观看| 国产成人8x视频一区二区| 国产日韩视频一区二区三区| 国产精品v欧美精品v日本精品动漫 | 亚洲精品1234| 日本中文字幕一区二区视频| 91精品欧美综合在线观看最新| 欧美在线日韩精品| 一区二区三区高清在线| 在线观看视频一区| 99精品视频免费在线观看| 亚洲精品日韩一| 欧美日韩在线三级| eeuss影院一区二区三区| 亚洲欧美一区二区三区国产精品 | 亚洲欧美另类图片小说| 一本久久综合亚洲鲁鲁五月天| 国产风韵犹存在线视精品| 国产精品久久久久久久久免费桃花| 久久成人精品| 国产凹凸在线观看一区二区| 国产欧美一区二区三区沐欲| 久久精品九九| 成人免费av在线| 一区二区三区成人在线视频| 欧美精品日韩精品| 欧美日韩国产综合在线| 日韩精品一卡二卡三卡四卡无卡| 日韩视频永久免费| 亚洲免费不卡| 国产一区 二区 三区一级| 国产精品福利av| 欧美日韩综合一区| 黄色一区二区三区四区| 美女免费视频一区二区| 国产亚洲女人久久久久毛片| 美女图片一区二区| 成人av免费在线观看| 亚洲综合激情小说| 精品国产电影一区二区| 久久精品二区三区| 欧美激情在线| 极品少妇xxxx精品少妇| 自拍视频在线观看一区二区| 69堂亚洲精品首页| 国产日韩欧美一区| 国产成人无遮挡在线视频| 亚洲欧美国产77777| 欧美一区二区在线不卡| 国产一区二区三区奇米久涩| 成人看片黄a免费看在线| 午夜精品一区二区三区电影天堂 | 日韩久久久精品| 国产日韩欧美| 99视频超级精品| 麻豆成人综合网| 亚洲人成网站色在线观看| 日韩精品一区二区在线| 久久国产精品久久精品国产| 91麻豆自制传媒国产之光| 久久精品国产久精国产| 一区二区三区四区视频精品免费 | 亚洲激情欧美激情| 久久综合九色综合97婷婷女人| 久久综合九色综合久99| 欧美日韩在线一区二区三区| 国产精品中文字幕欧美| 天堂在线亚洲视频| 综合色天天鬼久久鬼色| 精品国产乱码久久久久久久久| 欧美丝袜自拍制服另类| 国产日韩亚洲| 欧美日韩高清免费| 国产一区二区在线观看免费| 亚洲大片在线观看| 国产精品第一页第二页第三页| 日韩亚洲欧美中文三级| 欧美性极品少妇| 国产免费成人| 国产精品v欧美精品v日韩精品| 国产成人免费9x9x人网站视频| 秋霞午夜av一区二区三区| 亚洲一区视频在线| 中文字幕一区视频| 国产亚洲精品aa午夜观看| 日韩欧美123| 欧美日韩国产高清一区二区三区 | 一本色道88久久加勒比精品| 午夜久久福利| aaa国产一区| 懂色av中文字幕一区二区三区| 久久99精品久久久久久国产越南| 天天综合色天天综合色h| 一区二区三区精品视频| 亚洲欧洲综合另类在线| 国产精品乱人伦| 国产日韩精品久久久| xf在线a精品一区二区视频网站| 欧美精品123区| 欧美网站一区二区| 91久久国产最好的精华液| 国产美女精品| 国产一区二区三区久久久久久久久| 国内精品福利| 红桃视频亚洲| 国产精品a级| 欧美午夜影院| 欧美日韩天天操| 欧美另类高清视频在线| 91麻豆免费视频| 欧美一区精品| 91麻豆国产香蕉久久精品| bt7086福利一区国产| 波多野结衣中文字幕一区二区三区| 福利电影一区二区| 大胆欧美人体老妇| 成人精品亚洲人成在线| 国产99久久久国产精品免费看 | 欧美一区二区三区视频免费播放| 欧美艳星brazzers| 欧美偷拍一区二区| 欧美三级一区二区| 欧美精品乱码久久久久久| 制服丝袜中文字幕亚洲| 日韩视频一区二区三区在线播放 | 亚洲一本大道在线| 亚洲国产精品久久人人爱| 亚洲一级电影视频| 日韩精品五月天| 日韩不卡手机在线v区| 另类综合日韩欧美亚洲| 国产乱子轮精品视频| 国产成人免费xxxxxxxx| 成人白浆超碰人人人人| 91在线高清观看| 欧美少妇一区| 亚洲人www| 久久福利毛片|