在 Kubernetes 中, Service 有三种对外暴露的方法,但是由于每个 Service 都要有一个负载均衡的服务,所以采用 Service 的话,会造成既浪费成本又高的现象.对于用户来说,我更希望的是,能有一个全局的负载均衡器,然后我只需要通过访问 URL 就可以把请求转发给不同的后端 Service ,从而可以访问到界面.而不是每个 Service 都需要负载均衡.

而这,就引出了 Ingress :它就是全局的,为了代理不同后端 Service 而设置的负载均衡服务.

来说个例子:假设我现在有一个站点: https://cafe.example.com ,其中, https://cafe.example.com/coffee ,对应的是"咖啡点餐系统",而 https://cafe.example.com/tea ,对应的则是"茶水点餐系统",而这两个系统,分别由名叫 coffee 和 tea 这样两个 Deployment 来提供服务.

那么问题来了,我如何使用 Kubernetes 中的 Ingress 来创建一个统一的负载均衡器,从而实现当用户访问不同的域名时,能够访问到不同的 Deployment 呢?

其实很简单,写个 YAML 文件就好了,内容如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
tls:
- hosts:
- cafe.example.com
secretName: cafe-secret
rules:
- host: cafe.example.com
http:
paths:
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80

在上面这个名叫 cafe-ingress.yaml 文件中,最值得关注的就是在 rules 字段,这个字段在 Kubernetes 中,叫做: IngressRule .

IngressRule 的 Key ,就叫做: host ,它必须是一个标准的域名格式的字符串,而不能是 IP 地址.而 host 字段定义的值,就是 Ingress 的入口.也就是说,当用户访问 cafe.example.com 时,实际上访问的就是这个 Ingress 对象,这样 Kubernetes 就能够使用 IngressRule 来对实际请求进行下一步转发.

而接下来 IngressRule 规则的定义,则依赖于 path 字段.你可以看到,在上面的 YAML 文件中,定义了两个 path ,分别对应 coffee 和 tea 这两个 Deployment 的 Service (即: coffee-svc 和 tea-svc ).

如果你了解过 Nginx 的话,到这儿应该就很容易理解了.所谓 Ingress 对象,其实就是 Kubernetes 项目对"反向代理"的一种抽象,一个 Ingress 对象的主要内容,实际上就是一个"反向代理"服务的配置文件的描述,而这个代理服务对应的转发规则,就是 IngressRule.

所以这也是为什么在每条 IngressRule 中,需要有一个 host 字段来作为这条 IngressRule 的入口,还需要有一系列 path 字段来声明具体的转发策略.如果你对 Nginx , HAproxy 等项目的配置文件熟悉的话,你会发现其实它们的写法是一致的.

所以,有了 Ingress 这样一个统一的抽象, Kubernetes 的用户就无需关心 Ingress 的具体细节了,在实际使用中,只需要选择一个具体的 Ingress Controller ,把它部署在 Kubernetes 集群里就可以了.然后接下来的事情,就交给它去做就OK了,你要做的就是去写相关的 YAML 文件即可.(发现没有,又降低了使用难度)

不知道你有没有一个疑问,就是如果我的请求没有匹配到任何一条 IngressRule ,那么界面会显示什么呢.

你可以想想,当你访问一个网址的时候,它会如何给你反应?没错,就是 404 界面.

在 Ingress Controller 中,你也可以通过 Pod 启动命令中 -default-backend-service 参数,来设置一条默认规则.这样,任何匹配失败的请求,都会被转发到你指定的 Service ,这样你就可以通过部署一个专门的 Pod ,来为用户返回自定义的 404 界面了.

以上内容来自我学习<深入剖析Kubernetes>专栏文章之后的一些见解,有偏颇之处,还望指出.

感谢您的阅读~

[Kubernetes]说说 Service 与 Ingress的更多相关文章

  1. k8s中几个基本概念的理解,pod,service,deployment,ingress的使用场景

    k8s 总体概览 前言 Pod 副本控制器(Replication Controller,RC) 副本集(Replica Set,RS) 部署(Deployment) 服务(Service) ingr ...

  2. kubernetes进阶(04)kubernetes的service

    一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...

  3. 【Kubernetes】Kubernetes的Service外部访问方式:NodePort和LoadBalancer

    Kubernetes的Pod的寿命是有限的,它们不会复活,因此尽管每个Pod都有自己的IP地址,但是这些IP地址是不可靠的,会随着Pod的消亡而消失. 这就带来一个问题,如果一些Pod的集合(称之为b ...

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

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

  5. 把H2数据库从jar包部署到Kubernetes,并解决Ingress不支持TCP的问题

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! H2 Database是一个优秀的数据库,又小又方便,支持内存和文件形式,经常会在测试.POC(proof of conce ...

  6. Kubernetes的Service运行原理

    一.为什么Servcie能定位到Pod 因为Pod的IP是不固定的,所以Kubernetes需要Service,除此之外它还可以在多个Pod间负载均衡 Service的访问入口,其实是宿主机的kube ...

  7. Kubernetes中Service的使用

    目录 简介 1. Service资源定义 1.1 Service Type ClusterIP 无头service NodePort sessionAffinity实现源地址session绑定 简介 ...

  8. kubernetes之service

    service出现的动机 Kubernetes Pods 是有生命周期的.他们可以被创建,而且销毁不会再启动. 如果您使用 Deployment 来运行您的应用程序,则它可以动态创建和销毁 Pod. ...

  9. Kubernetes用Helm安装Ingress并踩一下使用的坑

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Ingress是Kubernetes一个非常重要的Controller,它类似一个路由转发的组件,可以让外界访问Kubern ...

随机推荐

  1. CSS弹性盒模型(flex box)

    本文介绍的是 CSS3 规范中引入的新布局模型:弹性盒模型(flex box).随着响应式用户界面的流行,Web 应用一般都要求适配不同的设备尺寸和浏览器分辨率. 浏览器支持: 弹性盒布局的容器(fl ...

  2. 分布式存储ceph——(4)ceph 添加/删除osd

    一.添加osd: 当前ceph集群中有如下osd,现在准备新添加osd:

  3. neutron二

    第四篇neutron— 网络实践   一.虚拟机获取 ip:   用 namspace 隔离 DHCP 服务   Neutron 通过 dnsmasq 提供 DHCP 服务,而 dnsmasq 通过 ...

  4. Win10开机“提示语音”以及”随机播放音乐”

    1.在桌面建立一个.txt文件 2.把一下代码拷贝进去: RandomizeCreateObject("SAPI.SpVoice").Speak"先生,为你播放一首mus ...

  5. 《java核心技术36讲》学习笔记-------杨晓峰(极客时间)

    非常荣幸作为晓峰哥的同事,之前就看过这篇文章,重写读一遍,再学习学习. 一.开篇词 初级.中级:java和计算机科学基础.开源框架的使用:高级.专家:java io/nio.并发.虚拟机.底层源码.分 ...

  6. openflow packet_out和packet_in分析

    任务目的 1. 掌握OpenFlow交换机发送Packet-in消息过程及其消息格式. 2. 掌握OpenFlow控制器发送Packet-out消息过程及其消息格式. 实验原理 Packet-In 使 ...

  7. 如何优雅地用Redis实现分布式锁?

    转: 如何优雅地用Redis实现分布式锁?   BaiduSpring 01-2500:01 什么是分布式锁 在学习Java多线程编程的时候,锁是一个很重要也很基础的概念,锁可以看成是多线程情况下访问 ...

  8. PHP开发要点与技巧总结(二)

    1 == 'a'.0 == 'a'.97 == '97a'?这里边牵涉到的是默认数据类型转换. // 无输出 if ('0') { echo "'0' is true\n"; } ...

  9. pytest 14 使用自定义标记mark

    标记失败用到的情况是,本身就知道这是失败的例子,所以,不用让他运行,直接跳过.或者是依赖于某个方法,某个方式失败的话,用例直接标记成失败. 标记失败有两种方法,一种是方法内部,一种是方法外部.内部用p ...

  10. 关于AI

    自己看着办吧 http://tieba.baidu.com/p/6008409988?fr=ala0&pstaala=1&tpl=5&fid=93764&isgod=0