抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

OpenSource,使用 virtual-kubelet 运行 AWS Fargate

2019 年 10 月 24 日

OpenSource,使用 virtual-kubelet 运行 AWS Fargate

AWS Fargate 是一项全新的技术。有了它,您无需预配置、管理或扩展服务器即可运行容器。现在,Fargate 与 Amazon Elastic Container Service (ECS) 直接实现了集成。自从我们在 re:Invent 2017 大会上发布 Fargate 后,许多客户向我们反映,他们对使用 Fargate 运行 Kubernetes 非常感兴趣。为了帮助实现这一点,我们已经开始探究使用 virtual-kubelet 连接 Fargate 和 Kubernetes。virtual-kubelet 是一个开源的社区主导型项目,它允许使用任意计算资源支持 Kubernetes 工作程序节点。我们已经编写了一个新的 provider 插件,它支持使用 virtual-kubelet 创建 Fargate 任务,并已将该插件并入 virtual-kubelet 上游项目。这款新插件是只是在将 AWS Fargate 托管的数据层面扩展到 Kubernetes 方面迈出的探索性的一步,在它可以在所有使用案例中无缝运行之前,我们还有许多工作要做。现在,您不妨自行尝试以下几个简单的步骤:


步骤 1:使用 kops 创建一个单主节点的 Kubernetes 集群

我们将创建一个简单的测试环境来展示由 AWS Fargate 支持的 Kubernetes 工作负载。



第一步是安装一个 kops 集群。在安装 kops 时,我们使用具有两个 EC2 工作程序节点和一个 virtual-kubelet 实例的混合环境。virtual-kubelet 和 Fargate 上不支持的任意 Kubernetes 工作负载都可以照常在两个工作程序节点上轻松安排。按照以下说明使用此存储库:github.com/kubernetes/kops/blob/master/docs/aws.md。阅读关于使用 kops 在 AWS 上管理 Kubernetes 集群的博文,也可能会有所帮助。


Bash


$ export KUBERNETES_VERSION=https://storage.googleapis.com/kubernetes-release/release/v1.9.0/$ export AWS_AVAILABILITY_ZONES=us-east-1$ export CLUSTER_NAME=dnishi-kops1.k8s.local
$ kops create cluster —name $CLUSTER_NAME —zones $AWS_AVAILABILITY_ZONES —kubernetes-version $KUBERNETES_VERSION --yes
##Tested with Kubernetes v1.8.0+##Kops 1.6.2+ can be easily created as a gossip-based cluster and the cluster name has to end with k8s.local
复制代码


完成 kops 安装后,验证您的节点是否正在使用 kubectl 运行:


Bash


$ kubectl get nodesNAME                            STATUS    ROLES     AGE       VERSIONip-172-20-42-7.ec2.internal     Ready     master    5h        v1.9.0ip-172-20-44-230.ec2.internal   Ready     node      5h        v1.9.0ip-172-20-58-31.ec2.internal    Ready     node      5h        v1.9.0
复制代码


复制 kops 集群的 kubeconfig 文件并保存。在即将运行 virtual-kubelet 的 EC2 实例上需要使用此文件。


步骤 2:从上游存储库构建 virtual-kubelet

在构建之前,请先确保已安装 Go。首次使用的用户请按照以下方法设置变量:


Bash


$ export GOPATH=$HOME/go
复制代码


我们将 github.com/virtual-kubelet 用作基础路径。


Bash


$ mkdir -p $GOPATH/src/github.com/virtual-kubelet$ cd $GOPATH/src/github.com/virtual-kubelet
复制代码


如果您是首次克隆此存储库,请使用以下命令。如果您之前克隆过 virtual-kublet,请将以下命令中的“git clone”替换为“git pull”。


Bash


$ git clone https://github.com/virtual-kubelet/virtual-kubelet$ cd virtual-kubelet
复制代码


Bash


$ make build
复制代码


将所有依赖项都添加到存储库中,并与 virtual-kubelet 一起构建。二进制文件位于 virtual-kubelet/bin 目录中。


步骤 3:创建 Fargate 任务

如果您之前未使用过 AWS Fargate,最简单的入门方法就是体验 Fargate 的首次运行。这样会在您的 AWS 账户中对 Fargate 采用默认设置。它将创建一个默认的 Fargate 集群*、IAM 角色,以及一个具有 Internet 网关和默认安全组的默认 VPC。在第一次运行之后,对个别设置进行微调会比较容易。在 Fargate 上运行首个应用程序后,请访问 AWS ECS 控制台,仔细查看您的 Fargate 资源。记录示例应用程序的子网和安全组。*由于 Fargate 会将服务器抽离出来,因此该集群仅作为一个逻辑构造,对正在运行的容器进行分组。


步骤 4:创建一个 EC2 实例,以使用 Fargate provider 插件运行 virtual-kubelet

为 EC2 实例创建一个 IAM 角色。许多 AWS 服务要求您利用角色控制服务可以访问的内容。如果按 IAM 角色适用的特定目的进行分类,可分为 EC2 实例的服务角色(举例),或服务相关角色。运行 virtual-kubelet 的 EC2 实例需要对 ECS API 拥有完全访问权限。按照以下步骤创建适当的 IAM 角色:使用 AWS 控制台:


  1. 在 AWS 控制台上选择 us-east-1 区域中的 IAM 角色

  2. 创建角色,选择 AWS 服务,选择“EC2”作为将使用该角色的服务,然后单击“Next: Permissions”(下一步:权限)。

  3. 搜索并选择“AmazonECS_FullAccess”,然后单击“Next: Review”(下一步:查看)。

  4. 将角色命名为“VK-ECSFullAccess”,完成操作。您会在“IAM 角色”页面上看到该新角色。


使用 aws-cli:创建角色,然后附加信任策略,以支持 EC2 承担此角色:


Bash


$ aws iam create-role --role-name VK-ECSFullAccess --assume-role-policy-document file://VK-Role-Trust-Policy.json
复制代码


以下是 VK-Role-Trust-Policy.json


Json


$ cat VK-Role-Trust-Policy.json{  "Version": "2012-10-17",  "Statement": {    "Effect": "Allow",    "Principal": {"Service": "ec2.amazonaws.com"},    "Action": "sts:AssumeRole"  }}
复制代码


调用 attach-role-policy 命令,向此 IAM 角色授予权限,以访问您帐户中的资源:


Bash


$ aws iam attach-role-policy --role-name VK-ECSFullAccess --policy-arn arn:aws:iam::aws:policy/AmazonECS_FullAccess
复制代码


创建 EC2 所需的实例配置文件以包含该角色:


Bash


$ aws iam create-instance-profile --instance-profile-name EC2-AmazonECS_FullAccess
复制代码


最后,将角色添加到实例配置文件:


Bash


$ aws iam add-role-to-instance-profile --instance-profile-name EC2-AmazonECS_FullAccess --role-name VK-ECSFullAccess
复制代码


创建 EC2 实例并将新角色附加到其中:


  • 使用 EC2 控制台,在其他 kops 工作程序节点所在的同一 VPC 和子网中创建一个 EC2 节点,并在创建过程中将 VK-ECSFullAccess-Role 添加到 EC2 节点。

  • 或者,使用以下 aws-cli 命令:


在其他 kops 工作程序节点所在的同一子网和安全组中创建一个 ec2 Debian GNU/Linux 8 (Jessie) 实例:


Bash


$ aws ec2 run-instances --image-id ami-b14ba7a7 --count 1 --instance-type t2.micro --key-name ${MyKeyPair-xxxxx} --security-group-ids ${sg-xxxxxxxx} --subnet-id ${subnet-xxxxxxxx} --associate-public-ip-address
复制代码


调用 associate-iam-instance-profile 命令,将新创建的 IAM 角色 YourNewRole 的实例配置文件 YourNewRole-Instance-Profile 附加到 EC2 实例 YourInstanceId 中:


Bash


$ aws ec2 associate-iam-instance-profile --instance-id ${i-xxxxxxxxxxxxx} --iam-instance-profile Name=EC2-AmazonECS_FullAccess
复制代码


调用 describe-iam-instance-profile-association 命令,验证现在是否已将 IAM 角色附加到该实例:


Bash


$ aws ec2 describe-iam-instance-profile-associations
复制代码


将以下文件复制到新的 EC2 节点:


  • “virtual-kubelet”二进制文件

  • fargate.toml配置文件。将 fargate.toml 文件更新为步骤 3 中的子网值、安全组值。此外,如果您需要从外部访问映像,请更改 AssignPublicIPv4Address = true。

  • kops 集群中的“kubeconfig”文件。将此文件移动到 /root/.kube/config 路径


Bash


$ scp -r -i ${path-to-MyKeyPair-xxxxx} ${path-to-virtual-kubelet/providers/aws/fargate.toml} ~/.kube/config admin@ec2.xx-xxx-xxx-xx.compute-1.amazonaws.com$ ssh -i ${path-to-MyKeyPair-xxxxx} admin@ec2.xx-xxx-xxx-xx.compute-1.amazonaws.com$ sudo -i$ mv config /root/.kube/config
复制代码


运行 virtual-kubelet 并保持运行状态:


Bash


$ ./virtual-kubelet --provider aws --provider-config fargate.toml
复制代码


步骤 5:通过您的 kubectl 客户端确认集群已准备就绪

启动 virtual-kubelet 进程后,您会看到它在集群上注册为代理。


Bash


$ kubectl get nodesNAME                            STATUS    ROLES     AGE       VERSIONip-172-20-42-7.ec2.internal     Ready     master    1d        v1.9.0ip-172-20-44-230.ec2.internal   Ready     node      1d        v1.9.0ip-172-20-58-31.ec2.internal    Ready     node      1d        v1.9.0virtual-kubelet                 Ready     agent     14s       v1.8.3
复制代码


步骤 6:创建 Kubernetes 对象(pod、部署、副本集、服务)

使用文本编辑器部署带有三个副本的 nginx,以创建一个包含以下内容的 YAML 文件并运行它。要在 Fargate (virtual-kubelet) 上分配 pod,我们使用清单中的 [](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/) 约束,这是 PodSpec的一个字段。它指定了键值对的映射。此外,您还可以使用 Kubernetes taint 来模拟这一行为。nginx-deployment.yaml


YAML


apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginxspec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.7.9        ports:        - containerPort: 80        imagePullPolicy: IfNotPresent        resources:          requests:            memory: "256Mi"            cpu: "250m"          limits:            memory: "1000Mi"            cpu: "500m"      nodeSelector:        type: virtual-kubelet
复制代码


现在,部署您创建的 YAML 文件:


Bash


$ kubectl create -f nginx-deployment.yamldeployment.apps "nginx-deployment" created$ kubectl get deployments -o wideNAME              DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE  CONTAINERS  IMAGES       SELECTORnginx-deployment     3       3         3             0     12s  nginx       nginx:1.7.9 app=nginx
$ kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEnginx-deployment-6b488d64b-47hvk 1/1 Running 0 2m 10.0.1.23 virtual-kubeletnginx-deployment-6b488d64b-dj45s 1/1 Running 0 2m 10.0.1.161 virtual-kubeletnginx-deployment-6b488d64b-p6vsb 1/1 Running 0 2m 10.0.1.95 virtual-kubelet
复制代码


请注意,粗体的 nginx pod 元数据已经作为任务定义显示在下面的 Fargate 控制面板中。



让我们将 Fargate 上运行的 nginx-deployment 从 v1.7.9 更新为 v1.9.1:


Bash


$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps "nginx-deployment" image updated
$ kubectl rollout status deployment/nginx-deploymentWaiting for rollout to finish: 1 out of 3 new replicas have been updated...Waiting for rollout to finish: 1 out of 3 new replicas have been updated...Waiting for rollout to finish: 2 out of 3 new replicas have been updated...Waiting for rollout to finish: 2 out of 3 new replicas have been updated...Waiting for rollout to finish: 2 out of 3 new replicas have been updated...Waiting for rollout to finish: 1 old replicas are pending termination...Waiting for rollout to finish: 1 old replicas are pending termination...deployment "nginx-deployment" successfully rolled out
复制代码


Fargate 任务同样会一次更新一项任务。如果您单击一项任务,您会看到映像版本已经从 v1.7.9 更新为 v1.9.1。几秒钟之内,每项任务都会更新到 v1.9.1,而且每次会对一项任务重复一次该进程。





使用单个命令部署 20 个 pod。使用 nginx-deployment-new.yaml。如 Fargate 控制面板所示,这些任务可以在几秒钟内完成:


Bash


$ kubectl create -f nginx-deployment-new.yamldeployment.apps "nginx-deployment" created
$ kubectl get deployments -o wideNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORnginx-deployment 20 20 20 0 14s nginx nginx:1.7.9 app=nginx
复制代码





总结观点

现在,virtual-kubelet provider 插件无法支持所有 Kubernetes 使用案例和应用程序模式。我们希望可以在计算方面为 Kubernetes 用户提供新的途径,而现在我们已经迈出了第一步。我们很高兴能与社区合作,共同讨论如何最好地实现 Kubernetes 的无节点设计概念。我们希望您能加入我们,提出建议、贡献代码,并使用您的应用程序帮助我们测试该插件。您可以:



AWS 将参加 2018 年 5 月 2 日至 4 日在丹麦哥本哈根举行的 KubeCon EU 大会在此次大会上,我们将展示这一插件。此外,我们还会展示即将推出的托管型 Kubernetes 服务 Amazon Elastic Container Service for Kubernetes (Amazon EKS)。




注意:本博文是专门针对中级用户编写的。需掌握 Linux、Go、Docker 和 K8s 相关知识。此外,virtual-kubelet 目前还不是稳定的代码库,如果出现崩溃,属于正常现象。希望您能够为我们提供帮助,使之更稳定。




Nishi Davidson


Nishi Davidson 在云计算基础架构和软件应用程序领域有着长达 15 年的工作经验,在东南亚和美国市场负责过相关领域的工程、产品管理和战略工作。目前,她在 AWS 主持 Kubernetes 社区的开源工程设计。之前,她曾负责 SAP 的私有云、内部 BU 的 Kubernetes 托管服务工程等工作。在 HP、TCS、Juniper Networks、NetApp 和 DSSD (EMC) 工作期间,Nishi 负责领导产品/现场工程团队,向市场推出了多款云产品/解决方案。Nishi 拥有麻省理工学院斯隆商学院的工商管理硕士学位和安那大学 Guindy 工程学院的电气与电子工程学士学位。


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/aws-fargate-virtual-kubelet/


2019 年 10 月 24 日 08:00320

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

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

给hugo博客添加评论功能

LanLiang

Hugo 静态博客 utterances

日记 2021年2月17日(周三)

Changing Lin

2月春节不断更

第四章作业-编写一个用例文档

秦挺

今日笔记

Nydia

ElasticSearch.03 - 基本原理

insight

elasticsearch 2月春节不断更

开发利器——C语言必备实用第三方库

码哥比特

c c++ Linux 后端 框架

微信红包封面,2021年为啥突然火了?

架构精进之路

春节 微信红包封面 商业洞察

写公号大半年,看看我都收获了些啥

架构精进之路

技术 总结 微信公众号 成长笔记

13. 如果自己写的 Python 程序出错了,怎么办?

梦想橡皮擦

python 爬虫 2月春节不断更

C语言第三方库Melon开箱即用之词法分析器使用

码哥比特

c c++ Linux 后端 框架

2.react心智模型(来来来,让大脑有react思维吧)

全栈潇晨

React React Hooks react源码

深度讲解背包问题:面试中每五道动态规划就有一道是背包模型 ...

宫水三叶的刷题日记

深度思考 LeetCode 动态规划 数据结构与算法 面试数据结构与算法

消息队列Kafka:入门基础

正向成长

kafka

【LeetCode】数组拆分Java题解

HQ数字卡

算法 LeetCode 2月春节不断更

gradle中的增量构建

程序那些事

maven Gradle 程序那些事 构建工具

【活动回顾】4步2小时,搭建爆火的语音聊天室

ZEGO即构

1480. 一维数组的动态和

小马哥

算法 七日更

这是我的第一次JavaScript初级技巧

魔王哪吒

JavaScript 学习 程序员 前端 2月春节不断更

程序员成长第五篇:如何选择城市工作?

石云升

程序员成长 2月春节不断更 选择城市

EternalWallet为您提供快速、便捷、低价的国际汇款服务

Geek_c610c0

诊所数字化:诊所老板为什么拒绝预约制?

boshi

数字化转型 医院 七日更

数据量大读写缓慢如何优化(5)【读缓存】

我爱娃哈哈😍

redis 缓存 架构设计实战 缓存设计

第一次异地过年有感

石君

思考 情感

揭秘登上2021春晚舞台的黑科技-XR技术

架构精进之路

黑科技 vr 春晚 XR MR

IDEA插件:快速删除Java代码中的注释

xiaoxi666

代码注释 Java 8 JavaParser

翻译:《实用的Python编程》01_05_Lists

codists

人工智能 后端 python 爬虫 列表 数据结构与算法

1.开篇(听说你还在艰难的啃react源码)

全栈潇晨

React React Hooks react源码

C语言实用第三方库Melon开箱即用之多线程模型

码哥比特

c c++ Linux 后端 框架

春节快过腻了?不妨关心下太空探索

脑极体

【STM32】PWM 输出 (标准库)

AXYZdong

硬件 stm32 2月春节不断更

3.Fiber(我是在内存中的dom)

全栈潇晨

React React Hooks react源码

Study Go: From Zero to Hero

Study Go: From Zero to Hero

OpenSource,使用 virtual-kubelet 运行 AWS Fargate-InfoQ