HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

在 EKS 上使用 Kubernetes Service Catalog 和 AWS Service Broker

  • 2019-10-11
  • 本文字数:5843 字

    阅读完需:约 19 分钟

在 EKS 上使用 Kubernetes Service Catalog 和 AWS Service Broker

在上一篇博文中,我们讨论了在 Kubernetes 上使用 AWS Service Broker。从那以后,发生了很多变化:EKS 现已推出,而 Service Broker 已显著演变,因此我们认为重新审视该主题并关注 EKS 会是不错的选择。


如果您是 Kubernetes 用户,可能已经发现,正如我们之前所做的,管理不同服务(如数据库)的生命周期和凭证会是一件富有挑战性的事情。除了必须解决如何为您的应用程序提供所需凭证的访问权限外,这项工作还经常涉及链接多个不同的工具链,从而增加了低水平重复的繁重工作。这可能导致最佳实践(例如难以执行的最低权限模型)通常被丢给各个开发团队来实施。在本篇博文中,我们将讨论一些有助于应对这些挑战的模式。我们将介绍 Kubernetes Service Catalog,这是一种扩展 API,可通过使用实施 Open Service Broker API 规范的服务代理,使 Kubernetes 集群中运行的应用程序能够轻松使用外部管理软件产品。AWS Service Broker 是一个开源项目(与 Kubernetes Service Catalog 结合使用),提供了一个 AWS 服务目录,可使用熟悉的 Kubernetes API 和工具管理该目录,并将其连接到您的 Kubernetes 应用程序。我们还将通过预置一个 S3 存储桶并将其连接到您的应用程序,了解在实践中使用 AWS Service Broker 的情况。

核心服务经纪人概念

首先,我们需要梳理一下本文中将使用的一些关键概念。有关更多详细信息,请查看 Open Service Broker API 规范和 Kubernetes Service Catalog 设计文档。


ClusterServiceClass – 服务目录生成的 Kubernetes 资源。Service Catalog 获取每个已安装代理的目录,并将新目录条目并入 Kubernetes 中的 ClusterServiceClasses。对于 AWS 代理,这些类代表 AWS 服务,如 S3、SQS 等。


ClusterServicePlan – 每个 ClusterServiceClass 包含一个或多个计划。计划代表服务的配置;在 AWS 代理中,许多服务都有针对生产和开发用例的固定计划,以及允许用户配置服务的所有可用选项的自定义计划。


ServiceInstance – ClusterServicePlan 的一个实例。使用 AWS 代理,这将代表调用预置 API 时创建的 AWS 服务的实例。


预置 – 预置 API 是使用 kubectl、api 或 svcat(Kubernetes Service Catalog CLI 工具)创建新的 ServiceInstance 时调用的 API。对于 AWS Service Broker,预置调用根据计划接受各种参数,然后使用这些参数创建请求的 AWS 服务。


Bind – Binding 是通过某个给定 ServiceInstance 的代理请求凭证和元数据的 API 调用。服务目录随后创建一个 Kubernetes 密钥,并将凭证存储在其中。应用程序随后可以映射密钥以获取对凭证的访问权限。例如,对于 Amazon RDS 数据库,bind 调用返回端点 url、用户名和密码。对于在运行时需要 IAM 的服务,将创建最低权限策略并将其挂载到 IAM 用户/角色。

先决条件

  • 至少配置了一个节点的 EKS 集群;建议将三个或更多节点用于 HA/生产用途。有关详细信息,请参阅 EKS 入门指南。本指南中的步骤适用于任何 Kubernetes 集群(v1.10 及更高版本),但您的具体情况可能会有所不同。

  • 安装/配置 kubectl 和 aws-iam-authenticator 以连接到上述集群。有关详细信息,请参阅参考。

  • 使用 AWS 凭证安装和配置 awscli。有关详细信息,请参阅 AWS CLI 文档。

  • jq 用于检查示例应用程序的输出;它可以从您的操作系统的包管理器获得


在本篇文章中,我们选择尽可能使用本机 Kubernetes 工具,以着重介绍服务目录类型的样子以及如何在本地使用它们。如果您经常通过 cli 与目录进行交互,则可能需要查看 svcat cli 工具,该工具简化了对服务目录类型的描述和管理。有关更多详细信息,请参阅 GitHub 上的服务目录文档

安装服务目录

我们将使用 Helm 来处理所需组件的安装。


curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.shchmod 700 get_helm.sh./get_helm.shkubectl create serviceaccount tiller --namespace kube-systemkubectl create clusterrolebinding tiller \--clusterrole=cluster-admin \--serviceaccount=kube-system:tiller# Install helm and tiller into the clusterhelm init --service-account tiller# Wait until tiller is ready before moving onuntil kubectl get pods -n kube-system -l name=tiller | grep 1/1; do sleep 1; done
复制代码


完成后,您应在 kube-system 名称空间中看到正在运行的 tiller pod:



注意:对于面向公众的集群或生产集群,不建议使用此类型的 Tiller 安装。如需了解有关在生产集群中安装 Tiller 的更多信息,请参阅保护 Helm 安装安全。


现在我们已经设置了 Helm 和 Tiller,我们可以继续使用 Helm 来安装 Kubernetes Service Catalog。


helm repo add svc-cat https://svc-catalog-charts.storage.googleapis.comhelm install svc-cat/catalog \    --name catalog --namespace catalog --waitsvc-cat animated gif.
复制代码



安装完成后,我们应该看到目录命名空间中运行的 api-server 和 controller-manager pod:


安装 AWS Service Broker

第一步是设置先决条件。此操作可使用创建所需 IAM 用户和 DynamoDB 表的 CloudFormation 模板轻松完成。以下代码块使用 AWS CLI 启动模板并收集所需的输出。确保将 REGION 变量设置为您希望拥有代理预置资源的 AWS 区域。


REGION=us-west-2# Download the templatewget https://raw.githubusercontent.com/awslabs/aws-servicebroker/master/setup/prerequisites.yaml# Create stackSTACK_ID=$(aws cloudformation create-stack \             --capabilities CAPABILITY_IAM \             --template-body file://prerequisites.yaml \             --stack-name  aws-service-broker-prerequisites \             --output text --query "StackId" \             --region ${REGION})# Wait for stack to completeuntil \    ST=$(aws cloudformation describe-stacks \        --region ${REGION} \        --stack-name ${STACK_ID} \        --query "Stacks[0].StackStatus" \        --output text); \        echo $ST; echo $ST | grep "CREATE_COMPLETE"    do sleep 5done# Get the username from the stack outputsUSERNAME=$(aws cloudformation describe-stacks \             --region ${REGION} \             --stack-name ${STACK_ID} \             --query "Stacks[0].Outputs[0].OutputValue" \             --output text)# Create IAM access key.记下该输出,我们在设置代理时将会用到aws iam create-access-key \    --user-name ${USERNAME} \    --output json \    --query 'AccessKey.{KEY_ID:AccessKeyId,SECRET_ACCESS_KEY:SecretAccessKey}'
复制代码


现在我们已准备好安装代理,首先将存储库添加到 Helm:


helm repo add aws-sb https://awsservicebroker.s3.amazonaws.com/charts
复制代码



代理有多个可配置属性,如需将其列出,请运行:


helm inspect aws-sb/aws-servicebroker --version 1.0.0-beta.3
复制代码



在本篇博文中,我们将介绍最小安装。有关高级安装选项的详细信息,请参阅 AWS Service Broker 文档。使用 aws create-access-key 命令输出中保存的输出替换下面的<ACCESS_KEY_ID> 和 <SECRET_ACCESS_KEY>:


helm install aws-sb/aws-servicebroker \    --wait \    --name aws-servicebroker \    --namespace aws-sb \    --version 1.0.0-beta.3 \    --set aws.region=${REGION} \    --set aws.accesskeyid=<ACCESS_KEY_ID> \    --set aws.secretkey=<SECRET_ACCESS_KEY>output of helm install aws-sb/aws-servicebroker.
复制代码



注意:如果在 helm cli 上设置 aws.targetaccountid,请勿使用 —set,使用 —set-string,更多信息请参阅相关 Helm 问题


现在验证代理 pod 正在运行:


helm ls --namespace aws-sbkubectl get ClusterServiceBrokers
复制代码




现在您可以列出可用的服务:


kubectl get ClusterServiceClasses \ -o=custom-columns=NAME:.spec.externalName,DESCRIPTION:.spec.descriptionoutput of kubectl get ClusterServiceClasses.
复制代码



如果您遇到任何问题,可以通过查看 Service Broker 的日志进行故障排除:


kubectl logs $(kubectl get pods -n aws-sb -o name) -n aws-sb
复制代码

预置和绑定到示例应用程序

让我们通过创建示例应用程序,预置 S3 存储桶,并将存储桶绑定到我们的应用程序来体验一下代理。


首先创建示例应用程序;我们提供了一个简单的应用程序来验证与 S3 的连接是否正常:


cat <<EOF > sample.yaml---apiVersion: v1kind: Namespacemetadata:  name: s3-demo---apiVersion: apps/v1kind: Deploymentmetadata:  name: s3-demo  namespace: s3-demospec:  selector:    matchLabels:      app: s3-demo  replicas: 1  template:    metadata:      labels:        app: s3-demo    spec:      containers:      - name: s3-demo        image: awsservicebroker/s3-demo:latest        ports:        - containerPort: 8080EOFkubectl apply -f sample.yaml# Wait for deployment to completeuntil kubectl get pods -n s3-demo | grep 1/1; do sleep 1; done
复制代码


现在我们可以在 curl 应用程序时检查返回的内容。请注意,为简洁起见,我们未设置 Kubernetes Service 或 Ingress,因此我们将使用 kubectl exec 运行 curl:


kubectl exec \    $(kubectl get pods -o name --namespace s3-demo | awk -F '/' '{print $2}') \    --namespace s3-demo -- \    curl -s http://127.0.0.1:8080 | jq .output of curl using kubectl exec.
复制代码



以上输出内容显示我们有一些缺少的环境变量。让我们通过创建我们的 S3 服务并将其绑定到应用程序来解决此问题


cat <<EOF > s3-instance.yaml---apiVersion: servicecatalog.k8s.io/v1beta1kind: ServiceInstancemetadata:  name: s3-bucket  namespace: s3-demospec:  clusterServiceClassExternalName: s3  clusterServicePlanExternalName: productionEOFkubectl apply -f s3-instance.yaml
复制代码


这将开始预置过程。您应该在帐户中看到一个正在创建的 CloudFormation 堆栈:


aws cloudformation list-stacks \--region ${REGION} \--query 'StackSummaries[?starts_with(StackName,`aws-service-broker-s3-`)]'output of aws cloudformation list-stacks.
复制代码



堆栈完成后不久,即可绑定 ServiceClass。您可以通过描述 ServiceInstance 并检查 .status.conditions[0].message 来检查状态


kubectl get ServiceInstance/s3-bucket -n s3-demo -o yaml


现在我们已经创建了 ServiceInstance,可以将其绑定,这样我们的示例应用程序就可以从 kubernetes 环境本身访问这些凭证。创建绑定资源需要进行以下操作:


cat <<EOF > s3-binding.yaml---apiVersion: servicecatalog.k8s.io/v1beta1kind: ServiceBindingmetadata:  name: s3-binding  namespace: s3-demospec:  instanceRef:    name: s3-bucketEOFkubectl apply -f s3-binding.yaml
复制代码


现在我们已创建一个 ServiceBinding 对象,可以验证状态是否为“就绪”:


kubectl describe ServiceBinding s3-binding -n s3-demooutput of kubectl describe ServiceBinding s3-binding -n s3-demo.
复制代码


绑定操作会创建一个 Kubernetes 密钥,其中包含访问 “s3-demo” 命名空间中的 S3 存储桶所需的凭证。如需验证是否已创建密钥,请运行以下命令:


kubectl describe secrets/s3-binding -n s3-demooutput of kubectl describe secrets/s3-binding -n s3-demo.
复制代码


现在剩下要做的就是将密钥挂载到我们的 pod:


cat <<EOF >> sample.yaml        env:        - name: S3_AWS_ACCESS_KEY_ID          valueFrom: { secretKeyRef: { name: s3-binding, key: S3_AWS_ACCESS_KEY_ID  } }        - name: S3_AWS_SECRET_ACCESS_KEY          valueFrom: { secretKeyRef: { name: s3-binding, key: S3_AWS_SECRET_ACCESS_KEY } }        - name: S3_REGION          valueFrom: { secretKeyRef: { name: s3-binding, key: S3_REGION } }        - name: BUCKET_ARN          valueFrom: { secretKeyRef: { name: s3-binding, key: BUCKET_ARN } }        - name: BUCKET_NAME          valueFrom: { secretKeyRef: { name: s3-binding, key: BUCKET_NAME } }        - name: LOGGING_BUCKET_NAME          valueFrom: { secretKeyRef: { name: s3-binding, key: LOGGING_BUCKET_NAME } }EOFkubectl apply -f sample.yaml# wait for deployment to completeuntil kubectl get pods -n s3-demo | grep -c s3-demo | grep 1; do sleep 1; done
复制代码


部署完成后,我们应该看到应用程序现在能够访问存储桶:


kubectl exec \    $(kubectl get pods -o name --namespace s3-demo | awk -F '/' '{print $2}') \    --namespace s3-demo -- \    curl -s http://127.0.0.1:8080 | jq .
复制代码


清理


让我们删除示例应用程序、绑定和实例。(请注意,删除调用会导致 CloudFormation 堆栈被删除。)


kubectl delete -f s3-binding.yaml


kubectl delete -f s3-instance.yaml


kubectl delete -f sample.yaml


您可以进行更多的操作,但如果您还希望从集群中删除代理和目录,则可以运行 Helm 来执行此操作:


helm delete --purge aws-servicebroker


helm delete --purge catalog

Remove cloudformation stack containing prerequisites

aws cloudformation delete-stack


–stack-name STACK_ID | awk -F ‘/’ ‘{print 2’}) --region=REGION

小结

在本篇博文中,我们着重介绍了如何使用 Kubernetes Service Catalog 和 AWS Service Broker 的强大功能来管理您的 AWS 服务,提供代码和配置的分离,以及提供最低权限 IAM 等固定最佳实践。这只是代理所提供功能的一小部分! 如需了解更多高级方案(如多帐户预置)、使用 CloudFormation 模板构建自定义目录以及使用 bind 挂载到 pod 级 IAM 角色的信息,请参阅 AWS Service Broker 文档。如果您有兴趣了解将 AWS 服务与 Kubernetes 集成的其他方法,我们建议您另外查看 Chris Hein 在 AWS Service Operator 上发布的帖子。


作者介绍:


Jay McConnell


Jay McConnell 是 Amazon 合作伙伴网络的一名解决方案架构师,他专门为 AWS 上的合作伙伴产品构建最佳实践部署,并利用业余时间维护尽可能多的开源项目。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/kubernetes-service-catalog-aws-service-broker-on-eks/


2019-10-11 08:00779
用户头像

发布了 1848 篇内容, 共 114.0 次阅读, 收获喜欢 78 次。

关注

评论

发布
暂无评论
发现更多内容

lilishop开源版本window一键启动

小黄鱼

Spring Boot 开源商城 bat启动 lilishop

Solana链狙击机器人:交易者的新宠

开发丨飞机丨 @aivenli

网心科技入选2023中国ToB行业影响力价值榜

网心科技

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

不在线第一只蜗牛

Kubernetes 容器化 集群

深圳站回顾|隐语最新功能、隐私计算硬核技术、数据要素实践干货全记录(附演讲视频)

隐语SecretFlow

拓展AI边界:去中心化人工智能的应用场景和主要项目盘点

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

AI+软件工程:10倍提效!用ChatGPT编写系统功能文档

快乐非自愿限量之名

AI 软件开发

云主机有什么用?看看它的多功能用途

一只扑棱蛾子

云主机

一文熟悉PolarDB-PG 分区表核心特性

阿里云数据库开源

数据库 阿里云 polarDB PolarDB-PG

英特尔携手开发者,以全新OpenVINO™ 2024.0版本引领AI加速技术革命

E科讯

论低代码如何适配小程序开发

快乐非自愿限量之名

小程序 低代码

Selenium报错元素不可交互,该如何解决?

霍格沃兹测试开发学社

商城小程序项目实现监控的可观测性最佳实践

观测云

小程序

时序数据库IoTDB:功能详解与行业应用

Apache IoTDB

宁德时代与特斯拉合作;钟睒睒连续四次中国首富丨 RTE 开发者日报 Vol.171

声网

智达方通全面预算管理系统,为企业带来更可靠的交付

智达方通

全面预算管理 全面预算管理系统

从数据存储的演迁,看芯赛云分布式存储应用

科技热闻

C#代码混淆器 ipaguard 的优势与使用

雪奈椰子

利用Python和数据获取技术实现智能旅游情报系统

阿Q说代码

Python 后端 数据获取

深入解析以太坊Dencun升级:提升网络性能与安全的关键举措

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

低代码与供应链行业的融合:开启数字化新时代

EquatorCoco

软件开发 低代码 供应链 项目开发

C#调用C++ (使用C++/CLI)

EquatorCoco

c++ C# 开发语言

从静态到动态化,Python数据可视化中的Matplotlib和Seaborn

快乐非自愿限量之名

Python 数据可视化 信息可视化

2024南京国际智能机器人展览会

AIOTE智博会

机器人展 智能机器人展

Python 和 Go 的基础了解

Liam

Python Go 编程 程序员 后端

机器学习:智能时代的核心引擎

不在线第一只蜗牛

人工智能 机器学习

Netflix微服务经验教训

俞凡

微服务 最佳实践 netflix 大厂实践

将提交记录生成二维码,扫码即可查看填写内容

草料二维码

二维码 草料二维码

ETL中RESTful API 组件的用法

RestCloud

ETL 数据集成 RESTful API

数据要素×工业制造:光纤通信企业携手奇点云,攻克“国产替代”迁移难关

奇点云

奇点云 数据要素 工业制造 光纤通信

一口气搞懂分库分表 12 种分片算法,大厂都在用

程序员小富

Java 分库分表 spring-boot

在 EKS 上使用 Kubernetes Service Catalog 和 AWS Service Broker_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章