1、Ingress

在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes中可以通过NodePort和LoadBalancer这两种类型的服务,或者使用Ingress。

插曲--------------------------------------------------------------------start----------------------------------------------------------------------------------------------------------------------------

  一、Kubernetes 服务暴露介绍

  从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务;到目前为止 kubernetes 总共有三种暴露服务的方式:

  • LoadBlancer Service
  • NodePort Service
  • Ingress

  1.1、LoadBlancer Service

  LoadBlancer Service 是 kubernetes 深度结合云平台的一个组件;当使用 LoadBlancer Service 暴露服务时,实际上是通过向底层云平台申请创建一个负载均衡器来向外暴露服务;目前 LoadBlancer Service 支持的云平台已经相对完善,比如国外的 GCE、DigitalOcean,国内的 阿里云,私有云 Openstack 等

  等,由于 LoadBlancer Service 深度结合了云平台,所以只能在一些云平台上来使用

  1.2、NodePort Service

  NodePort Service 顾名思义,实质上就是通过在集群的每个 node 上暴露一个端口,然后将这个端口映射到某个具体的 service 来实现的,虽然每个 node 的端口有很多(0~65535),但是由于安全性和易用性(服务多了就乱了,还有端口冲突问题)实际使用可能并不多

  1.3、Ingress

  Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务

插曲---------------------------------------------------------------------------------------------end-----------------------------------------------------------------------------------------------

Ingress本质是通过http代理服务器将外部的http请求转发到集群内部的后端服务。Kubernetes目前支持GCE和nginx控制器;另外,F5网络为Kubernetes提供了F5 Big-IP控制器。通过Ingress,外部应用访问群集内容服务的过程如下所示。

Ingress控制器通常会使用负载均衡器来负责实现Ingress,尽管它也可以通过配置边缘路由器或其它前端以HA方式处理流量。

2、Ingress配置文件

下面是Ingress YAML配置文件的示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations: nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
backend:
serviceName: test
servicePort: 80
  • 1-6行:Ingress YAML文件中的1-6行与其它的Kubernetes配置文件一样,需要apiVersion, kind和metadata字段。此示例定义了名称为test-ingress的Ingress。
  • 7-9行:Ingress规格具有配置负载均衡器或代理服务器所需的所有信息。最重要的是,它包含与所有传入请求相匹配的规则列表。目前,Ingress资源仅支持http规则。
  • 10-11行:每个http规则都包含以下信息:一个主机(例如:foo.ba.com,在这个例子中为*),一个路径列表(例如:/testpath),每个路径都有一个相关的后端(test:80)。在负载均衡器将业务引导到后端之前,主机和路径都必须匹配传入请求的内容。
  • 12-14行:后端是服务:端口(test:80)组合。Ingress流量通常被直接发送到与后端相匹配的端点。

3、Ingress类型

3.1 代理单一服务

Kubernetes可以使用LoadBalancer和NodePort类型的服务暴露服务,也可以通过一个Ingress来实现。下面是名称为test-ingress的Ingress YAML文件,它将对外代理名称为testsvc的服务。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: single-ingress
annotations: nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: s1
servicePort: 80

通过kubectl create -f创建上述的Ingress,在创建后可以通过kubectl get ing的命令获取Ingress的列表信息:

$ kubectl get ing 

NAME RULE BACKEND ADDRESS

single-ingress –s1:80 107.178.254.228

3.2 代理多个服务

如前所述,在kubernetes 中Pod的IP地址只能对群集内的其它的应用可见。因此,如果需要接受集群外部的流量,并将其代理到集群中后端服务。在此示例中,通过foo.bar.com(IP地址为:178.91.123.132)主机作为代理服务器。当路径为http://foo.bar.cm:80/foo时,将会访问后端的s1服务;当路径为http://foo.bar.cm:80/bar时,将会访问后端的s2服务。

foo.bar.com -> 178.91.123.132 -> / foo s1:80 / bar s2:80

针对上述场景,Ingress的YAML配置文件如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mult-ingress
annotations: nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: s1
servicePort: 80
- path: /bar
backend:
serviceName: s2
servicePort: 80

通过kubctl create -f命令创建上述的Ingress:

$ kubectl get ing 

NAME RULE BACKEND ADDRESS

mult-ingress – foo.bar.com /foo s1:80 /bar s2:80

默认后端:没有规则的入口,就像前一节中所示的那样,会将所有的流量发送到一个默认的后端。通过指定一组规则和默认后端,可以使用相同的技术来告诉负载均衡器,可以在哪里能够找到网站的404页。如果在Ingress中没有与请求头中主机相匹配的主机,并且/或者没有与请求的URL相匹配的路径,那么路由将被路由到默认的后端。

参考资料

1.《Ingress》地址:https://kubernetes.io/docs/concepts/services-networking/ingress/

2.《Rewrite》地址:https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md

https://mritd.me/2016/12/06/try-traefik-on-kubernetes/#%E4%B8%80kubernetes-%E6%9C%8D%E5%8A%A1%E6%9A%B4%E9%9C%B2%E4%BB%8B%E7%BB%8D

作者简介:
季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。

kubernetes-核心资源之Ingress的更多相关文章

  1. kubernetes之常用核心资源对象

    部门产品线本身是做DEVOPS平台,最近部署架构也在往K8S上靠了,不得不学一下K8S.自己搭建了K8S集群与harbor仓库来学习. 1.kubernetes之常用核心资源对象 1.1.K8s服务部 ...

  2. k8s kubernetes 核心笔记 镜像仓库 项目k8s改造(含最新k8s v1.16.2版本)

    k8s kubernetes 核心笔记 镜像仓库 项目k8s改造 2019/10/24 Chenxin 一 基本资料 一 参考: https://kubernetes.io/ 官网 https://k ...

  3. kubernetes核心原理之API Server原理分析

    kubernetes API Server的核心功能是提供了Kubernetes各类资源对象(Pod,RC,Service等)的增删改查及Watch等HTTP Rest接口,成为集群内各个功能模块之间 ...

  4. 01 . 容器编排简介及Kubernetes核心概念

    Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...

  5. kubernetes系列(十) - 通过Ingress实现七层代理

    1. Ingress入门 1.1 Ingress简介 1.2 原理和组成部分 1.3 资料信息 2. Ingress部署的几种方式 2.1 前言 2.1 Deployment+LoadBalancer ...

  6. 第三章 kubernetes核心原理

    kubernetes API Server 提供了Kubernetes各类资源对象(如pod,re,service等)的增删改查及watch等Http Rest接口,成为集群内各个功能模块之间数据交互 ...

  7. 第3 章 : Kubernetes 核心概念

    Kubernetes 核心概念 本文整理自 CNCF 和阿里巴巴联合举办的云原生技术公开课的课时 3:Kubernetes 核心概念.本次课程中,阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李 ...

  8. k8s核心资源之Pod概念&入门使用讲解(三)

    目录 1. k8s核心资源之Pod 1.1 什么是Pod? 1.2 Pod如何管理多个容器? 1.3 Pod网络 1.4 Pod存储 1.5 Pod工作方式 1.5.1 自主式Pod 1.5.2 控制 ...

  9. Kubernetes 核心概念

    什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...

  10. 十分钟带你理解Kubernetes核心概念

    什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...

随机推荐

  1. JS 中 原生方法 (二) --- 数组 (修---添加ES6新增)

    const arr = [1, 2, 3, 5, 'a', 'b'] /** * * length * 这个只能被 称之为 数组的原生属性, 返回 一个 number * arr.length */ ...

  2. JAVA实现在线查看PDF和office文档

    一个项目中要做一个在线预览附件(和百度文库差不多)的小功能点,楼主在开发过程中踩了很多坑的同时也总结了一些方法,仅供广大猿友参考,那么要实现这个小功能,目前主要是有如下3种可行的实现方式,下面先说实现 ...

  3. nginx部署~dotnetCore+mvc网站502

    这个不是nginx的问题,也不是dotnet core的问题,也不是mvc的问题,更不是防火墙的问题! 原因在于这个SeLinux 把它关了就可以了 setsebool -P httpd_can_ne ...

  4. 网络设备配置与管理(华为)基础系列 :VLAN故障排除和GVRP

    一.VLAN故障排除 故障排除的三步骤:故障定位 → 分析故障 → 排除故障 一般情况下,网络设备配置的故障有两种排错方式 A.静态排错:主要靠display查看配置信息的方式进行 在相关vlan下d ...

  5. SQL修改表字段,加附属属性

    GO Go EXEC sys.[sp_addextendedproperty] @name = 'MS_Description',@value = '是否填写表单',@level0type = 'SC ...

  6. H5 和 CSS3 新特性

    博客地址:https://ainyi.com/52 H5 新特性 语义化标签:header.footer.section.nav.aside.article 增强型表单:input 的多个 type ...

  7. C#组件系列——又一款日志组件:Elmah的学习和分享

    前言:好久没动笔了,都有点生疏,12月都要接近尾声,可是这月连一篇的产出都没有,不能坏了“规矩”,今天还是来写一篇.最近个把月确实很忙,不过每天早上还是会抽空来园子里逛逛.一如既往,园子里每年这个时候 ...

  8. C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签

    概要 书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间.在前一篇文章“C# 如何添加/删除Word书签”中介绍了插入.删除书签的方法,本篇文章将对C# 操作Word书签的功能做进 ...

  9. 单元测试与Mockito

    1.什么是单元测试? 顾名思义单元测试就是对软件系统中最小的单元(函数.类)做测试,类似焊接电路板前对每个电容器(电子元器件)的测试.从软件测试分级来看,单元测试是最底层也是离程序员最近的一层,一般由 ...

  10. 2018.12/6 js键盘事件 DOM:0级2级

    DOM0级事件元素绑定多个click最后只执行最后一个click. DOM2级事件元素绑定多个click,都要执行 注意当绑定的多个事件名,函数名,事件发生阶段三者完全一样时,才执行最后一个 div. ...