写点什么

OpenSource 为 Kubernetes 提供云服务支持

  • 2019-10-29
  • 本文字数:4408 字

    阅读完需:约 14 分钟

OpenSource 为Kubernetes提供云服务支持

2017 年 9 月,Mesosphere 宣布其畅销的 DC/OS 集群管理解决方案将重新支持 Kubernetes。Beta 发布版支持创建集群,然后您可以使用 SSH 隧道访问节点并部署标准的 Kubernetes primitive 数据。从一月初开始正式增加支持 --cloud-provider 旗标,从此您可以使用 Classic Load Balancer (ELB) 或 Elastic Block Store (EBS) 等标准的 AWS 组件。在本博文中,我们将首先创建一个 DC/OS 集群,然后在它上面安装 Beta 版 Kubernetes,最后部署使用 type: LoadBalancer 的服务,以展示如何将 ELB 入站控制器添加到在 DC/OS Kubernetes 集群上运行的应用程序中。本教程将需要大约一小时的时间。


Michael Ruiz 以前的一篇博文中,他解释了 Mesosphere 的 DC/OS 是什么以及它对于在 AWS 上运行 DC/OS 的基本影响。简而言之:DC/OS 是使用 Apache Mesos 框架搭建的,其目的是方便对大小型集群的管理。 Apache Mesos 的部署产品化后,Mesosphere 使用一种名为 Universe 的按钮式目录来部署“mesos 框架”,十分方便。在 Universe 中,从 GitlabJenkins 到 Mesosphere 最新支持的 Beta 版 Kubernetes,应有尽有。使用 Kubernetes 运行 Mesosphere DC/OS,可以将 Cassandra 和 Spark 等生产化的大数据服务与 Kubernetes 管理的融资工作负载并置,直接集成到 Mesos 内部 DNS 提供商。

入门

如要开始使用,我们需要首先创建一个 Mesosphere DC/OS 集群。这可以使用开放源分配或商业企业版完成;本博文将使用开放源分配方式。首先,我们将转到 DC/OS CloudFormation 安装页面,选择区域以及 Single Master (单主服务器) 或 HA Master (高可用主服务器) 配置;为方便演示,我在这里选择 Single Master (单主服务器) 配置。选定集群配置后,我们将进入 AWS CloudFormation 控制台,在那里可以配置堆栈。



输入堆栈细节后,将会显示 Options (选项) 屏幕。在此页面,您需要为 KubernetesCluster=DemoCluster添加一个标签。 该标签由 Kubernetes Cloud Controller Manager (云管理控制器) 使用,告诉 Kubernetes 在配置资源时如何调用集群,以及它拥有哪些云资源的访问权限。



如果您熟悉 Kubernetes 的内部结构,这就是 ClusterID。 添加该标签后,单击下一步,然后单击下一个屏幕上的创建按钮。顺利完成 CloudFormation 堆栈后,您将拥有一个基础 DC/OS 集群。 现在我们需要修改工作线程实例角色的内联策略,从而允许 DC/OS 上的 Kubernetes 创建 ELB,修改标签和实例属性等等。如要执行此操作,请导航至 IAM 角色并搜索 SlaveRole。 您可以在此修改实例策略。复制并粘贴如下操作并将它们添加到实例角色的策略中。


Json


"ec2:AuthorizeSecurityGroupIngress","ec2:CreateRoute","ec2:CreateSecurityGroup","ec2:DeleteSecurityGroup","ec2:DeleteRoute","ec2:DescribeRouteTables","ec2:DescribeSubnets","ec2:DescribeSecurityGroups","ec2:ModifyInstanceAttribute","ec2:RevokeSecurityGroupIngress","elasticloadbalancing:AttachLoadBalancerToSubnets","elasticloadbalancing:ApplySecurityGroupsToLoadBalancer","elasticloadbalancing:CreateLoadBalancer","elasticloadbalancing:CreateLoadBalancerPolicy","elasticloadbalancing:CreateLoadBalancerListeners","elasticloadbalancing:ConfigureHealthCheck","elasticloadbalancing:DeleteLoadBalancer","elasticloadbalancing:DeleteLoadBalancerListeners","elasticloadbalancing:DescribeLoadBalancers","elasticloadbalancing:DescribeLoadBalancerAttributes","elasticloadbalancing:DetachLoadBalancerFromSubnets","elasticloadbalancing:DeregisterInstancesFromLoadBalancer","elasticloadbalancing:ModifyLoadBalancerAttributes","elasticloadbalancing:RegisterInstancesWithLoadBalancer","elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer"
复制代码


最后的策略应与如下所示相似:



如果具备许可,您可以登录到群集,然后安装 CLI。如要获取主终端节点,请导航至 CloudFormation 堆栈,然后查看 Outputs (输出) 选项卡。查找 DnsAddress,然后将此复制并粘贴到新的选项卡中。这时将提示您设置引导用户。该用户将被视为该集群的管理员,用于添加其他用户。



成功登录后,单击左侧工具条顶部的集群名称:这将是您输入到 CloudFormation 模板中名称。从下拉菜单中选择安装 CLI。您可以在此复制并粘贴类似于如下所示的代码片段:


Bash


[ -d /usr/local/bin ] || sudo mkdir -p /usr/local/bin && curl https://downloads.dcos.io/binaries/cli/darwin/x86-64/dcos-1.10/dcos -o dcos && sudo mv dcos /usr/local/bin && sudo chmod +x /usr/local/bin/dcos && dcos cluster setup http://my-dcos-elb.us-west-1.elb.amazonaws.com && dcos
复制代码


此脚本将会下载最新的 DC/OS 二进制代码,将其移动到 /usr/local/bin,然后使用新的 DC/OS 集群设置 CLI。在它完成前,将会提示您在浏览器中打开一个 URL (如果您在 macOS 上,则将尝试为您打开浏览器)。使用您最初登录所用的用户登录。成功登录后,将会向您提供一个 JSON Web Token (JWT)。将该令牌复制并粘贴到命令提示行以完成 CLI 配置。现在我们已经创建了集群,正确设置了实例策略和 CLI,可以部署 Kubernetes 了。为此我们将使用 DC/OS 服务目录。导航至左侧工具条中的 Catalog (目录),搜索“Kubernetes”,然后选择 beta-kubernetes



在此屏幕上单击 Review & Run (审核并运行)。这时将会显示 Review (审核) 对话框;单击右下角 Edit (编辑) 按钮。这将把对话框转换为表单。然后您可以选择左侧工具条中的 Kubernetes。在此表单中,您需要以小写格式将 aws 输入到 The Provider For Cloud Services (云服务提供商) 输入字段。



完成该字段的编辑后,您可以单击 Review & Run (审核并运行),然后单击 Run Service (运行服务)。这将运行正在部署的 Marathon Kubernetes 服务配置。几分钟后,您应会看到多个 Kubernetes 进程在运行。


部署服务

在 DC/OS 上启动 Kubernetes 后,这时需要部署我们的服务并确保所有设置正确。为了测试这一点,我们需要使用一个由 Cloud Controller Manager (云控制管理器) 管理的资源。 一个简单的使用案例是为 Kubernetes 服务配置 AWS 负载均衡器。在此清单文件中,我创建了一个部署了三个应用程序的基本微服务架构:一个 Web 应用程序和两个后端服务。在此例中,我们使用的微服务模式是每个服务都已自己的语言编写,相互之间的通信采用内部 kube-dns。除应用程序外,我们使用三个服务来暴露它们。如果您仔细看,将会注意到其中一个服务使用了 type: LoadBalancer ,它将告诉 Kubernetes 配置一个云资源并将其与服务绑定。


YAML


apiVersion: v1kind: Servicemetadata:  name: webapp  labels:    app: webappspec:  selector:    app: webapp  ports:  - port: 80    targetPort: http-server    name: http  - port: 443    targetPort: http-server    name: ssl  type: LoadBalancer
复制代码


部署时我们需要安装 kubectl ,为此我们需遵守此处的说明并稍后再进行配置。然后我们需要建立一条 SSH 隧道以将 localhost:9000 绑定到主节点,从而确保我们可以访问 Kubernetes API 服务器。为此您可以运行如下所示的命令。对于 {keyname}{ipaddress} ,请分别使用您用于创建集群的密钥对和主节点的 IP 地址代替。


主节点的 IP 地址可以通过在 EC2 控制台查看主负载均衡器附加的实例找到。


Bash


ssh-add ~/.ssh/{keyname}.pemexport MASTER_IP={ipddress}ssh -4 -o "UserKnownHostsFile=/dev/null" \         -o "StrictHostKeyChecking=no" \         -o "ServerAliveInterval=120" \         -N -L 9000:apiserver-insecure.kubernetes.l4lb.thisdcos.directory:9000 \         core@$MASTER_IP
复制代码


然后我们将运行如下命令,配置本地 kubectl


Bash


kubectl config set-cluster dcos-k8s --server=http://localhost:9000kubectl config set-context dcos-k8s --cluster=dcos-k8s --namespace=defaultkubectl config use-context dcos-k8s
复制代码


现在我们可以使用清单文件部署 kube-dns dns 插件,从而安装使用 kubectl apply -f URL 类似于:


Bash


$ kubectl apply -f https://raw.githubusercontent.com/christopherhein/aws-kubernetes-on-dcos/master/kube-dns.ymlservice "kube-dns" createdserviceaccount "kube-dns" createdconfigmap "kube-dns" createddeployment "kube-dns" created
复制代码


然后我们会再次使用 kubectl apply -f URL 部署应用程序和服务,然后观察服务终端节点,以确保 Cloud Controller Manager (云控制管理器) 配置并将 ELB 与 Kubernetes 服务关联。


Bash


$ kubectl apply -f https://raw.githubusercontent.com/christopherhein/aws-kubernetes-on-dcos/master/manifest.ymlservice "tracks" createddeployment "tracks" createdservice "laptimes" createddeployment "laptimes" createdservice "webapp" createddeployment "webapp" created$ kubectl get svc -o wide -wNAME         CLUSTER-IP       EXTERNAL-IP                       PORT(S)                      AGE       SELECTORkubernetes   10.100.0.1       <none>                            443/TCP                      9h        <none>laptimes     10.100.248.179   <none>                            5000/TCP                     6h        app=laptimestracks       10.100.19.121    <none>                            4567/TCP                     6h        app=trackswebapp       10.100.159.107   xxx.us-west-1.elb.amazonaws.com   80:32027/TCP,443:30090/TCP   6h        app=webapp
复制代码


在您看到 EXTERNAL-IP&lt;pending&gt; 变为 xxx.us-west-1.elb.amazonaws.com 后,服务即准备就绪,您可以打开浏览器并导航到该 URL。


清除

在完成演示并做好清除集群的准备后,我们首先需要删除 Kubernetes 资源,这将会删除它所创建的云资源。(如果这一步骤未完成,CloudFormation 将无法执行删除操作,您需要手动删除所创建的资源。)


Bash


kubectl delete -f https://raw.githubusercontent.com/christopherhein/aws-kubernetes-on-dcos/master/manifest.yml
复制代码


然后我们可以返回 CloudFormation 控制台,删除 DC/OS CloudFormation 堆栈。

结论

现在您已学会了如何部署 DC/OS 集群以及 Kubernetes 集群,学会了如何向世界暴露您的服务,请阅读来自 re:Invent 2017 的 Shipping With Porpoise (与鼠海豚启航),我在该文中介绍了如何在 DC/OS 上使用 JenkinsTwistlockWeaveworks 向 Kubernetes 提交应用程序,从而实现 CI/CD 管道的自动化和生产化。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/bringing-cloud-provider-support-to-kubernetes-on-dcos/


2019-10-29 08:00602

评论

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

react面试题详解

beifeng1996

React

vue组件通信6种方式总结(常问知识点)

bb_xiaxia1998

Vue

阿里Redis最全面试全攻略,读完这个就可以和阿里面试官好好聊聊

钟奕礼

Java java程序员 java面试 java编程

React源码分析6-hooks源码

goClient1992

React

DDD与应用架构

胖子笑西风

架构 DDD 框架 整洁架构 Java core

高频js手写题之实现数组扁平化、深拷贝、总线模式

helloworld1024fd

JavaScript

面试官:请实现Javascript发布-订阅模式

helloworld1024fd

JavaScript

谈谈前端应用里图标(Icon)的渲染和内容提取方式

汪子熙

前端开发 SAP ui5 Web应用 11月月更

Fiori Elements 应用进行二次开发的一个具体案例分享

汪子熙

SAP Fiori ui5 Web应用 11月月更

GitHub上新被爆赞!高并发JUC源码分析笔记,竟深受程序员追捧

钟奕礼

Java java程序员 java编程 Java面试题

注意 ! !|95% 的应用程序中发现错误配置和漏洞

SEAL安全

配置管理 软件供应链安全 漏洞管理

SpringBoot 接口层统一加密解密

小小怪下士

Java 程序员 springboot

浅谈深度学习中的概率

华为云开发者联盟

人工智能 华为云

PGL图学习之图神经网络GNN模型GCN、GAT[系列六]

汀丶人工智能

图神经网络 11月月更

前端一面经典react面试题(边面边更)

beifeng1996

React

前端面试被问到的js手写面试题汇总

helloworld1024fd

JavaScript

云安全系列3:如何构建云安全策略

HummerCloud

云计算 数据安全 云安全 11月月更

React源码分析5-commit

goClient1992

React

记一场vue面试

bb_xiaxia1998

Vue

掌握这些前端手写面试题能进大厂吗

helloworld1024fd

JavaScript

Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅

OpenAnolis小助手

容器 云原生 内核 龙蜥社区 袋鼠RunD

【专项测试系列】-缓存击穿、穿透、雪崩专项测试

京东科技开发者

缓存 测试 缓存穿透 缓存击穿 缓存雪崩

年搜索量超7亿次背后:这款APP用火山引擎 DataTester 完成“数据驱动”

字节跳动数据平台

大数据 数据分析 A/B测试

React-hooks面试考察知识点汇总

beifeng1996

React

腾讯二面vue面试题总结

bb_xiaxia1998

Vue

vue为什么v-for的优先级比v-if的高?

bb_xiaxia1998

Vue

React-Hooks怎样封装防抖和节流-面试真题

beifeng1996

「Go易错集锦」如何正确设置枚举中的零值

Go学堂

golang 程序员 个人成长 枚举 11月月更

全国独家 | 上海线下面授大规模敏捷LeSS认证 | 2022年12月8-10日

ShineScrum

less 大规模敏捷 LeSS认证 吕毅老师

阿里云架构师张先国:揭秘ECS倚天实例背后的技术

云布道师

算力 云栖大会 倚天实例

React源码分析7-state计算流程和优先级

goClient1992

React

OpenSource 为Kubernetes提供云服务支持_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章