雲K8S - AWS容器庫ECR(ERS)編排ECS-EKS以及阿里雲編排ACS-ACK

雲K8S相關

AWS 部分-ECR(ERS) ECS EKS

20180824 Chenxin
AWS的容器編排目前分爲 ECS 和 EKS 兩種.html

AWS價格說明

Fargate模式的ECS,換算成EC2性能的話,價格大約相差了5倍.
Fargate的優點是省去了管理EC2的麻煩,以及編排帶來的額外風險.node

AWS ECS實驗內容(不推薦)以及容器庫ECR

Fargate模式(價格貴)(不推薦)

建立流程說明:
集羣default -> 服務custom-service(負載均衡,同時還能夠配置auto-scaling) -> 任務(能夠有多個,供負載均衡將外部請求分發過來)python

鏡像
鏡像製做:docker 自啓動服務(nodejs npm express 服務) 能夠參考:https://blog.devzeng.com/blog/build-docker-image-with-dockerfile.html
將製做的鏡像push到ECR庫裏
ERS 庫 與 ECS集羣 (使用自定義鏡像來建立容器)linux

push鏡像到ECR
在ERS裏,建立1個test庫.
在本地建立docker的鏡像,好比express的鏡像,容器開放3000端口.
而後在本地將該容器生成1個新鏡像.爲: docker container commit a5a40bad64c2 myapp:1.0.1
登錄ERS
本地得到ERS的認證信息: aws ecr get-login --no-include-email --region us-east-1
以上命令輸出內容,直接複製執行: docker login -u AWS -p ey...fQ https://615624949551.dkr.ecr.us-east-1.amazonaws.com
登錄ERS成功
打tag: docker tag myapp:1.0.1 615624949551.dkr.ecr.us-east-1.amazonaws.com/test:v3
push到ERS的庫裏去: docker push 615624949551.dkr.ecr.us-east-1.amazonaws.com/test:v3
以後可使用該test:v3鏡像來建立容器(ECS集羣).nginx

使用fargate模式建立集羣,啓動2個一致的容器(都會分配公網IP),測試ECSredis

查看ECS對應的監控指標(只有CPU,內存)docker

測試已有VPC-02下,是否能夠建立ECS集羣 (能夠的,建立集羣->任務->服務(選擇VPC,子網).不要使用嚮導模式,嚮導模式只能由ECS本身建立).
測試ECS負載均衡(只有應用程序負載均衡器,HTTP協議),該ELB會出如今EC2控制檯裏,並能夠額外配置(會分配域名).每一個"任務"一樣會被分配公網IP.至關於單獨的ELB的管理模式.express

EC2模式(便宜,管理上多花功夫.不推薦)

原理:經過在EC2上自動安裝1個ECS的代理程序來實現.npm

建立流程
1.建立任務
這裏的任務類型須要選擇EC2,而非fargate模式.
完成後,能夠看到:任務定義->生成器->兼容性 EC2 ,須要兼容性 EC2.
每一個任務能夠創建多個版本,每一個版本里,能夠指定不一樣的端口對應容器裏固定的端口,這樣就能夠實如今EC2上開啓多個容器(相同容器,相同端口,綁定EC2的不一樣端口.對外提供服務端口跟EC2開放的端口一致).vim

2.建立集羣
->選擇linux-EC2模式->配置對應的EC2信息->啓動集羣(這裏注意不要建空集羣,不然後面ECS實例裏會是空的,無實例可用.這個應該是給自建準備的).
有了ECS實例,其餘的服務,任務纔能有基礎資源可用.因此要先建立ECS實例(建立集羣的時候).
這時,會拉起1個EC2,並啓動docker服務.目前尚未任務被啓動.

3.建立服務
->選擇EC2模式,VPC,子網,ELB等信息(若是有問題,能夠經過"任務"裏去建立"服務")
服務會經過代理程序,經過ECS實例(EC2)中的image(經過ERS來pull),啓動1個container.
若是該container沒有把3000端口綁定到主機上,請檢查任務類型是不是EC2模式的,若是是fargate模式則會形成不兼容)
一個服務裏能夠跑一個任務版本(如first-run-task-definition:6)的多個副本(相同的多個容器,每一個容器在不一樣的EC2上).

以後,能夠在集羣裏再次添加ECS實例("擴展ECS實例"方式擴展EC2主機).
一個ECS實例(EC2),能夠跑多個任務.

能夠在集羣裏註冊多個服務(同一個服務裏能夠啓動多個相同的任務).(若是再集羣裏建立服務失敗,就從"任務"裏去建立服務).

以上注意結合NLB服務使用.生產環境考慮autoscaling自動擴展.

自建EC2模式的ECS(不推薦)

參考 https://medium.com/@VeckHsiao/aws-ecs-%E5%B0%87%E5%BB%BA%E7%AB%8B%E7%9A%84-ec2-instance-%E5%8A%A0%E5%85%A5%E6%8C%87%E5%AE%9A%E7%9A%84-cluster-a947d950c208

EC2安裝代理與EC2向ECS註冊自身
安裝ECS容器代理 https://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/ecs-agent-install.html (使用"在 Amazon Linux EC2 實例上安裝 Amazon ECS 容器代理"這一小節便可.注意,文檔缺乏 /etc/ecs/ecs.config 配置文件的說明 ECS_CLUSTER=default )
爲ECS容器實例添加角色/策略 https://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/instance_IAM_role.html (能夠先使用fargate模式自動生成)
ECS容器代理配置 https://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/ecs-agent-config.html (能夠不看)

操做步驟
1 以通常方式起 Instance
2 到 EC2 console(控制檯) 將 ecsInstanceRole 這個 IAM policy attach 到這個 instance 上
若是缺乏這步,/var/log/ecs/裏會一直報錯,報錯相似:
ecs-agent.log文件:Error getting valid credentials (AKID ): NoCredentialProviders: no valid providers in chain. Deprecated.
ecs-init.log文件:Container name: /ecs-agent ... Agent exited with code 1
3 SSH進入 EC2 instance
4 yum install -y ecs-init
5 touch /etc/ecs/ecs.config , vim /etc/ecs/ecs.config 填入 ECS_CLUSTER=default
6 service docker start
7 start ecs

檢查服務是否正常
[root@ip-10-16-0-101 ecs]# curl http://localhost:51678/v1/metadata
{"Cluster":"default","ContainerInstanceArn":"arn:aws:ecs:us-east-1:615624949551:container-instance/04c9...aa","Version":"Amazon ECS Agent - v1.20.1 (02a6a9ff)"}

無需關注iptables.要確保"2"步驟的IAM的ecsInstanceRole 才能成功.

集羣,服務,任務,容器 的嚮導模式建立(概念性,能夠不看)

Fargate模式建立ECS集羣
選擇"Amazon-ECS"->"集羣"->"開始使用",經過嚮導模式來建立 容器+任務+服務+集羣.
這裏能夠選擇Fargate模式,也能夠選擇EC2模式的.
嚮導會自動建立1個10.0.0.0/16的VPC,以及2個子網,路由表,internet網關,安全組等對應的網絡配置.

訪問:
建立完成後,點選該集羣,選擇"任務"列表,點擊該任務的超連接,能夠看到該任務的詳細信息(包括內網IP,外網IP等).經過外網IP能夠訪問服務.(好比入門裏的Nginx,或者app).

添加任務
選擇集羣default2->"服務"列表->"更新",將任務數量從"1",調整爲"2",則會自動額外再啓動1個docker,並添加到該服務裏.

選擇集羣default2->"任務"列表->"運行新任務",添加新的任務進來.一樣會有對應的內網IP,外網IP匹配到該docker.(記得選擇適當的跟任務1匹配的VPC,子網,安全組).
這種方式添加的任務沒有在"服務"裏顯示.只顯示在集羣->任務 列表.貌似沒有辦法加入到"服務"裏去.

建立順序
集羣 -> 服務(過程當中會建立容器,對應有任務)

刪除集羣遇到的問題
不一樣的集羣,最好使用不一樣的VPC.不然在刪除某個集羣的時候,對應的VPC內還有其餘集羣的話,可能會形成沒法刪除或其餘問題.

ECS(不推薦) 與 EKS(推薦) 比較說明

編排和ECS
編排指的是容器的集羣化和調度。 另外一類含義指的是容器管理,負責管理容器化應用和組件任務。
ECS是一種高度可擴展的高性能容器編排服務,讓您能夠在 AWS 上輕鬆運行和擴展容器化應用程序。

使用ECS,您不須要安裝和操做本身的容器編排軟件,不須要管理和擴展虛擬機集羣,也不須要在這些虛擬機上調度容器。
ECS 讓您能夠處理長期運行的應用程序、服務和批量進程。ECS 讓您根據應用程序的容量需求來對容器進行擴縮。ECS 集成 ELB、EBS 卷、VPC 和 IAM。Fargate 能夠完全消除服務器預置、羣集管理和編排工做。ECS 使用 Fargate 預置的容器對您的容器進行自動擴展、負載均衡和計劃管理工做以便保證可用性,能夠輕鬆地構建和運行容器化應用程序。

關於EKS
簡單來說,就是一種ECS,只不過它是K8S版本的,區別於aws版本的ECS.

AWS EKS (推薦)

2019/03/28 Chenxin
參考:
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/getting-started.html AWS EKS 入門
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/what-is-eks.html AWS EKS 文檔
https://amazonaws-china.com/cn/eks/ AWS EKS 介紹 (主頁)

EKS建立步驟(同入門文檔)

準備工做
建立IAM的對應服務角色,以便aws eks自動具備一些必須的權限.
經過cloudformation建立VPC(會自動建立對應的安全組,網絡配置等)
爲 Amazon EKS 安裝和配置 kubectl.隨便找臺機器(Centos7,不然沒法命令自動補全kubectl)根據aws要求安裝kubectl.
在此機器上爲 Amazon EKS 安裝 aws-iam-authenticator.
在此機器上下載並安裝最新 AWS CLI(以及python版本需求).

正式建立
1.master部分
建立您的 Amazon EKS 集羣;
aws configure # 配置對應的aws相關認證信息(密鑰以及地區);
配置 kubectl: aws eks --region region_name update-kubeconfig --name cluster_name (這裏有clustername,以及經過aws cli的密鑰認證)
若是有多個k8s集羣使用一個kubectl來管理,能夠繼續執行上述命令(修改對應的cluster_name).
當前要管理那個k8s集羣,就手動修改/root/.kube/config 文件的內容,相似以下:
current-context: arn:aws:eks:ap-southeast-1:615624949551:cluster/eks-cluster-02 # 支持井號註釋

2.worker部分
a.建立獨立的worker
啓動和配置 Amazon EKS 工做線程節點(worker node)(AMI須要選擇aws提供的eks對應版本的最新AMI(是基於Amazon Linux 2 AMI (HVM)的一個AMI.2019/04/02爲新加坡ami-00c91afdb73cf7f93.此爲官方推薦的針對EKS作過優化的AMI(涉及到磁盤大小,docker服務,以及worknode服務的啓動(kubelet等).這裏也會建立autoscaling,會顯示到ec2的控制檯裏.

b.將剛建立的那些worker(不管是否已經啓動),加入到集羣中
在kubectl機器上操做,將worker加入集羣(worker1會有2個私有IP,6個輔助私有IP.worker2,3各有1個私有IP,3個輔助私有IP.且都是對應的子網地址).這步須要上步worker的NodeInstanceRole.

c.部署應用
部署應用並測試(部署應用後,kubectl get services -o wide會看到一個外部域名,相似aa1c9.....301.ap-southeast-1.elb.amazonaws.com ,以及映射的端口.直接經過此域名和端口便可訪問服務,這是個ELB,對應的安全組在ELB裏,當前爲自動生成的).

EKS其餘測試

集羣伸縮
是否能夠手動修改autoscaling裏的配置?仍是必須經過cloudformation來修改?
使用cloudformation直接修改autoscaling相關參數是能夠的,好比最大啓動實例從4->3個,k8s集羣會相應踢掉1臺worker.
是否會自動將Pod轉移呢?等了半小時依然沒有轉移到其餘的worker上.多是worker資源有限形成.
直接使用EC2裏的autoscaling呢?從3->4,以前一直處於pending的2個pod,自動在新生成的worker上重建了.當cloudformation的配置沒有跟着同步變化.可能會形成刪除cloudformation異常.
在k8s裏有svc和自動生成的elb狀況下,直接在控制檯刪除cloudformation的worker堆棧,會怎樣呢?以前是手動修改的ec2控制檯的autoscaling裏的數量,跟cloudformation的配置已經有不一致狀況.這樣操做,cloudformation裏的堆棧能夠刪除.ec2裏的autoscaling也自動刪除了.ec2裏的elb因爲是k8s建立的svc的時候建的,因此這裏沒有刪除kubectl delete ...對應的那些服務就會刪除該elb.對應的那些ec2實例也自動刪除了.

集羣更新k8s集羣軟件版本(aws k8s當前默認1.11)
部署一個應用(使用入門裏的案例)

更新k8s的master對應的軟件版本
->1.12.大約須要30分鐘左右.

更新k8s的worker的AMI
->1.12.大約須要幾分鐘.直接修改cloudformation的配置並更新便可.
會逐個將老的EC2實例終止,並同時建立對應的新的EC2.
worker對應的公網IP和內網IP都會發生變化.
ELB不會發生變化.
原容器被刪除,生成新的容器(因數據爲非持久,因此新的Pod的redis數據會是空的).

檢查應用是否正常(服務可能會短暫中斷一下,大約1分鐘或更短).

刪除應用
是否會將ELB,以及對應的安全組自動刪除?
會.多是由於每一個worker裏有個k8s-agent進程來實現.ELB的刪除須要手動在kubectl機器上執行對應的kubectl delete svc-xxx.elb不是有cloudformation堆棧生成的.

刪除集羣
刪除集羣裏用戶自建的服務 kubectl get svc --all-namespaces; kubectl delete svc service-name;(直接刪除集羣的話,建立應用時自動生成的如ELB就可能會忘記刪除).
刪除cloudformation裏的建立worker的堆棧.大約須要5分鐘.
刪除eks集羣.大約須要20分鐘左右.
刪除cloudformation裏的建立VPC的堆棧.大約須要2分鐘.

多個集羣使用1臺kubectl管理
支持.不過切換集羣須要手動修改/root/.kube/config 文件(先加入新建立的集羣 aws eks --region region_name update-kubeconfig --name cluster_name)

存儲掛載
使用存儲類.

監控如何實現
部署k8s控制面板部分裏有.使用的爲第三方的實現方式.

API調用記錄
使用 Amazon EKS 記錄 AWS CloudTrail API 調用

鏡像倉庫
ECR,略


阿里雲部分

阿里雲ACK由來

2019/03/19 Chenxin

參考:
https://help.aliyun.com/product/85222.html?spm=a2c4g.11174283.6.540.15802ceetQktcm 容器服務Kubernetes版(ACK)
https://help.aliyun.com/product/25972.html?spm=a2c4g.750001.2.4.3fd47b131Kwvwi ACS

服務種類
阿里雲容器編排目前分爲 Ali Container Service(ACS) 與 Ali Container Service for kerbernetes(ACK) 兩個版本.

ACS 包括了原版的swarm(即將下架)和普通k8s的說明.(不推薦)

ACK 服務三種Kubernetes集羣形態
a.專有版Kubernetes:
會建立3個以上Master節點及若干Worker節點.用戶承擔Master節點和Worker節點的資源費用。-- 不推薦
b.託管版Kubernetes:
只需建立Worker節點,Master節點由容器服務建立並託管。您能夠更多關注業務自己。用戶承擔Worker節點的資源費用。-- (推薦).
c.Serverless Kubernetes:
無需建立和管理Master節點及Worker節點.直接啓動應用程序。按容器實例的使用資源量和時長(秒)計費。-- 無狀態,當前爲公測,推薦.

ACK基礎概念

2019/07/20 Chenxin
1.概念
路由 Ingress

2.聲明
容器服務即將中止對Swarm的技術支持(至2019年末中止Swarm服務和控制檯等相關支持).

3.問題
master是否收費?託管版不收費,專有版收費.
使用已有實例到k8s集羣的worker裏,數據會清空嗎?會替換系統盤,系統盤的數據會被清空.
worker能夠不用root權限來執行嗎?部分支持,但仍存在被提權可能,且目前不易管理.

ACK 建立/管理/變動

1.建立ACK會自動生成的資源(增長的服務)

彈性伸縮
1組 (2-1000臺) 彈性伸縮(ESS) 將使用彈性伸縮組建立 worker 節點

SLB
2個(1個內網API調用,開放6443,供kubectl; 1個外部使用,爲ingress,供外部訪問集羣內資源)
負載均衡 SLB - 私網 API Server SLB
負載均衡 SLB - 公網 Ingress SLB 按量付費 (供外部訪問k8s內部的service用的)

EIP
1個(就是NAT網關的IP)
彈性公網 IP(EIP) 公網帶寬 : 按使用流量計費 1 按量付費

NAT
1個(同EIP的地址,爲同1個資源)
NAT 網關 若 VPC 網絡內不存在 NAT 網關,將自動建立 1 按量付費

日誌服務
1個

ECS
2臺,雲服務器 ECS - Worker

彈性網卡(未知)
根據集羣配置不一樣,將會建立 1-2 塊彈性網卡

資源編排 ROS
將自動建立名稱以 k8s-for-cs 開頭的資源棧

安全組
1

訪問控制
RAM

2.建立過程當中的網絡配置(自動,推薦)
Pod CIDR 172.20.0.0/16
Service CIDR 172.21.0.0/20 (172.21.0-15.x)

3.須要受權(自動受權)
ROS 資源編排
ESS 彈性伸縮
SLB 負載均衡
SLS 日誌服務

4.節點說明
master(阿里雲託管)
worker(用戶可管理)

5.節點的管理(經過kubectl)
kubectl機器
建立獨立的一臺機器,用於管理K8S,就是kubectl工具.
kubectl安裝說明請參考 https://kubernetes.io/docs/tasks/tools/install-kubectl/ (推薦採用google的yum源安裝,也爲最新版)
命令自動化(推薦直接注入到bash_completion裏) kubectl completion bash >/etc/bash_completion.d/kubectl (執行完,要退出當前終端再加載變量)
使用獨立的k8s用戶來執行平常操做(非root用戶) useradd k8s
配置kubectl訪問集羣的認證文件 mkdir $HOME/.kube
將阿里雲k8s集羣憑據複製到該文件 $HOME/.kube/config
嘗試SSH鏈接master和worker節點
從該憑據文件中可得,master的外網IP和內網IP地址,以下
47.244.215.234 (API Server 公網鏈接端點 https://47.244.215.234:6443)
10.0.1.225 (API Server 內網鏈接端點 https://10.0.1.225:6443)
這裏是託管模式,故SSH是沒法鏈接master的.
若是想鏈接worker節點,能夠經過worker的安全組放行SSH,就能夠了(密碼是控制檯建立worker時定義的).

6.手動擴容/縮容測試(手動)
worker擴容,經過控制檯擴容.
若是須要刪除worker,則在控制檯的"節點列表"中,對該節點進行移除操做(移除時,能夠選擇釋放ECS).

7.自動擴容/縮容測試(自動)
目標: 根據CPU使用狀況,來配置自動縮容的最大和最小ECS實例數.
默認在建立K8S集羣的時候,"彈性伸縮"裏會自動建立一個0-1000個ECS的彈性收縮(這個是手動來增長減小的).
K8S集羣->更多->自動伸縮->在K8S控制檯額外再建立彈性伸縮的時候,會再建立一個彈性伸縮組,處於"待激活"狀態.須要在裏面額外建立此伸縮組的條件,如最小實例數,最大,ECS規格,可用區,ECS登錄密鑰等.

8.網絡管理部分 知識說明

a.Ingress 路由
一般狀況下,service 和 pod 的 IP 僅可在集羣內部訪問。集羣外部的請求須要經過負載均衡轉發到 service 在 Node 上暴露的 NodePort 上,而後再由 kube-proxy 經過邊緣路由器 (edge router) 將其轉發給相關的 Pod 或者丟棄,而 Ingress 就是爲進入集羣的請求提供路由規則的集合。
Ingress 能夠給 service 提供集羣外部訪問的 URL、負載均衡、SSL 終止、HTTP 路由等。爲了配置這些 Ingress 規則,集羣管理員須要部署一個 Ingress controller,它監聽 Ingress 和 service 的變化,並根據規則配置負載均衡並提供訪問入口。
Ingress 的組成部分
Nginx:實現負載均衡到pod的集合。
Ingress Controller:從集羣api獲取services對應pod的ip到nginx配置文件中。
Ingress:爲nginx建立虛擬主機。

b.共獲得的公網IP說明
SLB
內網SLB,開放6443,供內網API調用訪問(kubectl).
公網SLB,開放443,80. 公網IP 47.244.210.142 k8s/32720/nginx-ingress-lb/kube-system/clusterid (ingress用的)

EIP
SNAT NAT網關(ngw)這個應該是爲172.20.x.x/16 網段訪問公網用的(k8s內).默認的機器沒有公網IP沒法訪問公網(待確認).
說明,若不勾選爲專有網絡配置SNAT,您須要自行配置NAT網關實現VPC安全訪問公網環境;或者手動配置 SNAT,不然 VPC 內實例將不能正常訪問公網,會致使集羣建立失敗。
EIP裏有個是SNAT(NAT)的,EIP ngw 47.244.216.125 ngw-j6c53r2n3kmahazp8zbko NAT 網關.
ingress有1個,也就是slb的一個.SLB 47.56.70.236 (443/80) ingress.

9.刪除
自動刪除時間大約須要5分鐘.
EIP中,原先的自動建立的2個EIP(帶寬分別都是100M的),已被自動刪除.(一個應該是ACK網關的,一個是ACK建立後自動生成的SLB的)
ACK建立的如下資源不會自動刪除,須要手動去刪除.
SLB 負載均衡,查證後,發現3個SLB都已經被刪除(一個是建立集羣的時候,供443調用API的(應該是kubectl).另外2個,一個應該是網關服務的,一個應該是deployment的.(還不是很肯定)
SLS 日誌服務,須要手動去刪除.

10.鏡像配置
Registry登陸密碼 (須要用阿里雲根帳號開通服務,設置Registry密碼) 等待
用戶名: 阿里雲帳戶全名
passwd: DockerR168!@#legend

Deployment/StatefulSet/worldpress測試

私有鏡像倉庫建立

部署高可靠 Ingress Controller

存儲

參考 https://help.aliyun.com/document_detail/100713.html?spm=a2c4g.11186623.2.23.4ffe20d7mXv71A 最佳實踐->存儲 ACK支持 靜態雲盤,動態雲盤,阿里雲NAS存儲,OSS存儲等方式.

相關文章
相關標籤/搜索