k8s常用資源之pod資源(三)
1052
2025-04-04
一 最佳實踐
Plan before Apply/Stage before Prod
在正式應用資源清單錢,先plan,為保障線上安全,需要現在dev/stage環境測試,再上prod
環境隔離(global/stage/prod/mgmt)
單個環境進行隔離
每個目錄單獨.tfstate
每個目錄單獨.tfstate 狀態管理,避免項目沖突與混亂
目錄間使用terraofrm_remote_state共享狀態
功能組件分離(web/db…)
使用模塊modules
Version Constraints
variable中添加validation rules
使用帶模版的模塊(git ref)
將模塊代碼放到單獨Repo
Remote state存儲使用加密,并啟用版本(S3 Versioning)
TF模版中避免硬編碼(eg:使用date獲取vpc_id/account_id/region)
Tag(跟蹤成本/區分手動創建)
使用terrascan掃描隱患。
module編寫完成后,
利用terraform fmt格式化內容
利用terratest進行測試
二 編寫module規范
Module 倉庫建立完畢后,首先要 fork 倉庫并將其clone到本地。接下來,開始 Mudole 的編寫工作。官方已經給出了一個標準的 Module 應該遵循的原則和規范,詳見 standard-module-structure . 本文將在此基礎上進行補充。
基本原則 每個Module不宜包含過多的資源,要盡可能只包含同一產品的相關資源,這樣帶來的好處是Module的復雜度不高,便于維護和閱讀; 對于統一產品的不同資源,應該分別放在不同的子module中,然后在最外層的main.tf中組織所有的子資源,比如 module slb 中定義了兩個資源 slb instance 和 slb attachment,這兩個子資源分別定義在了 modules/slb 和 modules/slb_attachment 中,然后在最外層的 main.tf中將這兩個module組合為一個新的module 每個module要盡可能單元化,以便可以在實際使用過程中自由添加和刪除而不影響其他resource。即一個module盡可能敘述1-2件事情,如創建一個slb實例,并將一組ecs的掛載到這個slb下(slb的作用就是實現對ecs的負載均衡),至于slb的listener配置,應該放置在一個獨立的mudule中,一方面listeners比較復雜,涉及四種協議,另一方面,對于同一協議的listener,除了監聽端口外,大部分的配置都是相同的,而這些相同的配置可以通過一個單獨的module被復用在不同其他資源模板中; 模板編寫過程中,需要使用到大量的TF語法,詳見configuration syntax 和 interpolation syntax。
main.tf 每個 Module 都必須包含一個 main.tf 用于存放 resource 和 datasource。resource和datasource的參數禁止使用硬編碼,必須通過變量進行引用; 為了標準起見,每個 resource 和 data source 的命名均以一些關鍵字或者關鍵字前綴為主,如this,default,盡量避免使用foo,test等 為了更好的了解Module被他人引用的次數,阿里云Provider支持對每個Module進行打標,即在main.tf的provider中聲明字段configuration_source,格式如下: provider “alicloud” { … configuration_source = “terraform-alicloud-modules/demo” // This should be replaced by the specified owner and module name }
variables.tf 每個變量都要添加該參數對應的描述信息,這個信息最終是要呈現在terraform registry官網上的; 對于一些非關系型的參數,可設置一個默認值,如name,description等 對于復雜類型的變量,要顯示聲明其類型,如list,map 子資源的變量要在Readme中以列表的形式予以呈現
outputs.tf module中output的作用是被其他模板和module引用,因此,每個module要講一些重要的信息輸出出來,如資源ID,資源name 等; 重復資源的變量要以列表的形式予以輸出,如module ecs-instance中,創建多個instance資源,這些資源的ID應該輸出到一個list變量instance_ids中 和variables一樣,子資源的output變量也要在Readme中以列表的形式予以呈現
README 描述下當前Module是用來干什么的,涉及哪些resource和data source 增加 Usage,指明該如何使用這個 Module。Module 的source 格式為 source = “
執行可開啟日志
export TF_LOG=TRACE export TF_LOG_PATH=./terraform.log
執行完畢后,可查看 Terraform 本地文件夾會生成一個 terraform.log 的文件。文件記錄了 provider 定義的日志輸出。
三 實戰
3.1 使用stats文件作為查詢源
在實際應用場景中,可能module A 需要依賴已經運行完成后的module B 的outputs,例如實例綁定安全組,需要先運行安全組module將結果存儲在state文件中,module A以module B的運行結果state文件作為數據輸入源進行查詢操作。
例如使用cos作為backend后端存儲。
provider "tencentcloud" { region = "ap-beijing" } terraform { required_providers { tencentcloud = { source = "registry.terraform.io/tencentcloudstack/tencentcloud" version = ">=1.61.5" } } backend "cos" { region = "ap-beijing" bucket = "xxxx-xxxxxx" prefix = "terraform/state" } }
使用cos中的state文件作為terraform_remote_state。
data "terraform_remote_state" "cam" { backend = "cos" config = { region = "ap-beijing" bucket = "xxxxxx-xxxxxx" prefix = "terraform/state" } } locals { standards = data.terraform_remote_state.cam.outputs } output "result" { value = { items = { for k, v in local.standards :k=>v} } }
彈性云服務器 ECS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。