写点什么

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:00565

评论

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

区块链溯源!“有机”食品也要“有迹可循”

旺链科技

区块链 产业区块链 食品追溯

架构训练营 模块七

Geek_16d2b8

架构训练营 模块七

读《A Philosophy of Software Design》——(9)

术子米德

架构师成长笔记

模块七

Leo

架构实战营

读《A Philosophy of Software Design》——(16)

术子米德

架构师成长笔记

读《A Philosophy of Software Design》——(12)

术子米德

架构师成长笔记

老项目改造返回值规范化

Rubble

4月日更

一文让你深度了解Linux内核架构和工作原理

简说Linux内核

内存管理 Linux内核 进程管理 驱动开发 嵌入式开发

现代间谍技术的演变:从“王牌特工”到“行走的50w”

脑极体

读《A Philosophy of Software Design》——(10)

术子米德

架构师成长笔记

读《A Philosophy of Software Design》——(14)

术子米德

架构师成长笔记

[Day8]-[动态规划] 最长公共子序列

方勇(gopher)

LeetCode 动态规划 数据结构与算法、

适合 Kubernetes 初学者的一些实战练习 (五)

汪子熙

postgresql Kubernetes Cloud Native statefulset 4月月更

模块七作业

Geek_ec866b

架构训练营

王者荣耀商城-异地多活设计

邹玉麒

架构训练营5期

数据库原理知识及SQL语言知识拓展

王小王-123

MySQL 数据库 MySQL 数据库 4月月更

读《A Philosophy of Software Design》——(15)

术子米德

架构师成长笔记

读《A Philosophy of Software Design》——(17)

术子米德

架构师成长笔记

读《A Philosophy of Software Design》——(11)

术子米德

架构师成长笔记

读《A Philosophy of Software Design》——(18)

术子米德

架构师成长笔记

Android C++系列:JNI中发送Http网络请求

轻口味

c++ android jni curl 4月月更

每个互联网人才都应该知道的SQL注入!

喀拉峻

网络安全 安全 渗透测试 SQL注入

读《A Philosophy of Software Design》——(20)

术子米德

架构师成长笔记

模块七作业

blazar

「架构实战营」

模块7作业

Mr小公熊

王者荣耀(商城)异地多活架构模拟设计

随欣所遇

架构训练营5期

王者荣耀商城异地多活架构设计

AragornYang

架构训练营 架构实战营

如何编写一个Linux内核模块,这次手把手教你

简说Linux内核

内存管理 Linux内核 进程管理 嵌入式开发 设备驱动

读《A Philosophy of Software Design》——(8)

术子米德

架构师成长笔记

读《A Philosophy of Software Design》——(13)

术子米德

架构师成长笔记

读《A Philosophy of Software Design》——(19)

术子米德

架构师成长笔记

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