云K8S - AWS容器库ECR(ERS)编排ECS-EKS以及阿里云编排ACS-ACK

时间:2023-09-19 21:29:14

云K8S相关

AWS 部分-ECR(ERS) ECS EKS

20180824 Chenxin
AWS的容器编排目前分为 ECS 和 EKS 两种.

AWS价格说明

Fargate模式的ECS,换算成EC2性能的话,价格大约相差了5倍.
Fargate的优势是省去了管理EC2的麻烦,以及编排带来的额外风险.

AWS ECS实验内容(不推荐)以及容器库ECR

Fargate模式(价格贵)(不推荐)

创建流程说明:
集群default -> 服务custom-service(负载均衡,同时还可以配置auto-scaling) -> 任务(可以有多个,供负载均衡将外部请求分发过来)

镜像
镜像制作:docker 自启动服务(nodejs npm express 服务) 可以参考:https://blog.devzeng.com/blog/build-docker-image-with-dockerfile.html
将制作的镜像push到ECR库里
ERS 库 与 ECS集群 (使用自定义镜像来创建容器)

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集群).

使用fargate模式创建集群,启动2个一致的容器(都会分配公网IP),测试ECS

查看ECS对应的监控指标(只有CPU,内存)

测试已有VPC-02下,是否可以创建ECS集群 (可以的,创建集群->任务->服务(选择VPC,子网).不要使用向导模式,向导模式只能由ECS自己创建).
测试ECS负载均衡(只有应用程序负载均衡器,HTTP协议),该ELB会出现在EC2控制台里,并可以额外配置(会分配域名).每个"任务"同样会被分配公网IP.相当于单独的ELB的管理模式.

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

原理:通过在EC2上自动安装1个ECS的代理程序来实现.

创建流程
1.创建任务
这里的任务类型需要选择EC2,而非fargate模式.
完成后,可以看到:任务定义->生成器->兼容性 EC2 ,需要兼容性 EC2.
每个任务可以建立多个版本,每个版本里,可以指定不同的端口对应容器里固定的端口,这样就可以实现在EC2上开启多个容器(相同容器,相同端口,绑定EC2的不同端口.对外提供服务端口跟EC2开放的端口一致).

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存储等方式.