探索入门云计算风向标Amazon的ECS容器技术
Amazon ECS 概述
對于經常接觸云計算服務技術的同學們估計一聽到ECS,耳朵都能磨出繭子,印象中ECS不就是彈性計算服務么,再人話點就是你按量充值的一臺虛擬主機,然后通過SSH遠程維護這臺虛擬主機的操作系統唄,但是Amazon ECS就不同于你們理解的那個ECS啦!且聽我慢慢道來。
Amazon ECS全稱是(Amazon Elastic Container Service),它是針對容器技術高度彈性的的管理服務,我么如何去更通俗地理解呢?其實Amazon ECS就是希望用戶直接面對容器進行管理(例如:Docker),而不是面對虛擬機操作系統,也就是說Amazon云平臺提供給用戶購買的計算單元粒度更細致了,那么這又帶來什么好處呢?其實是兩方面:
優勢一:你沒必要就為了部署一個服務(例如:部署Tomcat),就得先占用一臺虛擬機,現在Amazon ECS給你了一個新方案,你部署維護一個Docker容器就夠了,這個容器服務跑在哪臺機器上,那個容器引擎上,這些你就不用關心了,Amazon ECS自己來維護計算資源的基礎設施,由于資源占用少了,自然你充值就少了;
優勢二:現在的云服務大趨勢是分布式,這樣你的應用可以形成集群,以便增強系統高可靠性以及對服務性能的彈性伸縮管理,但是像以前我購買一臺虛擬主機,即使我切分成了多個Docker,那也是在這一個虛擬主機節點上跑,依然是個偽分布式,除非你有更多的資金購買更多的虛擬主機。但是Amazon ECS默認提供的無服務(Serverless)模式就讓你不再顧慮運行服務的集群分布問題,只考慮要上多少Docker容器,至于放置在什么地方,哪個機房,那臺服務器,那更多是Amazon ECS考慮的事情,那么我就用一個整體上較低的綜合成本,實現了一個真正比較強大的面相服務的集群環境。
對于Amazon ECS的一些簡單介紹我們可以看看Amazon ECS官方的介紹:什么是 Amazon Elastic Container Service?
另外提一下亞馬遜云科技最近活動力度還是蠻大的,提供了100余種產品免費套餐。其中,計算資源Amazon EC2首年12個月免費,750小時/月;存儲資源 Amazon S3 首年12個月免費,5GB標準存儲容量。
若小伙伴們有興趣,也可以進去瞧瞧亞馬遜云科技最新活動頁,便宜不占白不占,對吧:亞馬遜AWS海外區域賬戶免費套餐_免費云服務-AWS云服務,
?Amazon ECS架構
我們先上一張Amazon ECS的官網發布的架構圖,先對其有個概括的認識:
?
?Amazon ECS環境架構圖
從上圖中,我們看到了Amazon ECS的受控范圍是一個Region(區域),這個區域我們可以理解為世界上某個國家、某個地區的云機房,例如:美國西部 (俄勒岡州) us-west-2,非洲 (開普敦) af-south-1,亞太地區 (香港) ap-east-1,你一開始接觸會有些懵逼,這咋全世界都有Amazon的點,沒辦法,為啥Amazon是云計算大哥,就是因為人家的云服務是覆蓋全世界的,這對于國內企業云服務未來走向國際化就具有比較潛在的基礎設施優勢。
Region內部的核心又分為了任務定義(Task definition)、服務描述(Service description)的配置藍圖部分,任務和基礎設施的運行實例部分,另外還有一個容器鏡像注冊(Container registry)的倉庫部分,這三部分實際上就是Amazon ECS面向用戶的核心服務。
例如:你有個不錯的Docker鏡像,那么就先注冊到Container registry,然后下一步開始在Task definition中做容器運行所需的配置,其實通俗點說就是在任務配置中引用你上傳的Docker鏡像地址,給任務分配多少CPU、內存,屬于VPC(虛擬私有云)中哪個子網等等這些容器鏡像、配額、用戶角色、基礎設施的綜合性說明文件。
有了這個綜合性說明,再根據Service description配置就能在啟動服務的過程中,將配置中的Docker鏡像實例化成一到多個Docker容器服務的任務,并根據Amazon Fargate(Amazon的無服務技術),將任務放置在ECS集群的不同位置,形成高可靠的分布式系統(當然你也可以只選擇部署一個任務)。Fargate類型比較重要,我們做Task definition的時候,一般會選擇它,它的官方介紹:Amazon Fargate 上的 Amazon ECS。
對于Amazon ECS產品的詳細介紹我們可以進入官方的Amazon ECS產品詳細介紹頁做進一步的了解。?
Docker快速介紹
玩轉Amazon ECS的底子就是會玩Docker,對于Docker還比較陌生的同學們,我先簡單科普一下:
提起 Docker,有很多人第一印象會認為它就是一個虛擬化容器,所以大家特別容易陷入到一種誤區,就是覺得 Docker 只是在 Linux 操作系統之上又增加了一層,就跟 OS 上跑了一個 VMWare 一樣。Docker 一定變得又慢又復雜。還不如原生安裝的服務看起來舒服。
實際上這是誤區,Docker 管理的各種服務,都是操作系統原生的進程,并不是一個虛擬化產物,它的正確定義是應用容器引擎。
那怎么去理解這個應用容器引擎呢?就要說說 Docker 的核心原理了——其中主要機制之一,通過 Linux 的 namespace 機制實現了資源隔離,這個資源隔離就包括了:
這些隔離機制都是 Linux 內核的 namespace 機制實現,也是 Docker 容器設計的精髓。
我來打個比方吧:原來是一個 300 平米的大 house,就住著一家人,臥室、廚房、衛生間這一家人獨享。可是房子太大完全可以住三個家庭,不僅能公攤一部分費用,還能為主家帶來額外的收益。那么就要對這個大 house 重新進行規劃設計,滿足三個家庭的需要,制定一些生活制度,有些資源是可以共享的,但關鍵資源就必須隔離開,保護隱私嘛!其實大家說到底還是在一個大房子內平等的生活。
用了這個比喻其實就是告訴大家,你就把 Docker 理解為一個房子多個家庭的規劃安排包租婆,Docker 管理了很多的容器服務,容器服務就是在宿主機上跑著的,例如 MySQL、Nginx、微服務等等都是容器服務,大家都是在一個 OS 上平等的運行著,只不過進了自己房間,你對別人房間的情況就一無所知了。那么這不僅保護了各個服務之間不會產生對資源爭用,而且還能根據預先入戶的協議,分配好 CPU、內存、磁盤的容量。這樣大家住在一起也是明明白白的,誰也不能沾了誰的便宜。當然了對外的網絡端口還是需要各家分配不同的。
有了這個本事,你就能在有限的云資源上跑很多服務啦!我自己做的公司網站就跑了三個 Docker 容器:Nginx、MySQL、Wordpress,我才給分配了 512M 內存,夠摳門吧,但是運行地妥妥的,只是物理內存是在太小,有時候重啟服務,OS 報內存資源就不夠了,必須把 Docker 也重啟,清空一下內存就好了。
我曾經做過兩個互聯網平臺產品用了三臺性能不錯的云服務器,4 核,16G 內存,足足跑了 50 多個微服務和其他基礎服務,真的是把資源榨得是干干凈凈。關鍵還有服務日志隔離、環境變量隔離、全局配置隔離等待,好處實在太多了。
說到這里,我相信同學們一定就有點理解了為什么Amazon ECS那么強調容器技術來管理,這對于計算資源的利用可以說是一臺壓榨機啊!那么我們的Docker到底跑在哪個虛擬服務器上的那個Docker Container這就無關緊要了,那是ECS考慮的事情。
接著看一個我做過的Dockerfile配置:
from openresty/openresty RUN sed -i 's#http://deb.debian.org#http://mirrors.tuna.tsinghua.edu.cn#' /etc/apt/sources.list && \sed -i '/http:\/\/security.debian.org\/debian-security/d' /etc/apt/sources.list RUN apt-get update RUN apt-get install procps net-tools locales -y RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 ENV LANG=zh_CN.utf8 ENV TZ=Asia/Shanghai COPY ["./work", "/work"] CMD ["nginx","-p","/work","-c","conf/nginx.conf","-g","daemon off;"]上面這個Dockerfile配置就是把Docker Hub的Openresty環境更為中文化了一些,并且也更為適合調試,那么通過這個自定義的Dockerfile打出來的鏡像就非常適合我的生產環境,我接著通過如下命令,就能構建Docker鏡像并在本地看到自己的Docker鏡像
docker build -t apigateway -f openresty-cmd.df . docker images|grep apigateway?
?Dockerfile構建演示圖
最后我們再將打好的Docker鏡像apigateway:latest運行起API網關的Docker容器:
docker run -d --cpu-shares 512 --memory 1G --name api_proxy_1 -p 80:80 -p 443:443 -v /opt/api_proxy/work/:/work/ --restart=always apigateway我們從上面的命令中可以看到docker run一些關鍵參數:
- -d 代表服務在后臺運行,
- --cpu-shares代表cpu分享比例,1024為1個vcpu,那么512就是1個vcpu 50%的算力
- --memory代表內存配額,目前為最大1G配額
- -p代表了內外部端口的映射
- -v代表了內外部磁盤的映射
上述這些Docker容器設定知識都是為我們下面理解Amazon ECS的任務定義提供了最基礎的幫助。
Amazon EC2部署入門
現在問題來了,難道說Amazon云技術就只有無服務的彈性容器Amazon ECS嗎?當然不是的,其實在我們印象中國內云廠商的ECS(彈性云計算服務器),對應在Amazon云產品中的術語中叫做Amazon EC2(Amazon Elastic Compute Cloud),Amazon EC2不僅可以創建服務器實例成為你的虛擬機節點,而且Amazon EC2和Amazon ECS具有共通的基礎設施環境,這塊是不是有些繞了?那么我們先看一張Amazon EC2和Amazon ECS的運行實例關系圖:
Amazon EC2、Amazon ECS運行關系架構圖
上圖其實非常簡單,只是將Amazon EC2和Amazon ECS之間的關系進行了梳理,從架構圖中運行的Amazon EC2和Amazon ECS Task實例關系,我相信大家就不會那么繞了,其實它們都共享了Amazon提供的基礎設施,這些基礎設施項你可以在自己的Amazon EC2控制臺中去維護,在Amazon ECS的任務定義中你可以新建一些基礎設施項,同樣也可以讓Amazon ECS與Amazon EC2共享基礎設施項,達到它們之間的協作,例如:讓Amazon ECS與Amazon EC2使用同一個VPC的子網段,那么Amazon EC2就能輕松通過內網IP訪問Amazon ECS容器服務。
注冊配置
(1) 注冊
首先我們要創建一個屬于自己的Amazon賬號,地址:Amazon云服務注冊地址,注冊登陸后,就進入到了Amazon管理控制臺,我們先根據導航:所有服務->計算->EC2,進入到Amazon EC2 Dashboard,在這里就可以看到所有情況。如下圖所示:這里面我們要注意右上角的區域,選擇不同區域會統計不同的計算資源情況,這個區域(region)也是后續很多配置中需要格外注意的地方,左欄就是EC2實例和關鍵基礎設施的維護入口,之后我們需要創建一個Amazon EC2實例,將此Amazon EC2實例作為我們后續對Amazon ECS協作與管理的服務節點。
?Amazon EC2 Dashboard效果圖
(2) 用戶、用戶組和密鑰
準備階段我們先不要著急創建EC2實例,我們先進入Identity and Access Management (IAM), 創建用戶和組,也就是說我們不要使用注冊Amazon云服務的賬號,而是創建一個應用訪問使用的賬號,在創建組的權限中使用AdministratorAccess,不用選擇密碼方式,直接使用“訪問密鑰”,創建好用戶之后,下載密鑰CSV文件,文件中的Access key ID,Secret access key會在之后的對ECS的配置中使用,具體配置詳情還可以參考:官網IAM設置。
(3) EC2實例的密鑰對
接著我們回到EC2 Dashboard,我們要創建一個密鑰對,如下圖所示
?密鑰對效果圖
創建好的密鑰對下載后,可以直接用于之后EC2實例的SSH登陸使用,例如:ssh -i readbyte-key-pair.pem ec2-user@34.217.211.73,這個“readbyte-key-pair.pem”就是我創建的私鑰。具體配置詳情還可以參考:官網密鑰對設置。這里需要注意的是區域,也就是說密鑰對在哪個區域創建的,那么以后EC2實例創建的時候也在哪個區域。
(4) EFS文件系統
目前仍然不要著急創建Amazon EC2實例,我們先創建Elastic File System(EFS),這是Amazon的NFS網絡文件系統,通過NFS我們就可以將Amazon ECS任務的容器目錄掛載到EFS上,那么Amazon EC2實例就可以通過網絡文件系統(NFS)掛載到本地目錄的方式,訪問EFS中ECS容器的內部文件,進行容器服務中的目錄文件配置與數據操作了。
EFS的創建很簡單,同時也創建接入點,但是需要主要vpc的設置應該與之后的Amazon EC2、Amazon ECS是一個子網段,目前初始階段也就只有默認的vpc,
?EFS連接效果圖
我們進入創建好的文件系統,點擊右上角的連接就能看到EFS對外提供掛載的路徑,就包括EFS掛載、或NFS客戶端方式。
創建Amazon EC2實例
我們重新登陸EC2 Dashboard,點擊做欄實例->創建EC2實例,如下圖所示,盡量選擇Amazon Linux 2 AMI (HVM),因為經過一些ECS優化,在嘗試階段可以使用符合條件的免費套,其實就是下一步的t2.micro實例類型,1vcpu,1G內存,作為我們體驗夠用了。
?Amazon EC2 購買選項效果圖
在步驟三中有一步非常重要,那就是找到“文件系統”項,點擊后,我們就能看到上面創建的EFS文件系統,我們需要將此文件系統掛載上,從圖中可以看到掛載到了EC2實例的/mnt/efs/fs1下面。
?創建Amazon EC2實例階段EFS掛載效果圖
在第四步的添加存儲中,我們就能看到EFS的掛載情況了
?創建Amazon EC2實例階段存儲效果圖
創建EC2實例之后我們就能在實例列表中看到創建的EC2實例,進入實例后,我們可以看到下圖中紅色框這就是外網IP和內網IP,下一步我們通過SSH登陸EC2實例進行進一步的配置。
?Amazon EC2實例信息概覽效果圖
Amazon EC2實例的Docker環境打造
首先我們用前面創建的私鑰進行ssh登陸,一定要注意 macOS 或 Linux 計算機將私鑰的文件所屬權變為400,如下面代碼所示:
chmod 400 readbyte-key-pair.pem ssh -i readbyte-key-pair.pem ec2-user@34.217.211.73下一步我們來安裝Docker服務并啟動Docker:
sudo amazon-linux-extras install docker sudo service docker start然后再將ec2-user加入到Docker組:
sudo usermod -a -G docker ec2-user這時候需要重新登陸一下ssh,我們以后操作Docker就不用再sudo了。也可以參考官網文檔:Docker 基本知識
Amazon Elastic Container Registry
ECR是Amazon自己的Docker容器Registry倉庫,通常情況下我們會使用Docker hub倉庫,有時候也會建立自己的私有Docker倉庫,例如:registry、htpasswd、nginx配合打造的私有Docker容器倉庫,不過這種維護成本很大,Amazon ECR就非常方便,私密性也很好,關鍵為Amazon ECS的容器提供了一個很舒服的Docker鏡像注冊環境。
那么我就用構建一個PostgreSQL11的鏡像文件作為實例,來看看ECR的注冊流程。
首先我們建立一個Dockerfile->postgres.df,這個Dockerfile也是對Docker hub的Postgresql11.4版本進行了必要的中文化
FROM postgres:11.4 RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 ENV LANG=zh_CN.utf8 ENV TZ=Asia/ShanghaiDockerfile構建PostgreSQL11.4版本效果圖?
Dockerfile構建PostgreSQL11.4版本效果圖當我們構建完成后,在本地的Docker images中就有了postgres_cn:11.4鏡像,我們的重點是如何將此鏡像發布到ECR上面去,那么緊接著就需要使用aws命令配置了,有了這項配置之后,就相當于具有了訪問我的賬號應用資源的授權。
aws configure其實就是四項需要:Access key ID、Secret access key、Region和輸出格式,前兩項就是我們前面創建用戶時下載到CSV文件中的密鑰,Region就是你的EC2所在區域,可以在EC2 Dashboard右上角的區域中找到對應的region name,輸出格式就是json。
?aws configure命令配置效果圖
然后我們開始為Postgres_cn鏡像創建一個Registry倉庫:
aws ecr create-repository --repository-name postgres_cn-repository --region us-west-2下面就是json輸出結果,其中的repositoryUri就是將本地Postgres_cn鏡像推送的地址:
{"repository": {"repositoryUri": "714394534197.dkr.ecr.us-west-2.amazonaws.com/postgres_cn-repository", "imageScanningConfiguration": {"scanOnPush": false}, "encryptionConfiguration": {"encryptionType": "AES256"}, "registryId": "714394534197", "imageTagMutability": "MUTABLE", "repositoryArn": "arn:aws:ecr:us-west-2:714394534197:repository/postgres_cn-repository", "repositoryName": "postgres_cn-repository", "createdAt": 1648633165.0} }看到上面的輸出,就證明創建鏡像倉庫成功了,我們再接再厲,開始tag鏡像、login倉庫、push鏡像
docker tag postgres_cn:11.4 714394534197.dkr.ecr.us-west-2.amazonaws.com/postgres_cn-repository aws ecr get-login-password | docker login --username AWS --password-stdin 714394534197.dkr.ecr.us-west-2.amazonaws.com/postgres_cn-repository docker push 714394534197.dkr.ecr.us-west-2.amazonaws.com/postgres_cn-repository從下圖中我們就能看到上述三項命令執行的效果。
?推送PostgreSQL鏡像到Amazon ECR效果圖
好了,目前Amazon ECR終于可以正常使用了,接下來的PostgreSQL鏡像就也可以存在ECR中,方便被Amazon ECS的任務定義中所引用了,同時我們也可以在官網的Docker 基本知識中獲得更詳細的了解。
Amazon ECS部署入門
Amazon ECS組成部分
在第一章的概述中同學們會對Amazon ECS到底是什么,并且與傳統ECS有什么區別有了一個基礎的概念,我們這里就將這些概念再深化一下,方便后面的部署理解。
首先我們看下圖,是官網的任務和計劃的結構體系圖,Amazon ECS在運行過程分為了集群、服務、任務,集群主要是給出了一個邏輯上的范疇,也就是說集群范圍內所啟動的任務共同組成了這樣一個容器為主的計算服務集群。
接著在集群內就可以創建服務,創建一個服務后,會為接下來需要運行的任務配置了種種基礎環境參數,例如:啟動類型、操作系統選擇、平臺版本、任務數量、集群VPC、安全組等等,那么當服務運行后會通過任務計劃在集群中放置任務,而任務如果出現故障停止,服務亦會監控到并啟動新的任務,這就提供了一個高可靠的任務運行環境。
最后就是任務了,任務來源于任務定義,在任務定義中確定了Docker容器運行所需的參數、Amazon ECS環境參數的定義、計算資源的配額、EFS等網絡文件卷的配置等等容器運行所需的元信息,甚至我們可以在一個任務中配置多個容器去運行,但是Amazon ECS并不鼓勵這樣一種做法,更傾向于一個任務一個運行的容器。具體細節我們可以深入調閱官方文檔:什么是 Amazon ECS?
?Amazon ECS任務和技術結構體系示意圖
創建Amazon ECS部署流程
(1) 創建ECS集群
首先我們進入ECS主界面,左欄包括了Amazon ECS、Amazon EKS、Amazon ECR,我們主要看Amazon ECS。點擊創建集群,我們選擇創建僅限聯網的集群模板就可以了,后兩種并非單純的Docker容器組成的任務,我們創建的集群名叫:DBCluster。
?Amazon ECS集群創建步驟一示意圖
(2) 創建任務定義
接著在任務定義入口進入后,點擊創建新任務定義,啟動類型分為了Fargate、EC2、External,Fargate是Amazon ECS的一項無服務技術,通俗點理解就是讓我們不用去考慮基礎設施中的計算資源怎樣優化,Fargate給你包辦了,我們主要使用這個類型,Amazon EC2和外部計算服務連接這兩項我們這次先暫不考慮。Fargate的具體描述可以參考官方文檔Amazon Fargate介紹。
Amazon ECS任務定義創建步驟一示意圖
下一步是任務定義,我做了一個可參考的實例:
- 任務定義名稱:pg-run-task-definition
- 需要兼容性:FARGATE
- 任務角色:ecsTaskExecutionRole
- 網絡模式:awsvpc
- Operating system family:Linux
- 任務執行角色:ecsTaskExecutionRole
- 任務內存 (GB):2GB
- 任務 CPU (vCPU):1VCPU
- 添加卷:名稱=fs-3,卷類型=EFS,文件系統ID=(選擇EFS id),訪問點ID=(選擇EFS 訪問點 id),傳輸中加密:選擇
- 添加容器
- ?容器名稱*:postgres_cn-db
- 映像*:714394534197.dkr.ecr.us-west-2.amazonaws.com/postgres_cn-repository
- 內存限制 (MiB)*:軟限制=2048
- 端口映射:5432
- CPU 單元數:1024
- 環境變量:Key=POSTGRES_PASSWORD,Value=123456
- 掛載點:源卷=fs-3,容器路徑=/var/lib/postgresql/data?
接著點擊創建,任務定義完成后,我們看看創建后的完整Json輸出,這個Json文本就是任務定義后Amazon ECS需要啟動任務實例化時讀取的信息,若回想一下我們一般用docker run時配置參數的場景,其實這些參數都可以囊括在這個Json文本中。
推薦大家多去了解這個Json的內容含義,這對于以后進入高級階段使用Amazon CDK等命令方式來創建維護Amazon ECS集群以及基礎設施環境會大有裨益。
{"ipcMode": null,"executionRoleArn": "arn:aws:iam::714394534197:role/ecsTaskExecutionRole","containerDefinitions": [{"dnsSearchDomains": null,"environmentFiles": null,"logConfiguration": {"logDriver": "awslogs","secretOptions": null,"options": {"awslogs-group": "/ecs/pg-run-task-definition-1","awslogs-region": "us-west-2","awslogs-stream-prefix": "ecs"}},"entryPoint": null,"portMappings": [{"hostPort": 5432,"protocol": "tcp","containerPort": 5432}],"command": null,"linuxParameters": null,"cpu": 1024,"environment": [{"name": "POSTGRES_PASSWORD","value": "123456"}],"resourceRequirements": null,"ulimits": null,"dnsServers": null,"mountPoints": [{"readOnly": null,"containerPath": "/var/lib/postgresql/data","sourceVolume": "fs-3"}],"workingDirectory": null,"secrets": null,"dockerSecurityOptions": null,"memory": null,"memoryReservation": 2048,"volumesFrom": [],"stopTimeout": null,"image": "714394534197.dkr.ecr.us-west-2.amazonaws.com/postgres_cn-repository","startTimeout": null,"firelensConfiguration": null,"dependsOn": null,"disableNetworking": null,"interactive": null,"healthCheck": null,"essential": true,"links": null,"hostname": null,"extraHosts": null,"pseudoTerminal": null,"user": null,"readonlyRootFilesystem": null,"dockerLabels": null,"systemControls": null,"privileged": null,"name": "postgres_cn-db"}],"placementConstraints": [],"memory": "2048","taskRoleArn": "arn:aws:iam::714394534197:role/ecsTaskExecutionRole","compatibilities": ["EC2","FARGATE"],"taskDefinitionArn": "arn:aws:ecs:us-west-2:714394534197:task-definition/pg-run-task-definition:1","family": "pg-run-task-definition","requiresAttributes": [{"targetId": null,"targetType": null,"value": null,"name": "com.amazonaws.ecs.capability.logging-driver.awslogs"},{"targetId": null,"targetType": null,"value": null,"name": "ecs.capability.execution-role-awslogs"},{"targetId": null,"targetType": null,"value": null,"name": "ecs.capability.efsAuth"},{"targetId": null,"targetType": null,"value": null,"name": "com.amazonaws.ecs.capability.ecr-auth"},{"targetId": null,"targetType": null,"value": null,"name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"},{"targetId": null,"targetType": null,"value": null,"name": "ecs.capability.efs"},{"targetId": null,"targetType": null,"value": null,"name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"},{"targetId": null,"targetType": null,"value": null,"name": "com.amazonaws.ecs.capability.task-iam-role"},{"targetId": null,"targetType": null,"value": null,"name": "com.amazonaws.ecs.capability.docker-remote-api.1.25"},{"targetId": null,"targetType": null,"value": null,"name": "ecs.capability.execution-role-ecr-pull"},{"targetId": null,"targetType": null,"value": null,"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"},{"targetId": null,"targetType": null,"value": null,"name": "ecs.capability.task-eni"}],"pidMode": null,"requiresCompatibilities": ["FARGATE"],"networkMode": "awsvpc","runtimePlatform": {"operatingSystemFamily": "LINUX","cpuArchitecture": null},"cpu": "1024","revision": 1,"status": "ACTIVE","inferenceAccelerators": null,"proxyConfiguration": null,"volumes": [{"fsxWindowsFileServerVolumeConfiguration": null,"efsVolumeConfiguration": {"transitEncryptionPort": null,"fileSystemId": "fs-08359de466dce1153","authorizationConfig": {"iam": "DISABLED","accessPointId": "fsap-029ff71869daae77d"},"transitEncryption": "ENABLED","rootDirectory": "/"},"name": "fs-3","host": null,"dockerVolumeConfiguration": null}] }(3) 創建服務
在開始創建Amazon ECS服務之前,我們先解決安全組問題,這里需要特別注意(我在這里碰了一鼻子灰)
我們在創建EC2的時候,進入EC2實例列表,然后再進入實例,如下圖所示:
它會有兩個安全組,其中紅色框的安全組就是與EFS相互聯通的安全組,如果你有興趣,可以再看看EFS那邊的安全組就一目了然啦,這就是為什么我開始創建Amazon EC2實例的時候先創建EFS并添加為該EC2實例文件系統的原因,Amazon EC2實例創建后就會設置好與EFS之間訪問控制的安全組,那么大家理解起更具體的安全組配置就有了參考。我就是先創建Amazon EC2再創建EFS,結果總是各種掛載不通,當你看懂安全組配置后,那么以后你就可以輕松駕馭EFS了。
???Amazon EC2實例安全組示意圖
后面我們會直接將Amazon EC2實例安全組的這條配置加入到Amazon ECS服務的安全組內,這樣Amazon ECS就能和EFS之間就暢通無阻了,同時我們進入EC2安全組,創建一個應用于PostgreSQL對外服務的安全組,主要是給入站規則加上PG的5432端口,出站規則不變,名稱為PG-Safe。
???創建Amazon ECS使用的安全組示意圖
接下來在集群列表中我們就能看到DBCluster集群,進入以后第一項就是服務,我們點擊創建,開始服務創建流程。
配置服務項我也列一下:
- 啟動類型:FARGATE
- 操作系統系列:Linux
- 任務定義:pg-run-task-definition
- 修訂:1
- 平臺版本:LATEST
- 集群:DBCluster
- 服務名稱:PG_DB_Server
- 服務類型:REPLICA
- 任務數:1
下一步是網絡配置
- 集群VPC:一定選擇和EC2、EFS一致的vpc,
- 子網:如果有多個,就都選擇上,最大化ECS容器的IP可用范圍。
- 安全組:選擇現有安全組,其中選擇兩個安全組項,一個是新場景的PG-Safe,另一個就是上述EC2實例中專門與EFS通訊的那條安全組。
???創建Amazon ECS服務選擇安全組示意圖
- 負載均衡器類型:無
然后一路下一步,創建服務即可,創建完服務后,也會同步創建好一個Task,我們可以再任務標簽頁看到成功運行的情況:
??PostgreSQL 任務運行示意圖
下圖的任務日志就是PostgreSQL啟動日志輸出。??PostgreSQL 任務日志示意圖
(4) ECS、EC2、EFS關聯檢查
但是別忘了最重要的一件事情,那就是我們要看看在EC2實例上掛載的EFS文件系統是否能看到Amazon ECS任務啟動后映射出去的文件目錄(PGSQL數據目錄),SSH登陸我的EC2實例,然后執行命令:
df -Th sudo ls /mnt/efs/fs1/?第一條命令我們可以看到在/mnt/efs/fs1目錄掛載了nfs4類型的網絡文件系統,這就是掛載了EFS。
第二條命令,我們可以看到掛載目錄下有PostgreSQL的數據和配置文件,這就是Amazon ECS 任務中PGSQL容器的路徑——/var/lib/postgresql/data映射到EFS文件系統上的數據。
Amazon EC2與Amazon ECS通過EFS共享文件示意圖?
總結
好了,今天就先聊到這里,?對于Amazon容器應用程序基礎設施,也不僅包括了面向Docker的ECS,還有特別適合入門級學習的Amazon Lightsail,也有針對大規模服務進行容器編排的Kubernetes,充分利用其靈活性和Amazon托管的安全性和彈性,具體入門指南我們可以進入官網學習選擇您的容器應用程序基礎設施-入門指南
除了Amazon ECS的圖形界面之外,其實Amazon ECS最大的優勢還提供特別強大的命令操作工具集合,包括:AWS Copilot、Amazon ECS CLI、AWS CDK等。這些功能可以通過非圖形界面的終端命令方式、編程的方式(TypeScrpit、JavaScrpit、Python、Java、C#),更全面且細粒度的去創建與維護Amazon ECS基礎設施,控制和優化Amazon ECS集群與任務。
不過這些功能的操作復雜程度也使人震驚,真的不得不佩服Amazon的技術大神們,創造了如此龐大的操作Amazon ECS工具集,然而對于新人來講,一開始接觸這些會煩死的!因此飯還是一口一口吃比較容易消化,大家先通過最簡單界面操作方式,讓Amazon EC2和Amazon ECS先能正常的運轉起來。
若你是一位具有探索新知精神的極客,當你真正開始觸碰到Amazon ECS這些高級強大的工具精髓時,那么你就會迷上它,它一種高度可擴展的技術平臺,你可以基于此打造出屬于自己的集群化容器自動運維體系,那么就可以從更全面且更細致的態勢去感知你所運維的服務發生的一切!好吧,更高級的Amazon ECS探索演示以后有機會再聊。
亞馬遜云科技專為開發者們打造了多種學習平臺:
1. 入門資源中心:從0到1 輕松上手云服務,內容涵蓋:成本管理,上手訓練,開發資源。AWS入門_AWS入門使用教程_AWS云計算資源-AWS云服務
2. 架構中心:亞馬遜云科技架構中心提供了云平臺參考架構圖表、經過審查的架構解決方案、Well-Architected 最佳實踐、模式、圖標等。AWS架構中心部署說明_AWS云架構白皮書-AWS云服務
3. 構建者庫:了解亞馬遜云科技如何構建和運營軟件。Amazon Builders' Library
4. 用于在亞馬遜云科技平臺上開發和管理應用程序的工具包:aws工具下載_aws開發工具_資源下載-AWS云服務
【專屬福利】
福利一:100余種產品免費套餐。其中,計算資源Amazon EC2首年12個月免費,750小時/月;存儲資源 Amazon S3 首年12個月免費,5GB標準存儲容量。
亞馬遜AWS海外區域賬戶免費套餐_免費云服務-AWS云服務
福利二:最新優惠大禮包,200$數據與分析抵扣券,200$機器學習抵扣券,200$微服務與應用開發抵扣券。最新優惠活動_云服務器促銷 - 亞馬遜云科技
福利三:解決方案CloudFormation一鍵部署模版庫
云服務解決方案部署快速入門_云服務部署-AWS云服務
總結
以上是生活随笔為你收集整理的探索入门云计算风向标Amazon的ECS容器技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 的双向绑定原理
- 下一篇: golang 实现 tcp-聊天室