一、前言¶
本文主要以下几方面介绍k8s中的服务及服务发布:
- 什么是服务
- k8s为什么要发布服务
- k8s如何发布服务
- 如何定义服务
- 服务类型有哪些
- 如何使用Service代理k8s外部服务
- 如何实现多端口服务
- 服务发现有哪些
- 服务代理模式有哪些
- 什么是无头服务
同时主要从以下几方面介绍负载均衡:
- 什么是Ingress
- Ingress的组成
- Ingress Controller 安装
- 使用域名发布 K8s 的服务
- 不配置域名发布服务
- 单域名匹配多Path到不同服务
- 多域名匹配到相同服务
- 基于TLS的Ingress
- 更新Ingress
二、什么是服务¶
Kubernetes 中 Service 是 将运行在一个或一组 Pod上的网络应用程序公开为网络服务的方法。
每个Pod都会获取到它自己的IP地址,但是这些IP地址不总是稳定和可依赖的,这样会导致一个问题:在k8s集群中,如果一组Pod(比如后端的Pod)为其他Pod(比如前端的Pod)提供服务,那么如果他们之间使用Pod的IP地址进行通信,在Pod重建后,将无法再进行连接。于是k8s引用了Service这样的一种抽象概念:逻辑上的一组Pod,即一种可以访问Pod的策略。这一组Pod能够被Service通过标签选择器访问到,之后就可以使用Service进行通信。

假设有一个用作图片处理的backend(后端),运行了3个副本,每个副本具有一个app=backend的标签,这些副本是无状态的,之后创建一个Service指定Selector为app=backend,此时frontend(前端)即可通过这个Service的名称访问backend(后端)。虽然组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。
三、Kubernetes为什么要发布服务¶
当我们通过Replication Controller(简称 RC)、ReplicaSet 、Deployment、StatefulSet 、DaemonSet创建完Pod后,每个Pod都会被分配到一个IP地址,而Pod的IP地址总是不稳定和难依赖的。假设后端的一组Pod为前端的Pod提供服务,此时如果后端的这组Pod异常重建,Pod的IP地址也随之改变,导致它们之间服务无法正常通信。
为了解决上面问题,k8s引入Service这样的概念。这样我们只需访问Service即可,不用关注Pod是否异常重建导致服务无法通信的问题。
四、Kubernetes如何发布服务¶
在介绍k8s如何发布服务前,先对比介绍一下传统架构如何发布服务:
4.1 传统架构服务发布¶

1.用户访问域名,域名解析到代理层,这里的代理层A可能是nginx,也可能是云厂商的负载均衡,比如阿里云的SLB
2.代理层A根据路由策略代理到后端服务器上
3.服务层A和服务层B之间通信可能通过代理层中转进行通信,也可能通过IP+端口号进行通信
4.2 k8s服务发布¶

1.用户访问域名http://www.taobao.com/paycenter/xxx,先到达网关Ingress Controller
2.网关Ingress Controller将请求传递给名为paycenter的Service
3.Service根据标签调取由Deployment创建的Pod