1、本次分析为依据当前部分互联网客户技术架构,使得容器化多云部署可行性将决定客户迁移云厂商的决定性因素之一,主要针对目前常规业务服务载体在使用的容器技术;
2、多云K8S集群接入调研,能否兼容目前常规的容器部署使用方式。
AWS上容器产品主要有以下:
产品 | 描述 |
Amazon Elastic Container Registry (ECR) | AWS云镜像仓库,并带有构建功能,类似阿里云的容器镜像服务 |
Amazon Elastic Container Serivce (ECS) | Amazon ECS提供了AWS规范化的解决方案,用于大规模运行容器 |
Amazon ECS Anywhere | 能够将自己的基础设施加入到ECS中管理 |
Amazon Elastic Kubernetes Service (EKS) | AWS云托管K8S集群,提供标准K8S集群 |
Amazon EKS Anywhere | 能够将自己的基础设施加入到EKS中管理 |
Amazon EKS Distro | 将K8S集群部署到自己数据中心 |
AWS Proton | CI/CD工具 |
AWS Fargate | 运行容器而无需管理服务器,计费方式不一样,类似阿里云的虚拟节点 |
AWS App2Container | |
AWS Copilot |
使用AWS上容器编排产品主要是ECS和EKS两种:
ECS与EKS
产品特点
ECS是AWS提供的大规模运行容器规范化解决方案
EKS是提供标准的kubernetes集群
产品优势
与AWS上其他云产品集成更加好,具有简便性的特点
一致的开源API和广泛的灵活性
产品基础设施
EC2、AWS Fargate 、AWS Outposts、AWS Local Zones和AWS Wavelength
EC2、AWS Fargate 、AWS Outposts、AWS Local Zones和AWS Wavelength
使用方式
提供AWS API、控制台操作以及命令行工具
提供标准的kubernetes的声明式API
兼容性
提供的不是标准kubernetes的声明式API需要另外开发兼容此产品,对目前使用方式和概念有较大差异
不能直接按常规使用方法调用kubernetes的声明式API,需要在k8s-apiserver服务中兼容aws获取token
ES2容量类型
有两种容量类型,都是按需计费
spot:器单价非常低,但是在资源紧缺情况下有可能被回收,应用在无状态和容错性高的服务
no-demand:按需计价方式使用,独享EC2资源
结论
1、ECS适合没有使用过容器技术的企业场景,如果有kubernetes容器编排技术使用经验建议直接使用EKS;
2、从目前使用功能上兼容程度,使用EKS产品兼容性方面改动的工作量更少。
验证功能兼容性:
验证点 | EKS |
网络策略功能 | 兼容VPC-CNI |
Service服务暴露 | 正常 |
集群接入流程 | 已跑通部署流程,需要处理AWS的token获取问题 |
与EC2网络联通性 | 与同VPC下EC2通信正常 |
集群节点初始化 | 可直接移植方案,但会损失部分弹性功能 |
监控方案 | 可直接移植方案 |
镜像仓库拉取 | 可直接移植方案 |
Web服务部署 | |
WebShell功能 | 外网连接kubernetes的标准API效果不理想 |
创建测试EKS步骤:
1、创建服务角色eksClusterRole,EKS集群使用;
2、创建VPC,分配一个子网到对应VPC,并且将此子网切分成偶数个分配到偶数个可用区,保证高可用;
3、创建nat网关,配置EKS节点组可以访问外网;
4、创建对应安全组,不限制出站规则;
5、选择集群配置;
6、指定联网;
注意
1)选择步骤2创建的VPC和子网;
2)指定集群安全组;
3)选择可以访问集群API的方式,公有:公网访问集群API域名会解析成外网IP;私有:内网访问集群API域名会解析成外网IP,并且限制访问源地址的CIDR;
4)指定与kubernetes集群版本匹配的CNI版本,参考文档;
7、开启可用日志功能,按需开启;
8、确认创建集群;
9、添加节点组,需要使用启动模板功能实现节点初始化和自定义磁盘挂载;
10、设置计算和扩展配置
11、指定联网,选择对应密钥对和安全组;
12、确认创建,创建节点组完成
日常操作
0)安装aws命令
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/install
1)安装kubectl
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.18.9/2020-11-02/bin/linux/amd64/kubectlchmod +x ./kubectlmkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/binecho 'export PATH=$PATH:$HOME/bin' >> ~/.bashrckubectl version --short --client
2)获取kubeconfig,操作一下命令即可生成kubeconfig
aws configure
aws sts get-caller-identityaws eks --region eu-central-1
update-kubeconfig --name test
3)添加节点
a. 进入节点组
b. 点击编辑
c. 修改节点组个数
1、aws集群中使用了用户验证的功能,client.authentication.k8s.io/v1alpha1,执行aws命令获取token,目前使用kubernetes_asyncio的k8s-apiserver服务不支持这个功能参考文档:
https://kubernetes.io/zh/docs/reference/access-authn-authz/authentication/
https://github.com/tomplus/kubernetes_asyncio
- name: arn:aws:eks:eu-central-1:897852104257:cluster/test
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- eu-central-1
- eks
- get-token
- --cluster-name
- test
command: aws
解决方式:
需要将aws命令打入镜像和aws configure配置好,并且将kubernetes_asyncio升级到12.0.1版本
2、容器网络策略功能自建集群使用kube-router作为CNI,EKS上VPC-CNI目前只明确支持Calico的NetworkPolicy,需要测试VPC-CNI是否兼容发布平台网络策略功能(未确认)
解决方法:
理论上是兼容的,需要测试VPC-CNI确认是否支持
3、使用kubectl logs时候,执行失败显示没有权限查看日志
解决方法:
需要安装aws命令行,并且输入拥有集群权限的用户token
aws configure
4、用户创建集群时候,默认有集群管理员权限,如果创建集群用户被删除后会出现访问kubernetes标准API失败
参考文档:
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/add-user-role.html
解决方法:
用户先创建token,添加更多用户到这个集群的管理员中,操作步骤如上文档
5、EKS集群配套监控方案
解决方法:可直接移植方案(ELK/EFK等)
6、镜像拉取,海外文件传输
解决方法:可直接移植方案(自建镜像仓库或使用ECR)
7、阿里云迁移到AWS,业务容器迁移方案
解决方法:目前发布平台已有容器迁移功能,重点在业务流量切换、EKS适配改造和镜像传输
8、节点初始化问题,磁盘不能挂载多个和节点初始化playbook需要适配
解决方法:目前EC2有启动模板功能,启动模板功能支持初始化脚本运行和自定义磁盘挂载,需要做节点初始化适配
结论:可以使用AWS的EKS产品,并且需要完成以下改造适配:
1、节点启动模板配置初始化脚本和自定义磁盘挂载,节点初始化playbook适配;
2、k8s-apiserver改造,兼容EKS的kubeconfig获取AWS的token;
3、代理镜像仓库搭建;
4、EKS集群配套监控方案搭建;
*5、创建Service时候可以使用AWS的LB暴露Service更优,并且不会存在阿里云的LB数量限制和Service需要在不通LB上。