摘要:此次的示例我們將使用一個(gè)的,該使用作為存儲(chǔ)驅(qū)動(dòng)。現(xiàn)在它已通過(guò)了驗(yàn)證,不過(guò)如果我們真的實(shí)際運(yùn)行它,只會(huì)創(chuàng)建一個(gè)基礎(chǔ)的副本,連接驅(qū)動(dòng),而這不是很有用。
我們?cè)?jīng)分享過(guò)在使用Docker、Rancher和各種開(kāi)源工具時(shí),如何確保高彈性工作負(fù)載。在這篇文章中,我將以先前內(nèi)容為基礎(chǔ),用一些常用工具為Rancher搭好一個(gè)AWS基礎(chǔ)環(huán)境。查看這里的倉(cāng)庫(kù),你就能跟隨我們的步驟、安裝一個(gè)完全相同的基礎(chǔ)設(shè)施。
我們AWS基礎(chǔ)設(shè)施最終的輸出看起來(lái)會(huì)像下面的圖片:
現(xiàn)在一起動(dòng)手來(lái)創(chuàng)建一個(gè)運(yùn)行的應(yīng)用棧吧!
Host VM的創(chuàng)建在這一部分我們將搭建下圖中底部的三個(gè)黃色部分的內(nèi)容:
Golden 鏡像首先,我們需要一個(gè)創(chuàng)建Docker hosts的方案,該方案會(huì)將存儲(chǔ)驅(qū)動(dòng)和操作系統(tǒng)組合起來(lái)。當(dāng)然,我們也希望將來(lái)能用不同的部分取代它們。
現(xiàn)在我們要建立自己的VM(它常被叫做“golden鏡像”)。至于工具,我會(huì)用Packer與AWS(以及其他各類云提供商)的API通信來(lái)創(chuàng)建VM鏡像,用Ansible以一種可讀的方式描述配置步驟。如果你想跳過(guò)這些步驟的話,你可以在這里找到完整的源代碼。
此次的示例我們將使用一個(gè)Ubuntu 14.04的VM,該VM使用AUFS3作為Docker存儲(chǔ)驅(qū)動(dòng)。
第一步,我們創(chuàng)建一個(gè)名為ubuntu_1404_aufs3.json的Packer配置文件。在這時(shí),用source_ami_filter在AWS美國(guó)東部地區(qū)搜索最近的14.04 AMI ID,從搜索清單中返回了ami-af22d9b9。
它還創(chuàng)建了一個(gè)40GB的硬盤(pán),該硬盤(pán)連接為/dev/sdb,我們將用它存儲(chǔ)Docker數(shù)據(jù);這里我們正在使用的是Docker 1.12.3,因?yàn)樗С肿钚碌腞ancher兼容性矩陣。
{ "variables": { "aws_access_key": "", "aws_secret_key": "", "docker_version": "1.12.4" }, "builders": [{ "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "us-east-1", "source_ami_filter": { "filters": { "virtualization-type": "hvm", "name": "*ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*", "root-device-type": "ebs" }, "most_recent": true }, "ami_virtualization_type": "hvm", "instance_type": "m3.medium", "ssh_username": "ubuntu", "ami_name": "Docker {{user `docker_version`}} Ubuntu 14.04 AUFS3 {{timestamp}}", "launch_block_device_mappings": [{ "device_name": "/dev/sdb", "volume_size": 40, "volume_type": "gp2", "delete_on_termination": true }], "tags": { "OS_Version": "Ubuntu", "Release": "14.04", "StorageDriver": "AUFS3", "Docker_Version": "{{user `docker_version`}}" } }] } $> packer validate ubuntu_1404_aufs3.json Template validated successfully.
現(xiàn)在它已通過(guò)了驗(yàn)證,不過(guò)如果我們真的實(shí)際運(yùn)行它,Packer只會(huì)創(chuàng)建一個(gè)基礎(chǔ)AMI的副本,連接40GB驅(qū)動(dòng),而這不是很有用。為了讓它更有實(shí)用性,我們還需要在上面準(zhǔn)備Docker。Packer內(nèi)置的hooks可用于各種配置管理(CM)工具,如Ansible、Chef和Puppet。在我們的例子中,我們將使用Ansible provisioner。
{ "variables": ["..."], "builders": ["..."], "provisioners": [ { "type": "ansible", "playbook_file": "./playbook.yml", "extra_arguments": [ "--extra-vars", "docker_pkg_name="docker-engine={{user `docker_version`}}-0~ubuntu-trusty"" ] } ] }
playbook.yml文件的內(nèi)容如下:
--- - name: Install Docker on Ubuntu 14.04 hosts: all # run as root become: true become_user: root pre_tasks: - name: format the extra drive filesystem: dev: /dev/xvdb fstype: ext4 - name: mount the extra drive mount: name: /secondary # ubuntu renames the block devices to xv* prefix src: /dev/xvdb fstype: ext4 state: mounted roles: - role: angstwad.docker_ubuntu docker_opts: "--graph /secondary --storage-driver=aufs"
運(yùn)行該工具之前,我們需要在包含ubuntu_1404_aufs3.json的根目錄抓取Docker安裝角色,然后運(yùn)行ansible-galaxy install angstwad.docker_ubuntu -p 來(lái)下載一個(gè)預(yù)配置的Docker安裝角色。頗受歡迎的angstwad.docker_ubuntu角色為在Ubuntu上的Docker安裝提供了很多選項(xiàng),并且它提供的安裝方式大多是按照官方的Docker安裝教程進(jìn)行操作的。
最后,我們執(zhí)行下面的腳本,等待新的基礎(chǔ)鏡像生成。最終生成的鏡像將是你從現(xiàn)在開(kāi)始要使用的基礎(chǔ)Docker鏡像。
$> packer build ubuntu_1404_aufs3.json ... output ... output ==> amazon-ebs: Creating the AMI: Docker 1.12.4 Ubuntu 14.04 AUFS3 1486965623 amazon-ebs: AMI: ami-1234abcd ==> amazon-ebs: Waiting for AMI to become ready...AWS基礎(chǔ)設(shè)施創(chuàng)建
在開(kāi)始創(chuàng)建基礎(chǔ)設(shè)施組件之前,先檢查以下AWS上Rancher的架構(gòu)模板倉(cāng)庫(kù)。
網(wǎng)絡(luò)層接下來(lái),大多數(shù)AWS服務(wù)需要建立一個(gè)VPC來(lái)供應(yīng)零錯(cuò)誤的服務(wù)。要做到這一點(diǎn),我們將用公共子網(wǎng)創(chuàng)建一個(gè)多帶帶的VPC。下面提供的是一種安裝標(biāo)準(zhǔn)模板的直接的方式。在這里檢查網(wǎng)絡(luò)模塊。
在main.tf(基礎(chǔ)設(shè)施的入口文件)中,我們引用了./database的網(wǎng)絡(luò)配置,然后我們需要向我們的模塊傳遞參數(shù):
module "networking" { source = "./networking" aws_region = "${var.aws_region}" tag_name = "${var.tag_name}" aws_vpc_cidr = "${var.aws_vpc_cidr}" aws_public_subnet_cidrs = "${var.aws_public_subnet_cidrs}" }
現(xiàn)在,你可以運(yùn)行我們簡(jiǎn)單網(wǎng)絡(luò)層的創(chuàng)建操作:
terraform plan -target="module.networking" ... output ... Plan: 6 to add, 0 to change, 0 to destroy. $> terraform apply -target="module.networking" ... output ... module.networking.aws_subnet.rancher_ha_c: Creation complete module.networking.aws_subnet.rancher_ha_b: Creation complete module.networking.aws_subnet.rancher_ha_a: Creation complete module.networking.aws_route.rancher_ha: Creation complete
應(yīng)用完成!資源:6添加, 0更改, 0銷毀。
HA Rancher Server接下來(lái),讓我們開(kāi)始設(shè)置我們的網(wǎng)絡(luò),并使用我們的AMI在Rancher上安裝HA mode。首先,我們需要自動(dòng)化Rancher的HA安裝。
在Rancher 1.2版本之后,我們對(duì)HA進(jìn)程進(jìn)行了更新,Rancher不再需要一個(gè)bootstrap節(jié)點(diǎn)及依賴的步驟來(lái)創(chuàng)建HA集群。新的步驟是:
創(chuàng)建一個(gè)外部數(shù)據(jù)庫(kù)(本文使用的是RDS)
創(chuàng)建一個(gè)HA loadbalancer 的免費(fèi)SSL證書(shū)
使用一個(gè)外部loadbalancer在3個(gè)節(jié)點(diǎn)中進(jìn)行route(這里使用ELB)
啟動(dòng)的HA節(jié)點(diǎn)會(huì)用附加標(biāo)示--advertise-address標(biāo)記起來(lái),并在端口9345進(jìn)行端口轉(zhuǎn)發(fā)
去除bootstrap節(jié)點(diǎn),使得HA Rancher的自動(dòng)安裝變得更加容易。
下面讓我們開(kāi)始創(chuàng)建我們的外部數(shù)據(jù)庫(kù)吧!
創(chuàng)建一個(gè)外部數(shù)據(jù)庫(kù)繼續(xù)在main.tf中,我們接下來(lái)要搭建RDS數(shù)據(jù)庫(kù)。
module "database" { source = "./database" vpc_id = "${module.networking.vpc_id}" database_subnet_ids = [ "${module.networking.vpc_subnet_a}", "${module.networking.vpc_subnet_b}", "${module.networking.vpc_subnet_c}", ] database_port = "${var.database_port}" database_name = "${var.database_name}" database_username = "${var.database_username}" database_password = "${var.database_password}" database_instance_class = "${var.database_instance_class}" }
數(shù)據(jù)庫(kù)將創(chuàng)建安全組,安全組由在我們網(wǎng)絡(luò)層定義的子網(wǎng)組成。你可以在Github上看到完整的數(shù)據(jù)庫(kù)terraform模板。
$> terraform plan -target="module.database" ... output ... Plan: 3 to add, 0 to change, 0 to destroy. $> terraform apply -target="module.database" ... output ... module.database.aws_db_instance.rancherdb: Still creating... (4m20s elapsed) module.database.aws_db_instance.rancherdb: Creation complete Apply complete! Resources: 3 added, 0 changed, 0 destroyed.為我們的ELB創(chuàng)建免費(fèi)證書(shū)
在這一步中,我們使用AWS證書(shū)管理器(ACM)為Rancher HA 證書(shū)管理SSL證書(shū)。你可以在ACM文檔中查閱如何請(qǐng)求一個(gè)免費(fèi)的SSL證書(shū)。因?yàn)閺腁CM請(qǐng)求證書(shū)的過(guò)程中需要手動(dòng)驗(yàn)證域名,我們不對(duì)這一部分進(jìn)行自動(dòng)化。一旦請(qǐng)求完成,引用SSL證書(shū)就和下面添加數(shù)據(jù)資源一樣簡(jiǎn)單,你可以在Github上看到該文件。
data "aws_acm_certificate" "rancher_ha_cert" { domain = "${var.fqdn}" statuses = ["ISSUED"] }創(chuàng)建HA服務(wù)器組
接下來(lái),我們用與ELB相關(guān)的安全組搭建一個(gè)ELB。然后,我們將添加3個(gè)EC2主機(jī)駐留在Rancher上。
module "rancher_server_ha" { source = "./rancher_server_ha" vpc_id = "${module.networking.vpc_id}" tag_name = "${var.tag_name}" # ssled domain without protocol e.g. moo.test.com acm_cert_domain = "${var.acm_cert_domain}" # domain with protocol e.g. https://moo.test.com fqdn = "${var.fqdn}" # ami that you created with packer ami = { us-east-1 = "ami-f05d91e6" } subnet_ids = [ "${module.networking.vpc_subnet_a}", "${module.networking.vpc_subnet_b}", "${module.networking.vpc_subnet_c}", ] # database variables to be passed into Rancher Server Nodes database_port = "${var.database_port}" database_name = "${var.database_name}" database_username = "${var.database_username}" database_password = "${var.database_password}" database_endpoint = "${module.database.endpoint}" }
下面是HA服務(wù)器模板創(chuàng)建安全組、ELB和彈性伸縮組的細(xì)節(jié)。這個(gè)過(guò)程需要幾分鐘時(shí)間,因?yàn)槲覀冃枰却鼸C2實(shí)例啟動(dòng)。
$> terraform plan -target="module.rancher_server_ha" ... output ... Plan: 11 to add, 0 to change, 0 to destroy. $> terraform apply -target="module.rancher_server_ha" ... output ... Apply complete! Resources: 11 added, 0 changed, 0 destroyed.
HA實(shí)例的云配置
我們?cè)?/files/userdata.template文件中提供自己的服務(wù)器節(jié)點(diǎn)資源。它填充了變量,來(lái)為我們的實(shí)例創(chuàng)建一個(gè)cloud-init配置。Cloud init文檔寫(xiě)了一個(gè)名為start-rancher.sh的文件,這一文件會(huì)在實(shí)例啟動(dòng)的時(shí)候被執(zhí)行。
你可以在這里查看文件的細(xì)節(jié)。
在ELB上指向DNS
現(xiàn)在你可以在我們創(chuàng)建的Rancher ELB上指向你的DNS server。導(dǎo)航去ELB console,你應(yīng)該能看到創(chuàng)建的ELB。接下來(lái)抓取ELB的DNS名并且在你的域名提供商處添加一個(gè)CNAME記錄它。
比如,在這篇博客中,我在rancher.domain.com上安裝了Rancher,接下來(lái)在https://rancher.domain.com訪問(wèn)管理員面板。
Rancher節(jié)點(diǎn)安裝
至此,我們已經(jīng)成功安裝了Rancher服務(wù)器,并且可以添加自定義主機(jī)或使用Rancher-provided主機(jī)驅(qū)動(dòng)了。如果我們有更多的自動(dòng)化嘗試,這里有一個(gè)也許可行的方法,讓你可以在AWS上自動(dòng)化autoscaled從屬節(jié)點(diǎn)集群。
在Rancher UI界面,我們按照文檔添加自定義主機(jī)。我們需要抓取幾個(gè)變量傳遞到我們的集群安裝模板上。
寫(xiě)入自定義主機(jī)時(shí)的命令是:
sudo docker run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:${rancher_agent_version} ${rancher_reg_url} # Example at the time of writing. rancher_reg_url = https://rancher.domain.com/v1/scripts/AAAAABBBBB123123:150000000000:X9asiBalinlkjaius91238 rancher_agent_version = v1.2.0
在抓出這些變量后,下一步可以開(kāi)始創(chuàng)建節(jié)點(diǎn)。因?yàn)榕c建立HA相比這是一個(gè)多帶帶的進(jìn)程,在文件中我們先為Rancher節(jié)點(diǎn)的創(chuàng)建添上注釋。
$> terraform plan -target="module.rancher_nodes" ... output ... Plan: 3 to add, 0 to change, 0 to destroy. $> terraform apply -target="module.rancher_nodes" ... output ... Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
幾分鐘后,你應(yīng)該可以看到你的Rancher主機(jī)已出現(xiàn)在你的Rancher UI中。
總結(jié)這篇文章的步驟非常多,但有了這個(gè)模板,我們現(xiàn)在可以多帶帶地建立Terraform組件,并在基礎(chǔ)設(shè)施層上進(jìn)行迭代。這有點(diǎn)像Docker鏡像建立的過(guò)程。
這對(duì)所有這些不同的組件帶來(lái)的最大好處是可替換性。如果你不喜歡本文中Docker Host操作系統(tǒng)的選擇,那么你可以改變Packer的配置并在Terraform中更新AMI ID。如果你不喜歡網(wǎng)絡(luò)層,那么只需看一眼Terraform腳本然后更新它。這個(gè)安裝教程只是一個(gè)讓Rancher運(yùn)行起來(lái)、讓你可以開(kāi)始你的項(xiàng)目的最初模板。
當(dāng)然,這并不是搭建Rancher最好的方式,但Terraform的布局是能夠隨著項(xiàng)目的持續(xù)進(jìn)行而持續(xù)改進(jìn)的。
進(jìn)一步改進(jìn)這里顯示的VPC是駐留在公用子網(wǎng)傷的(出于簡(jiǎn)單性的考量),但如果你想保護(hù)數(shù)據(jù)庫(kù)和服務(wù)器之間的網(wǎng)絡(luò)流量,你需要更新網(wǎng)絡(luò)(這可能需要重建)。
其實(shí)你可以考慮將Rancher節(jié)點(diǎn)傳遞到一個(gè)多帶帶的項(xiàng)目上,而非像本教程一下添上注釋。
我們應(yīng)該看看如何在Terraform上做備份,以避免出現(xiàn)丟失文件夾的情況。所以對(duì)于想在生產(chǎn)環(huán)境中使用它的人來(lái)說(shuō),為S3備份中多做一些安裝是一定會(huì)有很大幫助的。
其實(shí)也可以將EFS添加進(jìn)腳本中,來(lái)添加分布式文件系統(tǒng),給我們各個(gè)節(jié)點(diǎn)提供支持。
跨區(qū)域RDS復(fù)制:terraform-community-modules/tf_aws_rds
使用由terrafrm社區(qū)管理的Terraform VPC模塊:terraform-community-modules/tf_aws_vpc
一些可供參考的架構(gòu)很多社區(qū)成員和Rancher貢獻(xiàn)者為我們創(chuàng)造了很多值得參考的架構(gòu)。你在測(cè)試了本文的模板之后可以進(jìn)一步參考一下他們提供的一些結(jié)構(gòu),來(lái)改進(jìn)自己的基礎(chǔ)設(shè)施。
Terraformhttps://github.com/mlaccetti/...
https://github.com/cloudnauti...
更多的網(wǎng)絡(luò)變體可以參考這里。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/26822.html
摘要:本文作者為的架構(gòu)師,他分享了使用和建立超高速流水線的經(jīng)驗(yàn)。月日,北京海航萬(wàn)豪酒店,容器技術(shù)大會(huì)即將舉行。 Higher Education(highereducation.com)是一個(gè)連接學(xué)生與高校的入學(xué)申請(qǐng)平臺(tái),通過(guò)引入高意圖和高質(zhì)量的潛在學(xué)生,以及明確、有效的操作,為網(wǎng)站合作的大學(xué)吸引學(xué)生入學(xué)。每年Higher Education為其大學(xué)合作伙伴招收超過(guò)15000名在線學(xué)生入學(xué)申...
摘要:警告因?yàn)槭堑囊粋€(gè)較新的服務(wù),它只能在有限的幾個(gè)位置上使用。現(xiàn)在你可以開(kāi)始從視圖中手動(dòng)創(chuàng)建一個(gè)卷,或干脆創(chuàng)建一個(gè)使用和卷名的服務(wù)。我非常期待看到和中的共享卷會(huì)有什么下一步的發(fā)展。 如果你用過(guò)Docker你就會(huì)知道,共享卷和跨主機(jī)的數(shù)據(jù)訪問(wèn)是個(gè)非常棘手的問(wèn)題。雖然Docker的生態(tài)系統(tǒng)在逐漸走向成熟,但對(duì)大多數(shù)人來(lái)說(shuō),在不同環(huán)境中實(shí)現(xiàn)持久化存儲(chǔ)還是很麻煩的。幸運(yùn)的是,Rancher一直在研...
摘要:當(dāng)企業(yè)的運(yùn)維團(tuán)隊(duì)去維護(hù)一個(gè)彈性的容器集群時(shí),傳統(tǒng)的軟件部署方式需要向容器遷移,這個(gè)過(guò)程中需要有風(fēng)險(xiǎn)預(yù)判和規(guī)避之道。但是這樣會(huì)有些問(wèn)題,就是大部分鏡像都是基于構(gòu)建的,這會(huì)和樹(shù)莓派的很不兼容。多次嘗試后狀態(tài)被破壞刪庫(kù)重試,重啟大法好。 當(dāng)前技術(shù)世界的發(fā)展形勢(shì)就是讓開(kāi)發(fā)人員從繁瑣的應(yīng)用配置和管理中解放出來(lái),使用容器鏡像來(lái)處理復(fù)雜的程序運(yùn)行依賴庫(kù)的需求,保證代碼運(yùn)行環(huán)境的一致性。既然這樣的好處...
摘要:概述結(jié)合大家的應(yīng)用場(chǎng)景,本篇旨在介紹如何通過(guò)的微服務(wù)來(lái)實(shí)現(xiàn)的彈性伸縮。流程介紹創(chuàng)建服務(wù)對(duì)象。通過(guò)阿里云創(chuàng)建實(shí)例對(duì)象,打上標(biāo)簽。第三方觸發(fā),完成彈性伸縮。環(huán)境準(zhǔn)備,,,,,均可部署。本次準(zhǔn)備的引擎版本是。 概述 結(jié)合大家CICD的應(yīng)用場(chǎng)景,本篇Blog旨在介紹如何通過(guò)Rancher的webhook微服務(wù)來(lái)實(shí)現(xiàn)Service/Host的彈性伸縮。 流程介紹 Service Scale ...
閱讀 2621·2021-11-25 09:43
閱讀 2724·2021-11-04 16:09
閱讀 1634·2021-10-12 10:13
閱讀 881·2021-09-29 09:35
閱讀 880·2021-08-03 14:03
閱讀 1777·2019-08-30 15:55
閱讀 2989·2019-08-28 18:14
閱讀 3489·2019-08-26 13:43