牧场主 中的Kubernetes:进一步的发展

编者注:今天的嘉宾来自Rancher Labs首席软件工程师Alena Prokharchyk,他将分享如何将Kubernetes的新功能集成到其平台中。

Kubernetes 是第一个受支持的外部编排平台 牧场主 ,并且自发布以来,它已成为我们用户中使用最广泛的工具之一,并且在采用中继续迅速增长。随着Kubernetes的发展,Rancher在适应Kubernetes的新功能方面也取得了进步。我们从支持Kubernetes 1.1版开始,然后在其发布后立即切换到1.2,现在我们正在致力于在1.3中支持令人兴奋的新功能。我想向您介绍在每个阶段中我们一直在增加的支持功能。

牧场主 和Kubernetes 1.2

Kubernetes 1.2引入了增强的Ingress对象,以简化允许入站连接访问群集服务的功能: 关于入口的博客文章 政策。入口资源允许用户以用户友好的方式为负载均衡器定义主机名路由规则和TLS配置。然后,应使用Ingress控制器进行备份,该控制器将使用Ingress规则配置相应的云提供商的负载均衡器。由于Rancher已经包含了基于HAproxy的软件定义的负载均衡器,因此我们已经支持了Ingress资源的所有配置要求,并且无需在Rancher方面进行任何更改即可采用Ingress。我们要做的是编写一个Ingress控制器,该控制器将监听Kubernetes的Ingress特定事件,相应地配置Rancher Load Balancer,并将Load Balancer的公共入口点传播回Kubernetes:

Screen-Shot-2016-05-13-at-11.15.56-AM.png

现在,入口控制器已部署为Rancher Kubernetes 系统堆栈的一部分,并由Rancher管理。 牧场主 监视Ingress控制器的运行状况,并在发生任何故障时重新创建它。除了标准的入口功能外,Rancher还允许您通过通过入口注释指定比例来水平扩展支持入口服务的负载均衡器。例如:

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

 name: scalelb

 annotations:

 scale: "2"

spec:

  rules:

  - host: foo.bar.com

    http:

      paths:

      - path: /foo

        backend:

          serviceName: nginx-service

          servicePort: 80

由于上述原因,将在单独的主机上启动2个Rancher Load Balancer实例,并且将使用2个公共IP地址更新Ingress:

kubectl get ingress

NAME      RULE          BACKEND   ADDRESS

scalelb      -                    104.154.107.202, 104.154.107.203  // hosts ip addresses where  牧场主  LB instances are deployed

          foo.bar.com

          /foo           nginx-service:80

可在此处找到有关Kubernetes的Rancher Ingress Controller实现的更多详细信息:

牧场主 和Kubernetes 1.3

我们对Kubernetes 1.3版本及其附带的所有新功能感到非常兴奋。我们特别感兴趣的有两种:状态应用程序和集群联合。

Kubernetes 状态应用

有状态应用程序是Kubernetes的新资源,用于表示有状态应用程序中的一组Pod。这是使用复制控制器的替代方法,后者最适合用于运行无状态应用程序。对于依赖领导者选举的仲裁的应用程序(例如MongoDB,Zookeeper等)和分散仲裁(Cassandra),此功能特别有用。 Stateful Apps创建并维护一组Pod,每个Pod具有稳定的网络身份。为了提供网络身份,必须有可能为该容器具有一个可解析的DNS名称,该名称与 Kubernetes 设计文档:

# service mongo pointing to pods created by PetSet mdb, with identities mdb-1, mdb-2, mdb-3


dig mongodb.namespace.svc.cluster.local +short A

172.130.16.50


dig mdb-1.mongodb.namespace.svc.cluster.local +short A

# IP of pod created for mdb-1


dig mdb-2.mongodb.namespace.svc.cluster.local +short A

# IP of pod created for mdb-2


dig mdb-3.mongodb.namespace.svc.cluster.local +short A

# IP of pod created for mdb-3

上面的内容是通过在Pod上的注释实现的,该注释浮现到端点,最后在暴露这些Pod的服务上作为DNS浮出水面。目前,Rancher通过利用Rancher DNS作为SkyDNS的替代产品来简化DNS配置。 牧场主 DNS快速,稳定且可扩展-群集中的每个主机都会运行DNS服务器。 Kubernetes 服务被编程为Rancher DNS,并被解析为来自10,43.x.x地址空间的服务的群集IP或无头服务的Pod ip地址集。为了使PetSet通过Rancher与Kubernetes一起使用,我们必须在Rancher DNS配置中添加对Pod身份的支持。我们现在正在研究这个问题,应该在即将发布的Rancher版本之一中予以支持。

集群联盟

集群联盟是Kubernetes中集群联盟的控制平面。它通过将应用程序分布在多个集群中来提供改进的应用程序可用性(下图是Kubernetes提供的):

屏幕截图2016-07-07 at 1.46.55 PM.png

每个Kubernetes集群都公开一个API端点并作为Federation对象的一部分注册到Cluster Federation。然后,使用Cluster Federation API,可以创建联合服务。这些对象由多个等效的基础Kubernetes资源组成。假设上图中的3个群集属于同一联合对象,则通过“群集联合”创建的每个服务将获得在每个群集中创建的等效服务。除此之外,Cluster Federation服务还将获得可解析为Kubernetes服务的公共IP地址的公共可解析DNS名称(DNS记录已被编程为以下公共DNS提供商之一):

屏幕截图2016-07-07 at 1.24.18 PM.png

为了通过Rancher中的Kubernetes支持集群联合,需要进行某些更改。今天,每个Kubernetes集群都代表一个Rancher环境。在每个Kubernetes环境中,我们创建一个完整的Kubernetes系统堆栈,其中包含以下服务:Kubernetes API服务器,Scheduler,Ingress控制器,持久化etcd,控制器管理器,Kubelet和Proxy(每个主机上运行最后两个)。要设置集群联合,我们将在集群联合堆栈将要运行的地方创建一个额外的环境:

屏幕截图2016-07-07 at 1.23.14 PM.png

然后,应将以Rancher环境表示的每个基础Kubernetes集群注册到特定的集群联盟。 牧场主 集群联盟环境可以通过表示Kubernetes集群上的联盟名称的标签自动发现每个集群。我们仍在完成设计的定稿,但是我们对该功能感到非常兴奋,并且看到了很多可以解决的用例。集群联盟文档参考:

Kubernetes 1.4的计划

当我们在Rancher中启动Kubernetes支持时,我们决定维护自己的Kubernetes发行版,以支持Rancher的本地网络。我们知道,通过拥有自己的发行版,每当对Kubernetes进行更改时,我们都需要对其进行更新,但是我们认为有必要支持正在为用户开发的用例。作为1.4工作的一部分,我们再次研究了网络方法,并重新分析了对我们自己的Kubernetes分支的最初需求。除了网络集成之外,我们与Kubernetes一起完成的所有工作都是作为Kubernetes插件开发的:

  • 牧场主 作为CloudProvider(支持负载均衡器)。
  • 牧场主 作为CredentialProvider(支持Rancher私人注册表)。
  • 牧场主 Ingress控制器备份Kubernetes入口资源。

因此,我们决定消除对Rancher Kubernetes 发行版的需求,并尝试将对Kubernetes存储库的所有更改纳入上游。为此,我们将重新进行网络集成,并支持将Rancher网络作为 Kubernetes 的CNI插件。有关功能的更多详细信息将在功能设计完成后立即分享,但预计将在未来2-3个月内发布。我们还将继续投资Rancher与Kubernetes集成的核心功能,包括但不限于:

  • 通过代表Kubernetes集群的Rancher环境进行访问权限管理
  • 凭证管理和基于Web的轻松访问标准kubectl cli
  • 负载平衡支持
  • 牧场主 内部DNS支持
  • Kubernetes 模板的目录支持
  • 增强的UI可以表示更多Kubernetes对象,例如:Deployment,Ingress和Daemonset。

所有这些都是为了使Kubernetes体验更加强大和用户直观。我们对Kubernetes社区的所有进展感到非常兴奋,并很高兴能参与其中。 Kubernetes 1.3是一个非常重要的版本,您将能够在Rancher中很快升级到它。

-Rancher Labs首席软件工程师Alena Prokharchyk。 Twitter @lemonjet & GitHub alena1108

Rancher-and-Kubernetes.png