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

相关文章
相关标签/搜索