
Amazon EKS 简化了 Kubernetes 集群的构建与维护,而 Pachyderm 进一步简化了分析类工作流的运行与管理,两者结合,无疑将使得在 Kubernetes 平台上部署企业级分析平台更为轻松。本文通过一个 GATK 基因分析的示例来演示搭建和使用的过程,为您在 Amazon EKS 上采用该解决方案提供参考。
1、基本介绍
Amazon Elastic Kubernetes Service(Amazon EKS)是一项安全、可靠、可扩展的完全托管的Kubernetes服务,近期在AWS中国区域落地以来获得了用户的广泛关注。Amazon EKS可让您在 AWS 上轻松运行 Kubernetes,无需您自行支持或维护 Kubernetes 控制层面,EKS可跨多个AWS可用区来提供高可用特性,并自动将最新的安全补丁应用到您的集群控制平面,因此您可以更专注于应用程序的代码和功能。EKS 可运行上游 Kubernetes,且经认证与 Kubernetes 一致,因此您可以利用社区中开源工具的所有优势。您也可以轻松地将任何标准 Kubernetes 应用程序迁移到 EKS,而无需重构您的代码。
Pachyderm是基于容器和Kubernetes技术的新兴框架组件,用于高效并行分析处理的调度和管理,支持自动扩展以处理大批量作业,支持带GPU的K8S集群,具备企业级应用所需的安全、备份、升级等管理功能。Pachyderm在基因分析、人工智能、机器学习、大数据分析均已有典型的应用案例。目前发布版本是v1.10.0,并提供免费的社区版本。
Amazon EKS简化了Kubernetes集群的构建与维护,而 Pachyderm进一步简化了分析类工作流的运行与管理,两者结合,无疑将使得在Kubernetes平台上部署企业级分析平台更为轻松。本文通过一个GATK基因分析的示例来演示搭建和使用的过程,为您在Amazon EKS上采用该解决方案提供参考。
2、部署过程
本解决方案的架构如下图所示:

在EKS创建集群后,部署Pachyderm框架时会创建负责工作流管理的pachd、负责提供监视看板数据的dash以及用于持久存储的etcd这几个Pods。通过EC2任务终端上安装的pachctl与pachd进行交互可以创建工作流并提交输入数据,工作流建立时会创建相应pipeline的Pods,pipeline加载ECR中的镜像来执行处理任务,作业相关数据存入S3存储。
2.1 工具准备
通过AWS中国区帐号,在宁夏区域创建一个Amazon Linux 2系统的EC2实例用作管理终端。在AWS的 IAM 控制台上创建一个用于EKS操作的权限,在Roles页面下点击 “创建角色”,”使用案例”中选择 “EC2″搜索并添加AdministratorAccess的策略,角色命名为myEKSadmin。并将该角色与EC2管理终端实例进行绑定。在控制台EC2实例列表中选中管理终端实例,右上角操作中的“实例设置”下点击“附加/替换IAM角色”指定角色为myEKSadmin,如下图所示。

以SSH方式登录EC2管理终端,执行以下命令进行工具安装:
#安装基础工具
sudo yum -y install jq gettext bash-completion
aws configure set default.region cn-northwest-1
#创建一个用于存储pachyderm数据的S3存储桶
aws s3 mb s3://<your-data-bucket-name>
#安装基础工具
sudo curl --silent --location -o /usr/local/bin/kubectl https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/amazon-eks-1.15.10/2020-02-22/bin/linux/amd64/kubectl
sudo chmod +x /usr/local/bin/kubectl
kubectl completion bash >> ~/.bash_completion
. /etc/profile.d/bash_completion.sh
. ~/.bash_completion
#安装eksctl 工具
curl --silent --location "https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp
sudo mv -v /tmp/eksctl /usr/local/bin
eksctl completion bash >> ~/.bash_completion
. /etc/profile.d/bash_completion.sh
. ~/.bash_completion
#安装aws-iam-authenticator工具
sudo curl --silent --location -o /usr/local/bin/aws-iam-authenticator https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/amazon-eks-1.15.10/2020-02-22/bin/linux/amd64/aws-iam-authenticator
sudo chmod +x /usr/local/bin/aws-iam-authenticator
#安装pachctl工具
curl -o /tmp/pachctl.tar.gz -L https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/pachctl.tar.gz
tar -xvf /tmp/pachctl.tar.gz -C /tmp
sudo cp /tmp/pachctl_1.10.0_linux_amd64/pachctl /usr/local/bin
#验证工具版本
kubectl version
eksctl version
aws-iam-authenticator version
pachctl version --client-only
2.2 创建EKS集群
通过以下命令验证下IAM角色,如显示“IAM role valid”即验证通过。
aws sts get-caller-identity --query Arn | grep myEKSadmin -q && echo "IAM role valid" || echo "IAM role NOT valid"
配置SSH密钥。执行ssh-keygen命令,并在第一个提示信息输入“/home/ec2-user/.ssh/pachnodekey”,随后两次提示均回车。如果EKS集群需要进一步调试可用该pachnodekey以SSH方式登录节点。
ssh-keygen
aws ec2 import-key-pair --key-name "pachnodekey" --public-key-material file://~/.ssh/pachnodekey.pub
以命令行方式创建EKS集群,在十多分钟后提示创建完成,可用“kubectl get nodes”命令查看节点信息。
eksctl create cluster \
--name pachyderm-on-eks \
--region cn-northwest-1 \
--nodegroup-name standard-workers \
--node-type c5.xlarge \
--nodes 2 \
--nodes-min 1 \
--nodes-max 3 \
--ssh-access \
--ssh-public-key ~/.ssh/pachnodekey.pub \
--managed
2.3 部署Pachyderm
Pachyderm要求节点组需要有S3操作的权限,从AWS控制台中的“pachyderm-on-eks“集群的节点组详情信息里找到节点IAM名称:

点击链接,在该IAM角色的权限中添加AmazonS3FullAccess策略:

部署Pachyderm框架(首行your-data-bucket-name替换成之前创建S3桶的名称):
BUCKET_NAME=<your-data-bucket-name>
echo "export BUCKET_NAME=${BUCKET_NAME}" | tee -a ~/.bash_profile
STORAGE_SIZE=10
echo "export STORAGE_SIZE=${STORAGE_SIZE}" | tee -a ~/.bash_profile
AWS_REGION=cn-northwest-1
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
IAM_ROLE=myEKSadmin
echo "export IAM_ROLE=${IAM_ROLE}" | tee -a ~/.bash_profile
pachctl deploy amazon ${BUCKET_NAME} ${AWS_REGION} ${STORAGE_SIZE} --dynamic-etcd-nodes=1 --iam-role ${IAM_ROLE}
部署完成后,可用“kubectl get pod”命令查看到运行的pod信息如下:

3、GATK基因分析示例
本示例以标准数据集的NA12878-WGS样本为输入,参考比对信息为b37人类基因参考,调用HaplotypeCaller和GenotypeGVCFs两步处理,分析流程示意图如下:

执行以下命令进行数据准备,并按照Pachyderm的流程来创建pipeline及提交数据
#下载示例数据及配置文件
mkdir -p ~/gatkexample
cd ~/gatkexample
wget https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/GATK_Germline.zip
unzip GATK_Germline.zip
wget https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/likelihoods.json
wget https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/joint_call.json
#创建比对库并上传比对数据
pachctl create repo reference
cd ~/gatkexample/data/ref
pachctl put file reference@master -r -f .
pachctl list file reference@master
#创建样本库并提交示例中的单个样本数据
pachctl create repo samples
cd ~/gatkexample/data/bams/
pachctl start commit samples@master
for f in $(ls mother.*); do pachctl put file samples@master:mother/$f -f $f; done
pachctl finish commit samples@master
pachctl list file samples@master:mother
#创建变体识别(Variant Calling)流程,即触发Pachyderm作业
pachctl create pipeline -f ~/gatkexample/likelihoods.json
pachctl list job
pachctl list file likelihoods@master
#创建联合基因定型( Joint Genotype )流程
pachctl create pipeline -f ~/gatkexample/joint_call.json
pachctl list job
pachctl list file joint_call@master
以上是一个样本的分析处理,可增加更多测试样本进行分析,执行如下命令。
cd ~/gatkexample/data/bams/
pachctl start commit samples@master
for f in $(ls father.*); do pachctl put file samples@master:father/$f -f $f; done
pachctl finish commit samples@master
pachctl start commit samples@master
for f in $(ls son.*); do pachctl put file samples@master:son/$f -f $f; done
pachctl finish commit samples@master
pachctl list file samples@master
列出的结果文件结构如下:
NAME TYPE SIZE
father dir 9.662MiB
mother dir 23.79MiB
son dir 9.58MiB
样本上传后触发对应作业,通过“pachctl list job”命令查看作业完成信息如下所示:

在IGV工具里可以查看mother.bam文件和VCF的变体信息如下图所示:

在本地新打开一个命令行窗口,通过以下命令登入EC2管理终端:
ssh -L 30080:localhost:30080 -L 30081:localhost:30081 -A ec2-user@<yourEC2publicIP>
登入后执行“pachctl port-forward”命令即可在本地浏览器中通过http://localhost:30080/ 查看Pachyderm的UI界面,查看到的作业信息如下图所示。

实验完成后,如不再需要使用资源,记得删除EKS集群、S3存储桶、清除对应IAM角色权限,并终止EC2管理终端的实例,步骤参考如下(删除EKS集群前节点组添加的S3权限先予以手动删除)。
pachctl undeploy -a
kubectl get svc --all-namespaces
kubectl delete svc <service-name with EXTERNAL-IP>
eksctl delete cluster --name pachyderm-on-eks
aws s3 rb s3://<your-data-bucket-name>
aws iam delete-role --role-name myEKSadmin
aws ec2 terminate-instances --instance-ids <your-instance-id>
4、参考资源链接
Github参考及更新信息链接:https://github.com/iwillsky/pachydermcn/
Amazon EKS:https://aws.amazon.com/cn/eks/
Amazon EKS WorkShop:https://eksworkshop.com/
Pachyderm官网: https://www.pachyderm.com
Pachyderm Github资源: https://github.com/pachyderm/pachyderm
本篇作者