摘要:此次的示例我們將使用一個的,該使用作為存儲驅動。現在它已通過了驗證,不過如果我們真的實際運行它,只會創建一個基礎的副本,連接驅動,而這不是很有用。
我們曾經分享過在使用Docker、Rancher和各種開源工具時,如何確保高彈性工作負載。在這篇文章中,我將以先前內容為基礎,用一些常用工具為Rancher搭好一個AWS基礎環境。查看這里的倉庫,你就能跟隨我們的步驟、安裝一個完全相同的基礎設施。
我們AWS基礎設施最終的輸出看起來會像下面的圖片:
現在一起動手來創建一個運行的應用棧吧!
Host VM的創建在這一部分我們將搭建下圖中底部的三個黃色部分的內容:
Golden 鏡像首先,我們需要一個創建Docker hosts的方案,該方案會將存儲驅動和操作系統組合起來。當然,我們也希望將來能用不同的部分取代它們。
現在我們要建立自己的VM(它常被叫做“golden鏡像”)。至于工具,我會用Packer與AWS(以及其他各類云提供商)的API通信來創建VM鏡像,用Ansible以一種可讀的方式描述配置步驟。如果你想跳過這些步驟的話,你可以在這里找到完整的源代碼。
此次的示例我們將使用一個Ubuntu 14.04的VM,該VM使用AUFS3作為Docker存儲驅動。
第一步,我們創建一個名為ubuntu_1404_aufs3.json的Packer配置文件。在這時,用source_ami_filter在AWS美國東部地區搜索最近的14.04 AMI ID,從搜索清單中返回了ami-af22d9b9。
它還創建了一個40GB的硬盤,該硬盤連接為/dev/sdb,我們將用它存儲Docker數據;這里我們正在使用的是Docker 1.12.3,因為它支持最新的Rancher兼容性矩陣。
{ "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.
現在它已通過了驗證,不過如果我們真的實際運行它,Packer只會創建一個基礎AMI的副本,連接40GB驅動,而這不是很有用。為了讓它更有實用性,我們還需要在上面準備Docker。Packer內置的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文件的內容如下:
--- - 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"
運行該工具之前,我們需要在包含ubuntu_1404_aufs3.json的根目錄抓取Docker安裝角色,然后運行ansible-galaxy install angstwad.docker_ubuntu -p 來下載一個預配置的Docker安裝角色。頗受歡迎的angstwad.docker_ubuntu角色為在Ubuntu上的Docker安裝提供了很多選項,并且它提供的安裝方式大多是按照官方的Docker安裝教程進行操作的。
最后,我們執行下面的腳本,等待新的基礎鏡像生成。最終生成的鏡像將是你從現在開始要使用的基礎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基礎設施創建
在開始創建基礎設施組件之前,先檢查以下AWS上Rancher的架構模板倉庫。
網絡層接下來,大多數AWS服務需要建立一個VPC來供應零錯誤的服務。要做到這一點,我們將用公共子網創建一個多帶帶的VPC。下面提供的是一種安裝標準模板的直接的方式。在這里檢查網絡模塊。
在main.tf(基礎設施的入口文件)中,我們引用了./database的網絡配置,然后我們需要向我們的模塊傳遞參數:
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}" }
現在,你可以運行我們簡單網絡層的創建操作:
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
應用完成!資源:6添加, 0更改, 0銷毀。
HA Rancher Server接下來,讓我們開始設置我們的網絡,并使用我們的AMI在Rancher上安裝HA mode。首先,我們需要自動化Rancher的HA安裝。
在Rancher 1.2版本之后,我們對HA進程進行了更新,Rancher不再需要一個bootstrap節點及依賴的步驟來創建HA集群。新的步驟是:
創建一個外部數據庫(本文使用的是RDS)
創建一個HA loadbalancer 的免費SSL證書
使用一個外部loadbalancer在3個節點中進行route(這里使用ELB)
啟動的HA節點會用附加標示--advertise-address標記起來,并在端口9345進行端口轉發
去除bootstrap節點,使得HA Rancher的自動安裝變得更加容易。
下面讓我們開始創建我們的外部數據庫吧!
創建一個外部數據庫繼續在main.tf中,我們接下來要搭建RDS數據庫。
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}" }
數據庫將創建安全組,安全組由在我們網絡層定義的子網組成。你可以在Github上看到完整的數據庫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創建免費證書
在這一步中,我們使用AWS證書管理器(ACM)為Rancher HA 證書管理SSL證書。你可以在ACM文檔中查閱如何請求一個免費的SSL證書。因為從ACM請求證書的過程中需要手動驗證域名,我們不對這一部分進行自動化。一旦請求完成,引用SSL證書就和下面添加數據資源一樣簡單,你可以在Github上看到該文件。
data "aws_acm_certificate" "rancher_ha_cert" { domain = "${var.fqdn}" statuses = ["ISSUED"] }創建HA服務器組
接下來,我們用與ELB相關的安全組搭建一個ELB。然后,我們將添加3個EC2主機駐留在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服務器模板創建安全組、ELB和彈性伸縮組的細節。這個過程需要幾分鐘時間,因為我們需要等待EC2實例啟動。
$> 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實例的云配置
我們在./files/userdata.template文件中提供自己的服務器節點資源。它填充了變量,來為我們的實例創建一個cloud-init配置。Cloud init文檔寫了一個名為start-rancher.sh的文件,這一文件會在實例啟動的時候被執行。
你可以在這里查看文件的細節。
在ELB上指向DNS
現在你可以在我們創建的Rancher ELB上指向你的DNS server。導航去ELB console,你應該能看到創建的ELB。接下來抓取ELB的DNS名并且在你的域名提供商處添加一個CNAME記錄它。
比如,在這篇博客中,我在rancher.domain.com上安裝了Rancher,接下來在https://rancher.domain.com訪問管理員面板。
Rancher節點安裝
至此,我們已經成功安裝了Rancher服務器,并且可以添加自定義主機或使用Rancher-provided主機驅動了。如果我們有更多的自動化嘗試,這里有一個也許可行的方法,讓你可以在AWS上自動化autoscaled從屬節點集群。
在Rancher UI界面,我們按照文檔添加自定義主機。我們需要抓取幾個變量傳遞到我們的集群安裝模板上。
寫入自定義主機時的命令是:
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
在抓出這些變量后,下一步可以開始創建節點。因為與建立HA相比這是一個多帶帶的進程,在文件中我們先為Rancher節點的創建添上注釋。
$> 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.
幾分鐘后,你應該可以看到你的Rancher主機已出現在你的Rancher UI中。
總結這篇文章的步驟非常多,但有了這個模板,我們現在可以多帶帶地建立Terraform組件,并在基礎設施層上進行迭代。這有點像Docker鏡像建立的過程。
這對所有這些不同的組件帶來的最大好處是可替換性。如果你不喜歡本文中Docker Host操作系統的選擇,那么你可以改變Packer的配置并在Terraform中更新AMI ID。如果你不喜歡網絡層,那么只需看一眼Terraform腳本然后更新它。這個安裝教程只是一個讓Rancher運行起來、讓你可以開始你的項目的最初模板。
當然,這并不是搭建Rancher最好的方式,但Terraform的布局是能夠隨著項目的持續進行而持續改進的。
進一步改進這里顯示的VPC是駐留在公用子網傷的(出于簡單性的考量),但如果你想保護數據庫和服務器之間的網絡流量,你需要更新網絡(這可能需要重建)。
其實你可以考慮將Rancher節點傳遞到一個多帶帶的項目上,而非像本教程一下添上注釋。
我們應該看看如何在Terraform上做備份,以避免出現丟失文件夾的情況。所以對于想在生產環境中使用它的人來說,為S3備份中多做一些安裝是一定會有很大幫助的。
其實也可以將EFS添加進腳本中,來添加分布式文件系統,給我們各個節點提供支持。
跨區域RDS復制:terraform-community-modules/tf_aws_rds
使用由terrafrm社區管理的Terraform VPC模塊:terraform-community-modules/tf_aws_vpc
一些可供參考的架構很多社區成員和Rancher貢獻者為我們創造了很多值得參考的架構。你在測試了本文的模板之后可以進一步參考一下他們提供的一些結構,來改進自己的基礎設施。
Terraformhttps://github.com/mlaccetti/...
https://github.com/cloudnauti...
更多的網絡變體可以參考這里。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26822.html
摘要:本文作者為的架構師,他分享了使用和建立超高速流水線的經驗。月日,北京海航萬豪酒店,容器技術大會即將舉行。 Higher Education(highereducation.com)是一個連接學生與高校的入學申請平臺,通過引入高意圖和高質量的潛在學生,以及明確、有效的操作,為網站合作的大學吸引學生入學。每年Higher Education為其大學合作伙伴招收超過15000名在線學生入學申...
摘要:警告因為是的一個較新的服務,它只能在有限的幾個位置上使用。現在你可以開始從視圖中手動創建一個卷,或干脆創建一個使用和卷名的服務。我非常期待看到和中的共享卷會有什么下一步的發展。 如果你用過Docker你就會知道,共享卷和跨主機的數據訪問是個非常棘手的問題。雖然Docker的生態系統在逐漸走向成熟,但對大多數人來說,在不同環境中實現持久化存儲還是很麻煩的。幸運的是,Rancher一直在研...
摘要:當企業的運維團隊去維護一個彈性的容器集群時,傳統的軟件部署方式需要向容器遷移,這個過程中需要有風險預判和規避之道。但是這樣會有些問題,就是大部分鏡像都是基于構建的,這會和樹莓派的很不兼容。多次嘗試后狀態被破壞刪庫重試,重啟大法好。 當前技術世界的發展形勢就是讓開發人員從繁瑣的應用配置和管理中解放出來,使用容器鏡像來處理復雜的程序運行依賴庫的需求,保證代碼運行環境的一致性。既然這樣的好處...
摘要:概述結合大家的應用場景,本篇旨在介紹如何通過的微服務來實現的彈性伸縮。流程介紹創建服務對象。通過阿里云創建實例對象,打上標簽。第三方觸發,完成彈性伸縮。環境準備,,,,,均可部署。本次準備的引擎版本是。 概述 結合大家CICD的應用場景,本篇Blog旨在介紹如何通過Rancher的webhook微服務來實現Service/Host的彈性伸縮。 流程介紹 Service Scale ...
閱讀 2633·2021-11-25 09:43
閱讀 2735·2021-11-04 16:09
閱讀 1652·2021-10-12 10:13
閱讀 889·2021-09-29 09:35
閱讀 887·2021-08-03 14:03
閱讀 1781·2019-08-30 15:55
閱讀 2997·2019-08-28 18:14
閱讀 3498·2019-08-26 13:43