首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

怎样为k8s找到最合适的PaaS解决方案?

本文最初发布于Bram Dingelstad的个人博客,经原作者授权由InfoQ中文站翻译并分享。

我们可能遇到过这样的情况。团队中有人发现一个bug,这个bug很特殊,与你经常遇到的软件bug不同。这不是一个普通的bug,而是非常个人化的bug:hype-driven developer。

它发端于小的事情,然后试图将团队推向一个新技术方向或项目中的一个小模块。在了解它之前,你已埋头于某个奇怪项目的高级文档中。这些文档仅用3个简单的步骤就解决了你的业务案例。然而,当你试图找到一种方法去做那些琐碎的事情时,却似乎需要更多的步骤。

我们都有这样的时刻:在过去一年,一个名为Kubernetes的项目成为许多人的关注焦点之一。有些公司发现其有着巨大作用,还有些公司还没有发现其价值,并在这个过程中将自己搞得“遍体鳞伤”。

而我正处于中间位置。我正在做类似事情,并且做好了踩坑准备。在此之前,先让我们看看如何在k8s上部署一个简单的、类似于PaaS的平台。

找到一个完美的类PaaS平台

那么,我们从哪里开始?肯定有一种简单方法能找到这样的东西,也许,我们从简单的DuckDuckGo搜索开始。

DuckDuckGo搜索没啥用

显然,k8s不是PaaS。我想基于k8s构建一个PaaS,当然不是把它当作一个PaaS来使用。

然后,我们在HackerNews上搜索一下。第一个查询找到一篇失效文章。此外,我在GitHub上偶然发现一个很棒的列表。在进行更广泛的搜索后,我针对自己的应用场景列出一个可能的候选项目列表。

还有很多其他选择,我尝试过其中一些,还有一些是针对大企业的。

我的应用场景

Quest Vault,我们在DigitalOcean droplet上安装一个简单的Wordpress来运行我们的电商网站。尽管能通过运行一些简单的bash脚本实现部署,并在本地运行测试/过渡服务器的副本,但是,我想构建一个基于行业技术的平台,而不是一些bash脚本。编写这些bash脚本很有趣,并且拥有自己的部署技术栈也很简单,但是,我希望Quest Vault能拥有一个“豪华些”的东西,一个标准的、让我们不必为使用的工具操心的东西。

一些必要条件

现在,我想在办公室运行k3s的garbage server上测试这些项目。K3s有一个到DigitalOcean droplet的反向代理,而不是在互联网上访问。这意味着项目应该支持内部部署

我还希望能完全抽象出k8s。这意味着我不想处理太多的yaml或者一直部署helm charts,我想多考虑下应用程序,并且通过CLI就可以做到。

简而言之:我想要的是,只要按一个按钮,它就工作

我们的应用程序有很多活动组件,有些只是简单脚本,有些则是为游戏客户端提供通信的大型应用程序。不管是什么,我们的平台需要支持大量不同的应用程序类型。这通常意味着支持通过Dockerfile进行部署

我们计划运行的大多数应用程序都与状态密切相关。以Wordpress为例,我们需要一个存储图片的地方。我们还有很多需要存储的应用内照片拍摄。我们需要一种方法使我们的应用程序具有某种形式的持久化

我喜欢的项目很多,但是一个好项目和一个伟大项目的区别在于社区和行业的采用。拥有自己的bash脚本和在GitHub上有3个活动用户的项目几乎没有区别。如果你搞砸了,或者无论出于什么原因需要一些建议,你都希望能从一个活跃的社区获得帮助

项目清单速览

Knative

我的Knative经验有一个不错的开头!当读过关于它的文章后,我很高兴地得知:我能运行一个平台,谷歌在其平台内部就把它用于他们自己的类似PaaS的部署。考虑到谷歌创造了k8s,这一定非常合适!它的安装过程比预期困难得多。

似乎没有什么简单方法来安装这个平台,而且,无法轻松地使用一个平台会是将来的一个风险。

OpenFaaS Cloud

安装非常简单!我很快就让这个平台运行了起来。它满足我的大多数需求,不过,它似乎更像是实现OpenFaas的一种有趣方式,而不是完全成熟的PaaS可选方案。我不知道如何将我们的用例放到这个特别的平台上。如果你正在搭配使用耦合度比较低的项目或比较小的功能,这是一个很好的选择!

Convox

Convox看起来很棒!几名前Heroku工程师,在k8s上构建的一个平台。似乎完美!我想尝试一下,马上就开始在DigitalOcean k8s集群上部署它。开发体验非常棒!

然而,他们似乎并不支持平台的内部部署版本。此外,除一些早期采用者外,这个项目似乎没有一个非常大的社区。相比而言,这个项目不是很出名,最终我放弃它,去寻找另一种选择。

Garden

这是一个非常酷的项目。我喜欢它,一家小型的独立公司开发的一个创新型解决方案。安装起来很简单,而且他们的方法对k8s做了很好的抽象,但是他们也允许你通过经典的k8s方式来保持某种形式的控制,比如yaml文件。我真的很愿意用它,效果很好!

然而,我确实注意到,它的一些CLI还不是很完善,但是,我认为这只是些小瑕疵,并不能代表最终产品。

Rio

这个项目符合所有条件。一个真正容易使用的CLI?是的。不再以任何方式与k8s交互?是的。使用Dockerfile进行部署?是的!它们还提供了大量其他平台没有实现或实现得很差的特性。来自Rancher的Rio似乎从他们活跃的社区得到了大量支持。

在garbage server上进行安装设置

我快速地为k3s实例设置好反向代理,并开始设置Rio。

参照他们GitHub页面上的快速入门指南,这个过程变得超级简单:

代码语言:javascript
复制
# Setting up the reverse proxy to k3s
ssh -nNTL 6443:localhost:6443 droplet &

# Installing Rio
curl -sfL https://get.rio.io | sh -

# Running the example project
rio run https://github.com/rancher/rio-demo

这样就行。我超级激动,希望马上看一下,现有的基础设施能否同样轻松地迁移。

Rio的默认安装允许你使用他们的rDNS服务on-rio.io,这个服务很酷,但不需要把我的garbage server放在反向代理后面。我还没有使用Linkerd的经验,所以现在只是禁用它。使用命令rio install --disable-feature rdns,letsencrypt,linkerd重新安装后,我获得了想要的结果。

接下来,通过kubectl安装自定义的ClusterDomain,这让我能使用on-rio.io之外的另一个域。最后,我安装了dnsmasq,并创建了一个名为app.rio的假域名,我的应用程序会在这个域名上解析。这将让我能轻松地在 garbage server上测试到应用程序的连接。

代码语言:javascript
复制
apiVersion: admin.rio.cattle.io/v1
kind: ClusterDomain
metadata:
  name: app.rio
spec:
  httpPort: 80

我还得想办法从DigitalOcean droplet连接到这个集群。我从 garbage server 上的80端口反向代理到8080端口上的droplet。Rio使用80端口安装了Gloo的gateway-proxy

最后一步,我设置了nginx配置,使其指向Gloo网关:

代码语言:javascript
复制
server {
    listen 80;
    server_name your.domain.name;
    location / {
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_pass http://localhost:8080;
    }
}

这有两件重要的地方需要注意,分别是proxy_http_version 1.1proxy_set_header Hostproxy_http_version非常重要,因为基于Envoy的Gloo不支持http_version 1.0上的网关,而只支持1.1上的网关。否则,它会返回一个426 Upgrade Required错误。

Host头对于实现PublicDomain非常重要。需要注意的是,要添加一个PublicDomain,它必须与server_name或被代理的Host头匹配,否则Gloo无法识别我要访问的是哪个服务。

代码语言:javascript
复制
rio domain register your.domain.name rio-demo

这就是我寻找最合适的Kubernetes PaaS解决方案的冒险。

英文原文:

Finding the right PaaS for k8s

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/8weE3zRYuwvl4FUp0FTY
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券