基礎架構之百變魔方


轉載本文需註明出處:微信公衆號EAWorld,違者必究。

引言:

「基礎架構即代碼(Infrastructure-as-Code,IaC)」是一種使用新的技術來構建和管理動態基礎設施的方式。它把基礎設施、工具和服務以及對基礎設施的管理自己做爲一個軟件系統,採納軟件工程實踐以結構化的安全的方式來管理對系統的變動。 

經過第三方調查報告顯,Forrester諮詢公司在一項針對擁有1000多名員工的企業的727名雲技術決策者的全球調查中發現,業務優先級的轉變正在推進企業採用多雲戰略。根據該研究,絕大多數的受訪者將其當前的雲計算策略描述爲多雲策。



根據該研究,絕大多數的受訪者將其當前的雲計算策略描述爲多雲策略,其性能和創新已超越成本節約成爲了成功的最佳衡量標準。此外,60%的企業如今正在遷移或已經將關鍵任務應用程序遷移到公有云上。

現在,大多數企業都採用多雲策略來優化性能並實現業務目標。該研究指出,「沒有一個單一的雲平臺能夠知足全部企業工做負載需求。」所以,企業正在利用多個共有云和私有云來處理不一樣的應用程序工做負載。在將工做負載與雲環境相匹配時,性能是大多數企業的首要考慮因素,甚至超過了合規性與安全性。

接受調查的IT領導者展現了對多雲平臺的各類使用案例,並認爲多雲策略能夠帶來諸多好處,好比改進的IT基礎架構管理和靈活性(33%),更好的IT成本管理(33%)以及提升安全性和合規性(30%)。此外,該研究還發現,在選擇雲服務供應商時,企業更喜歡能提供更深層次幫助和支持的供應商。



企業更多采用雲服務,讓物理機銷量出現了10年來首次負增加。6月18日,市場研究機構IDC公佈最新數據,2019年第一季度中國市場物理機出貨量下跌0.7%,全球市場物理機銷量下跌5.1%。這背後是企業全面向雲轉移,新舊IT交替出現拐點,雲計算市場持續強勁增加,平均增幅達40%。雲計算還能夠幫助企業大幅削減IT成本,還具備彈性擴容、按需使用、按量付費、成本低等明顯優點,已經成爲企業數字化轉型的基礎設施。互聯網、政府、電信和金融等行業已經把本身遷移至雲上,再也不獨立採購物理服務器。

1.咱們該如何應對多雲化的挑戰?

「基礎架構即代碼(Infrastructure-as-Code,IaC)」是一種使用新的技術來構建和管理動態基礎設施的方式。它把基礎設施、工具和服務以及對基礎設施的管理自己做爲一個軟件系統,採納軟件工程實踐以結構化的安全的方式來管理對系統的變動。

從開發的角度看提倡一切皆對象,從操做系統的角度看提倡一切皆文件,那麼在多雲化的時代咱們應該提倡把一切資源皆代碼,經過代碼的方式編排和管理咱們的基礎資源,這樣才能知足企業業務快速發展的需求。

針對一個複雜的業務系統咱們如何藉助雲端的優點進行部署?




傳統手工的部署方式大體要經過以上8個步驟完成一個應用的部署,若是咱們的公有云環境是多個,那麼就意味着以上步驟要重複屢次,這還僅僅是一個簡單的web環境,若是咱們要部署的是一套業務系統,涉及多個應用系統的建立,咱們的基礎平臺交付須要多長時間?顯然經過手工的方式是不現實的。

咱們須要經過infrastructure as code的方式來管理咱們的基礎架構,構建企業本身的技術中臺。

基礎設施即代碼四項關鍵原則:

可再生性:環境中的任何元素能夠輕鬆複製。
一致性:不管什麼時候,建立的環境各個元素的配置是徹底相同的。
快速反饋:可以頻繁、容易地進行變動,並快速知道變動是否正確。
可見性:全部對環境的變動應該容易理解、可審計、受版本控制。

基礎設施即代碼的目標:

標準化:以代碼來定義環境,實現開發環境、測試環境、生產環境的標準化。
自動化:以自動化工具來驅動代碼準備環境。包括建立環境、更新環境以及銷燬環境。
可視化:以監控來可視化環境信息。環境當前狀態可視、環境變動歷史可視化、可追溯。

infrastructure as code 的工具備哪些:

Microsoft爲用戶提供的IaC工具是:Azure Resource Manager。用戶能夠經過Azure Resource Manager(ARM)的不一樣模板,配置出本身的基礎架構、並處理各類依賴項。能夠在模板中使用那些已在JSON中聲明描述了的資源,也能夠在同一個ARM模板中聲明多個Azure資源,以構建總體性的項目環境。ARM模板具備冪等性,所以能夠無限次數地重複使用相同的模板,並得到相同的結果。Resource Manager還支持服務器的實例分組、以及對不一樣分組的統一管理。
CloudFormation是專爲那些在AWS雲中工做的用戶而設計的。目前已經配置了342種AWS資源類型。容許使用JSON或YAML定製各類模板來構建不一樣複雜程度的基礎架構模型。
(CDM)是基於Google雲平臺的配置文件(YAML)和模板(JINJA2或PYTHON)的一種自動化執行工具。它容許用戶自行定義和同步部署各類系統資源。Google CDM也支持預覽功能。這意味着:您在不直接提交更改的狀況下,即可以直接瞭解到部署和變動所帶來的影響。能夠幫助用戶避免出現人爲的錯誤,還可以起到增強與穩定總體基礎架構的做用。
Terraform 是一個IT基礎架構自動化編排工具,能夠用代碼來管理維護 IT 資源。Terraform的命令行接口 (CLI) 提供一種簡單機制,用於將配置文件部署到任意支持的雲上,並對其進行版本控制。經過配置文件能夠描述雲資源的拓撲基礎架構。

Terraform 支持的服務商衆多



安裝Terraform簡單

Terraform 能夠隨意部署在任意的客戶端上,只要能夠連通公網便可(Initializing provider plugins and Call Cloud OpenAPI) ,經過http://1t.click/vND下載對應平臺的可執行二進制包,解壓出來Executable Binary 放指定目錄,配置好相應的PATH則可以使用terraform 指令。

$ terraform
Usage: terraform [--version] [--help][args]
Common commands:
apply              Builds or changes infrastructure
console            Interactive console for Terraform interpolations
destroy            Destroy Terraform-managed infrastructure
fmt                Rewrites config files to canonical format
get                Download and install modules for the configuration
graph              Create a visual graph of Terraform resources
import             Import existing infrastructure into Terraform
init               Initialize a new or existing Terraform configuration
output             Read an output from a state file
plan               Generate and show an execution plan
providers          Prints a tree of the providers used in the configuration
push               Upload this Terraform module to Terraform Enterprise to run
refresh            Update local state file against real resources
show               Inspect Terraform state or plan
taint              Manually mark a resource for recreation
untaint            Manually unmark a resource as tainted
validate           Validates the Terraform files
version            Prints the Terraform version
workspace          Workspace management

整個基礎架構的建設只須要terraform init,terraform plan , terraform apply 三步來完成。刪除整個環境只須要terraform  destroy一步來完成。



經過一個main.tf文件(只須要是.tf 文件)定義了ECS(鏡像、實例類型)、VPC(CIDR、VPC Name)、OSS資源(ACL、實例Name)信息,經過Terraform 對資源配置參數作解析,調用阿里cloud OpenAPI 進行資源校驗於建立,同時把整個資源建立狀態化到一個.tf.state文件中,基於該文件則能夠得知資源建立的全部信息,包括資源數量調整,規格調整,實例變動都依賴這種很是重要的文件。

terraform 具體使用案例

經過配置main.tf文件定義各類資源

定義認證資源
} # Configure the Alicloud Provider
provider "alicloud" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region     = "${var.region}"

定義雲主機資源
# Create a web server
resource "alicloud_instance" "web" {
# cn-beijing
provider          = "alicloud"
availability_zone = "cn-beijing-a"
image_id          = "ubuntu_140405_32_40G_cloudinit_20161115.vhd"
internet_charge_type  = "PayByBandwidth"
instance_type        = "ecs.n1.medium"
io_optimized         = "optimized"
system_disk_category = "cloud_efficiency"
security_groups      = ["${alicloud_security_group.default.id}"]
instance_name        = "web"
}

定義安全組資源
# Create security group
resource "alicloud_security_group" "default" {
name        = "default"
provider    = "alicloud"
description = "default"
}
resource "alicloud_security_group_rule" "allow_all_tcp" {
type              = "ingress"
ip_protocol       = "tcp"
nic_type          = "intranet"
policy            = "accept"
port_range        = "1/65535"
priority          = 1
security_group_id = "${alicloud_security_group.default.id}"
cidr_ip           = "0.0.0.0/0"
}

定義輸出結果信息
# Output message
output "ecs instance name" {
value = "${alicloud_instance.web.instance_name}"
}
output "ecs private ip" {
value = "${alicloud_instance.web.private_ip}"
}

terraform init
$ terraform init
Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "alicloud" (0.1.0)...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.alicloud: version = "~> 0.1"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

執行terraform plan,查看資源建立計劃
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
+ alicloud_instance.web
id:
allocate_public_ip:   "false"
availability_zone:    "cn-beijing-a"
host_name:
image_id:             "ubuntu_140405_32_40G_cloudinit_20161115.vhd"
instance_name:        "web"
instance_type:        "ecs.n1.medium"
internet_charge_type: "PayByBandwidth"
io_optimized:         "optimized"
private_ip:
public_ip:
security_groups.#:
status:
subnet_id:
system_disk_category: "cloud_efficiency"
system_disk_size:
+ alicloud_security_group.default
id:
description:          "default"
name:                 "default"
Plan: 2 to add, 0 to change, 0 to destroy.

執行terraform apply,在雲端建立資源
$ terraform apply
alicloud_security_group.default: Creating...
description: "" => "default"
name:        "" => "default"
alicloud_security_group.default: Creation complete after 1s (ID: sg-2zec9v8aq2hgb244qrqf)
alicloud_instance.web: Creating...
allocate_public_ip:         "" => "false"
availability_zone:          "" => "cn-beijing-a"
host_name:                  "" => ""
image_id:                   "" => "ubuntu_140405_32_40G_cloudinit_20161115.vhd"
instance_name:              "" => "web"
instance_type:              "" => "ecs.n1.medium"
internet_charge_type:       "" => "PayByBandwidth"
io_optimized:               "" => "optimized"
private_ip:                 "" => ""
public_ip:                  "" => ""
security_groups.#:          "" => "1"
security_groups.2344301974: "" => "sg-2zec9v8aq2hgb244qrqf"
status:                     "" => ""
subnet_id:                  "" => ""
system_disk_category:       "" => "cloud_efficiency"
system_disk_size:           "" => ""
alicloud_instance.web: Still creating... (10s elapsed)
alicloud_instance.web: Still creating... (20s elapsed)
alicloud_instance.web: Creation complete after 51s (ID: i-2zedvfowy4m39sg1xdig)
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
ecs instance name = web
ecs private ip = 10.31.28.93

2.IaC結合共有云的使用


咱們能夠將咱們的應用系統經過Packer打包成鏡像存儲到公有云。
結合Terraform 在公有云部署雲主機時拉取自定義鏡像文件生成雲主機,並對公有云的資源進行統一的配置和管理。
經過結合Ansible對公有云的應用進行統一的維護和管理。

3.IaC在DevOps中的運用



咱們在整個軟件開發生命週期的過程當中,其中基礎環境的製備是很是重要的一環,也是從開發到測試再到生產部署最靠近底層的一環,咱們能夠藉助IaC既能知足基礎架構的快速部署,又能靈活的使用私有云或公有云資源,充分利用公有云的優點爲企業服務,同時下降企業成本投入,作到真正的按需付費。

4.基礎平臺代碼化的優點

將基礎結構部署到多個雲
Terraform適用於多雲方案,將相相似的基礎結構部署到阿里雲、其餘雲提供商或者本地數據中心。開發人員可以使用相同的工具和類似的配置文件同時管理不一樣雲提供商的資源。

自動化管理基礎結構
Terraform可以建立配置文件的模板,以可重複、可預測的方式定義、預配和配置ECS資源,減小因人爲因素致使的部署和管理錯誤。可以屢次部署同一模板,建立相同的開發、測試和生產環境。

基礎架構即代碼(Infrastructure as Code)
能夠用代碼來管理維護資源。容許保存基礎設施狀態,從而使您可以跟蹤對系統(基礎設施即代碼)中不一樣組件所作的更改,並與其餘人共享這些配置 。

下降開發成本
能夠經過按需建立開發和部署環境來下降成本,讓企業真正作到按需付費。

資料來源:Forrester調查報告、財經網、雲有料、博客園、阿里雲

關於做者:逍遙,普元架構師,擅長虛擬化,雲計算,DevOps;助力金融行業用戶的個性化DevOps方案落地;專一雲計算領域,爲企業的上雲之路保駕護航。

關於EAWorld:微服務,DevOps,數據治理,移動架構原創技術分享。長按二維碼關注!web

相關文章
相關標籤/搜索