亚马逊AWS官方博客

使用 KubeSphere 管理 Amazon EKS Anywhere 集群

Amazon EKS Anywhere 介绍

近日,亚马逊云科技开源了 Amazon EKS Anywhere。这个项目为 Amazon EKS 提供了一种新的部署模式,可以在本地数据中心使用虚拟机轻松创建和管理 Kubernetes 集群,并利用 Amazon EKS Distro 的优势,为您的数据中心带来一致的 Kubernetes 运维管理体验。它可以对多个Kubernetes集群进行全生命周期管理,为用户灵活交付 Amazon EKS 容器服务。

Amazon EKS 能够帮助您自动化集群管理,缩减成本,免去使用多个开源或第三方工具来操作Kubernetes集群的繁杂工作。您还可以构建自己的管理工具来创建 Amazon EKS Distro 集群、配置操作环境和更新软件。

通过 Amazon EKS Anywhere,你还可以获得亚马逊云科技对集群配置、机器操作系统和第三方集成的默认优化值,这些优化让你专注于业务创新,而不是复杂的组件兼容性或企业内部和云环境之间的部署兼容性。此外,你可以利用 Amazon EKS 控制台来查看你所有通过 Amazon EKS Anywhere 部署的 Kubernetes 集群。

Amazon EKS Anywhere 目前只支持 VMware vSphere,未来将支持裸机部署。

KubeSphere 介绍

KubeSphere 是基于 Kubernetes 构建的容器平台,完全开源,并通过极简的界面交互提供多云与多集群管理、DevOps、可观测性、微服务治理、边缘计算、应用管理等功能,提供强大的网络与存储管理能力,能够帮助企业在公有云、虚拟化及物理机等异构基础设施上完成容器架构的快速构建、部署及运维,实现应用的持续交付与全生命周期管理。

KubeSphere 的联邦集群管理功能可以把多个异构基础设施 Kubernetes 与 Amazon EKS 以及产品家族统一纳管,用户在部署应用时,可以把应用的多个副本按照业务需求分布到多个不同的 Kubernetes 资源池里,并通过 KubeSphere 进行统一运维管理,从上层构建实现跨区、跨集群的高可用。

2021年 1 月,KubeSphere 正式入驻 亚马逊云科技 Quick Start,为全球用户部署云原生应用提供了一键部署 Amazon EKS 和 KubeSphere 的能力,通过 KubeSphere 丰富的应用管理功能,帮助用户加速云原生落地。

如果将 KubeSphere 和 Amazon EKS Anywhere 强强联合,会产生什么样的效果呢?本文就带领大家来上手实践一下。

本系列文章将会分成两篇进行介绍。本篇文章介绍 Amazon EKS Anywhere 以及如何安装 Amazon EKS Anywhere 和 KubeSphere;接下来有机会我们将会介绍如何使用 KubeSphere 统一纳管 Amazon EKS Anywhere 和 Amazon EKS。

创建 Amazon EKS Anywhere 集群

前提

运行 Amazon EKS Anywhere 需要满足:

  • 一个运行了 vCenter 的 vSphere 6.7+ 环境
  • 能够部署 8-10 个虚拟机
  • vSphere 环境有运行中的 DHCP 服务为创建的工作负载提供服务
  • 一个在 vSphere 环境中能够提供给集群使用的网络
  • 把 OVA 模板导入到 vSphere 并制作成模板
  • 具有 vCenter 管理员权限
  • 一台用于执行命令的管理服务器

管理服务器要求:

  • CPU 架构:amd64
  • CPU 4核
  • 内存 16G
  • 磁盘 100G
  • 操作系统 Mac OS (10.15) / Ubuntu (20.04.2 LTS)
  • 能够通过 https/443 访问 vCenter
  • 用户必须在 docker 用户组或是 root 用户,以确保有操作 docker 的权限
  • 有文件的写权限
  • 能够访问以下 URL:
    • public.ecr.aws
    • anywhere-assets.eks.amazonaws.com (下载二进制、配置清单和 OVA 模板)
    • distro.eks.amazonaws.com (下载 Amazon EKS Distro)
    • d2glxqk2uabbnd.cloudfront.net (作为 Amazon EKS Anywhere 和 Amazon EKS Distro ECR 的存储仓库)
    • api.github.com (如果不启用 GitOps 则不需要)

一个 Amazon EKS Anywhere 集群需要创建6到10虚拟机,每个节点资源需求:

  • CPU 2核
  • 内存 8G
  • 磁盘 100G

下载 OVA 镜像

首先需要下载 OVA 镜像,根据不同的操作系统和不同的 Kubernetes 版本选择相应的 OVA 镜像:

导入模板

可使用 vCenter web 界面导入模板,此处咱不针对 vCenter 中导入模板进行详细描述,可参考文档 xxx。

模板添加完成后,需要创建名称为 “os:ubuntu” 的标记和名称为 “eksdRelease:kubernetes-1-20-eks-6” 的标记

然后勾选创建的两个标记,点击分配即可。

设置管理服务器

管理服务器用来执行各种操作命令,需要先安装 docker 和 kubelet。

$ sudo apt update
$ sudo apt install -y docker.io
$ sudo usermod -a -G docker $USER
$ wget https://distro.eks.amazonaws.com/kubernetes-1-19/releases/4/artifacts/kubernetes/v1.19.8/bin/linux/amd64/kubectl
$ mkdir -p $HOME/bin
$ chmod +x kubectl
$ mv kubectl $HOME/bin/
$ echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc

安装完成后,需要退出然后重新登录系统从而获取准确的用户组权限和 PATH 环境。

安装最新版本的 eksctl(Amazon EKS Anywhere 所需的 eksctl 最低版本为 0.66.0)。

$ curl "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" \
    --silent --location \
    | tar xz -C /tmp
$ sudo mv /tmp/eksctl /usr/local/bin/

安装 eksctl-anywhere。

$ export Amazon EKSA_RELEASE="0.5.0" OS="$(uname -s | tr A-Z a-z)"
$ curl "https://anywhere-assets.eks.amazonaws.com/releases/eks-a/1/artifacts/eks-a/v${Amazon EKSA_RELEASE}/${OS}/eksctl-anywhere-v${Amazon EKSA_RELEASE}-${OS}-amd64.tar.gz" \
    --silent --location \
    | tar xz ./eksctl-anywhere
$ sudo mv ./eksctl-anywhere /usr/local/bin/

创建集群使用的认证文件,用于 Amazon EKS Anywhere 集群节点 ssh 登陆认证。

$ ssh-keygen -f eks-a

$ cat eks-a.pub
  ssh-rsa AAAAB3NzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoE= root@localhost

获取 vCenter 认证文件的 sha1 thumbprint。

# 安装 govc
$ wget -c https://github.com/vmware/govmomi/releases/download/v0.25.0/govc_Linux_x86_64.tar.gz -O - | tar -xz
$ chmod +x ./govc
$ mv ./govc /usr/local/bin
$ cd ..
$ rm -rf govc/
$ govc version -l

# 设置 vCenter 地址和管理员的用户密码
$ export GOVC_URL="xxx"
$ export VSPHERE_USERNAME=xxx
$ export VSPHERE_PASSWORD=xxx

# 获取 vCenter 认证文件 的 thumbprint
$ govc about.cert -k=true -thumbprint
$ xxx.xxx.xxx.xxx aa:bb:cc:xx:xx:xx:xx:cc:bb:aa

创建集群配置文件

集群名称必须是小写字母,不要包含大写字母或特殊字符。

$ CLUSTER_NAME=prod
$ eksctl anywhere generate clusterconfig $CLUSTER_NAME \
   --provider vsphere > eksa-cluster.yaml

以下是一个带注释的模板参考,使用时请删除中文注释。

创建 Amazon EKS Anywhere 集群

创建集群前,还需要设置 vSphere 的用户和密码。

# 设置你的 vCenter 管理员用户密码
$ export Amazon EKSA_VSPHERE_USERNAME='<Username>'
$ export Amazon EKSA_VSPHERE_PASSWORD='<Passwd>'

最后创建集群。

$ eks-a create cluster -f ${CLUSTER_NAME}.yaml

安装过程中你将看到如下输出。

在创建过程中,Amazon EKS Anywhere 将在集群名称目录(例如 $PWD/$CLUSTER_NAME/)创建 .kubeconfig 文件,你可以使用该文件通过 kubectl 查看集群状态和部署工作负载。

$ export KUBECONFIG=${PWD}/${CLUSTER_NAME}/${CLUSTER_NAME}-eks-a-cluster.kubeconfig
$ kubectl get ns

如果你的集群是通过本地电脑创建的,你可以把 KUBECONFIG 文件保存到集群管理服务器上,同样你也可以把管理服务器上的 KUBECONFIG 文件保存到本地用于管理集群。

部署 KubeSphere v3.2.0

准备持久化存储

Amazon EKS Anywhere 集群默认使用 亚马逊云科技 CSI 作为默认存储,这里将其替换为 OpenEBS 作为默认存储。

$ kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml

查看 OpenEBS 命名空间下的 Pod,等待所有 Pod 启动完成。

$ kubectl get pods -n openebs

待 OpenEBS 命名空间下的 Pod 都启动完成后,将 OpenEBS 设置为默认存储。

$ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class": "true"}}}'

在 Amazon EKS Anywhere 集群上部署 KubeSphere v3.2.0

(1) 在 eks-a 管理节点/管理服务器上执行以下命令部署 KubeSphere v3.2.0

kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.0/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.0/cluster-configuration.yaml

(2)查看 KubeSphere 安装日志

$ kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

(3)当看到”Welcome to KubeSphere!”,说明安装完成。

#####################################################
###              Welcome to KubeSphere!           ###
#####################################################

本篇作者

张元涛

亚马逊云科技高级架构师。负责亚马逊云科技合作伙伴相关解决方案的建设以及合作伙伴生态合作。与合作伙伴一起,根据客户需求,分析其在技术架构层面所遇到的挑战和未来的方向,设计和落地基于亚马逊云科技平台和合作伙伴产品的架构方案。曾在知名外企以及国内领导企业任解决方案架构师。在云以及网络等领域有丰富的经验,对于公有云服务以及架构有深入的理解。

姚锐

KubeSphere 高级软件工程师,负责提供解决方案,开源项目 KubeEye 核心成员。

杨传胜

KubeSphere 布道师,KubeSphere 开源社区经理。