关闭

如何在Kubernetes中暴露服务访问

标签: DockerRancherkubernetes暴露服务访问
4839人阅读 评论(1) 收藏 举报
分类:

Kubernetes概述

最近的一年,kubernetes的发展如此闪耀,正被越来越多的公司采纳用于生产环境的实践。同时,我们可以在最著名的开发者问答社区StackOverflow上看到k8s的问题数量的增长曲线(2015.5-2016.5),开发者是用脚投票的,从这一点看也无疑证明了k8s的火爆程度。

这里写图片描述

k8s来源于Google生产环境的实践,社区活跃度很高,在github上的Star数17k+,30k+commits,同时由Google主导CNCF基金会也在强力运作k8s的社区发展,也就在几个月前OpenStack社区宣布全面拥抱k8s,这也宣布了全球第大的开源IAAS云社区已经选择k8s作为容器的唯一解决方案。

这里写图片描述

谈到k8s,无论怎样的议题怎样的开始,我们都先介绍一个k8s整体架构(如下图所示):

这里写图片描述

etcd 作为配置中心和存储服务,保存了所有组件的定义以及状态,k8s的多个组件之间的互相交互也主要通过etcd;

kube-apiserver 提供和外部交互的接口,提供安全机制,大多数接口都是直接读写etcd中的数据;

kube-scheduler 调度器,主要干一件事情,监听etcd中的pod目录变更,然后通过调度算法分配node,最后调用apiserver的bind接口将分配的node和pod进行关联;

kube-controller-manager 承担了master的主要功能,比如和CloudProvider(IaaS)交互,管理node,pod,replication,service,namespace等。

基本机制是监听etcd /registry/events下对应的事件,进行处理;kubelet 主要包含容器管理,镜像管理,Volume管理等;kube-proxy 主要用于实现k8s的service机制。提供一部分SDN功能以及集群内部的智能LoadBalancer。

本文分享的内容主要是在minion节点上的pod和service上,pod是k8s应用的具体实例抽象,而service便是这些抽象的集合。

这里写图片描述

ClusterIP & NodePort & Loadbalancer

回到本文的主题,在k8s中暴露Service访问(无论内部还是外部),都要经过kube-proxy,比如下图中我们定义一个Service,便可以通过访问Service的80端口转发到Pod的9376端口上。

这里写图片描述

kube-proxy在转发时主要有两种模式Userspace和Iptables。如下图,左侧是Userspace模式,也是kube-proxy默认的方式,所有的转发都是通过kube-proxy软件实现的;右侧是Iptables模式,所有转发都是通过Iptables内核模块实现,而kube-proxy只负责生成相应的Iptables规则。从效率上看,Iptables会更高一些,但是需要Iptables version >=1.4.11,Iptables模式在k8s1.2版本放出,是否开启使用还需要具体斟酌。

这里写图片描述

从Service本身看,有三种方式来暴露访问:

  • ClusterIP:使用集群内的私有ip —— 这是默认值
  • NodePort:除了使用cluster ip外,也将service的port映射到每个node的一个指定内部port上,映射的每个node的内部port都一样。
  • LoadBalancer:使用一个ClusterIP & NodePort,但是会向cloud provider申请映射到service本身的负载均衡。

LoadBalancer Provider主要有aws、azure、openstack、gce等云平台提供。相关实现可以在k8s的源码中看到,如下图所示:

这里写图片描述

Ingress

Ingress也是k8s中单独定义的对象(如下图所示),它的作用就是实现对外暴露访问的负载均衡,那么它和Service本身LoadBalancer有哪些区别呢?Ingress支持L4、L7负载均衡,LoadBalancer设计上只支持L4;Ingress基于Pod部署,并将Pod网络设置成external network;Ingress controller支持Nginx、Haproxy、GCE-L7,能够满足企业内部使用。

这里写图片描述

在实际使用时,Ingress的架构如下图所示:

这里写图片描述

但是在实际使用中,pod可能会产生漂移,由于Ingress Controller也是基于Pod部署,这样Ingress对外的IP会发生变化。在企业内部都会在防火墙上给Service的访问IP设定规则,而IP变动对这一机制是致命的,因为企业不可能经常手动修改防火墙规则。

那么我们就需要一个VIP功能,同时也要能保证Ingress的HA。我们可以考虑在Ingress Controller基础上增加一个keepalived,可以利用keepalived+haproxy的机制来完成VIP的功能。要实现这一机制,可以参考并改动k8s社区中的contrib-keepalived-vip机制。

这里写图片描述

除了以上介绍的暴露服务机制,还有Hpcloud-service-loadbalancer ,它实现了支持keepalived+nginx、F5、OpenStack Lbaas这些方式,并且支持L4 & L7负载均衡,但是与k8s社区本身的发展机制并不兼容,所以一直没有被合并到社区中。另外还有 Contrib-service-loadbalancer ,这个是社区内部正在发展的,它的想法更远大,考虑会支持Cross-namespace、 Cross-cluster这种级别的负载均衡,同时也是设计了插件机制,目前支持Haproxy,同样也支持L4 & L7负载均衡。

Rancher K8s中暴露服务访问

Rancher自己实现了一个rancher-ingress-controller,它本质上是包装了k8s-ingress-controller,在真正创建负载均衡器上它会调用Rancher Cattle API来创建Rancher自身的LB。

这里写图片描述

相关代码也是开源的,https://github.com/rancher/lb-controller,lb-controller在启动时候会指定provider为rancher,对应的实现也可在package provider/rancher中看到。

这里写图片描述

创建Ingress后,也可在Rancher UI上展现出来。

这里写图片描述

创建过程,可以看我录制这段视频教程,http://v.youku.com/v_show/id_XMTc2MDAzNjQ4OA==.html

原文来源:Rancher Labs

1
0
查看评论

深入浅出 Kubernetes 架构

作者介绍 王渊命,团队协作IM服务Grouk联合创始人及CTO,技术极客,曾任新浪微博架构师、微米技术总监。2015年作为联合创始人创立团队协作IM服务Grouk,长期关注团队协作基础工具和研发环境建设,Docker深度实践者。 正文 最近研究了一段时间的Kuberne...
  • jincm13
  • jincm13
  • 2016-03-14 14:32
  • 11875

Kubernetes用户指南(一)--快速开始、使用k8s配置文件

一、快速开始 1、启动一个简单的容器。 一旦在Container中打包好应用并将其commit为Image之后,你就可以将其部署在k8s集群上。 一个简单的nginx服务器例子: 先决条件:你需要拥有的是一个部署完毕并可以正常运行的k8s集群。 在Master节点上使用kubec...
  • qq1010885678
  • qq1010885678
  • 2015-09-30 20:19
  • 26599

Kubernetes用户指南(二)--部署组合型的应用、连接应用到网络中

一、部署连续运行的应用 1、使用配置文件启动replicas集合 k8s通过Replication Controller来创建和管理各个不同的重复容器集合(实际上是重复的pods)。 Replication Controller会确保pod的数量在运行的时候会一直保持在一个特殊的数字,即...
  • qq1010885678
  • qq1010885678
  • 2015-10-10 17:22
  • 6750

2016年Kubernetes(k8s)大事记

34次发布 , 18,557次commits,175家企业参与,705个贡献者,2,552,778行Go代码 2016年是Kubernetes快速发展的一年,在社区中,从对它疑虑到逐渐认可再到追捧,转变过程用了不到一年的时间。 Kubernetes被越来越多的公司作为生产系统容器集群的编...
  • qq_34463875
  • qq_34463875
  • 2017-02-22 10:10
  • 2290

kubernetes将外部服务映射为内部服务

在实际应用中,一般不会把mysql这种重IO、有状态的应用直接放入k8s中,而是使用专用的服务器来独立部署。而像web这种无状态应用依然会运行在k8s当中,这时web服务器要连接k8s管理之外的数据库,有两种方式:一是直接连接数据库所在物理服务器IP,另一种方式就是借助k8s的Endpoints直接...
  • liyingke112
  • liyingke112
  • 2017-07-27 15:57
  • 587

kubernetes中port、target port、node port的对比分析,以及kube-proxy代理

容器网络实例 服务中的3个端口设置 这几个port的概念很容易混淆,比如创建如下service: apiVersion: v1 kind: Service metadata: labels: name: app1 name: app1 namespace: default s...
  • xinghun_4
  • xinghun_4
  • 2016-01-10 18:55
  • 23176

DEVOPS的支撑服务:K8S容器管理与应用部署

转载本文需注明出处:EAII企业架构创新研究院,违者必究。如需加入微信群参与微课堂、架构设计与讨论直播请直接回复公众号:“EAII企业架构创新研究院”。(微信号:eaworld) 大家好,本期微课堂介绍在新一代数字化企业云平台中对于Kubernetes的学习以及使用的总结。 本次分...
  • ztsinghua
  • ztsinghua
  • 2016-11-30 10:14
  • 2496

Rancher 系列教学视频学习笔记(1)

Rancher 系列教学视频-学习笔记(1)   一、培训视频学习笔记1《容器管理平台Rancher官方介绍》(Rancher 1.0 发布)   视频地址:http://v.youku.com/v_show/id_XMTU4NDIxNzc2MA  发...
  • CSDN_duomaomao
  • CSDN_duomaomao
  • 2017-07-26 18:18
  • 912

修改K8S中NodePort方式暴露服务的端口的默认范围(30000-32767)的方法

比如像把端口范围改成0-65535,则在apiserver的启动命令里面添加如下参数: –service-node-port-range=0-65535
  • felix_yujing
  • felix_yujing
  • 2017-12-03 14:52
  • 503

kubernetes 服务发现与注册个人想法

初衷最近调研k8s,k8s是一个不错的docker编排工具,其中考虑到了很多在运维过程中的痛点,比如,RC、scale、autoscale、rolling-update等一系列的运维比较关心的东西,但是在k8s的服务暴露方面该需要做一些改进,自身的使用的clusterip只能k8s内部访问,服务服务...
  • qq_29778131
  • qq_29778131
  • 2017-06-22 13:49
  • 789
    个人资料
    • 访问:99861次
    • 积分:2425
    • 等级:
    • 排名:第18030名
    • 原创:136篇
    • 转载:2篇
    • 译文:9篇
    • 评论:6条
    文章分类
    最新评论