详解kubernetes五种暴露服务的方式
部署完服务终将是为了访问,那么kubernetes中service和ingress都可以将集群内部的服务能够支持外部访问。service可以让一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能;ingress通过对集群中服务的外部访问进行管理,也可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
概述
这里说明如何将k8s内部服务暴露给外部服务访问的方式,宏观来说有五种,而k8s官网上讲解的是4+1种,这里探讨服务的暴露方式,而不是service和ingress的区别,分别是
ClusterIPNodePortLoadBalancerExternalNameIngress
ClusterIP
介绍
ClusterIP,顾名思义,集群IP。它的作用就是为了能够让其所属Pod能够负载均衡且需要有一个虚拟IP(VIP)提供给IPtables。由于VIP没有挂接到网络设备,所以不能直接访问。
ClusterIP 是Service的默认类型,如果没有指定Service的type,默认就是ClusterIP

典型的ClusterIP 服务的配置文件示例
apiVersion: v1
kind: Service
metadata:
name: my-internal-service
spec:
type: ClusterIP
selector:
app: mynginx
ports:
- name: http
protocol: TCP
port: 80
NodePort
介绍
如果想要让服务可以在k8s外部访问。NodePort最原始的方式。还是使用图的方式来说明

NodePort会在所有节点(图示中的VM)上开放一个特定端口(图示中的30007),任何发送到该端口的流量都被转发到对应服务(图示中的Service)
典型的NodePort 服务的配置文件示例
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
## 当type为NodePort时,如果不指定nodePort的值,系统将选择一个随机端口。大多数时候应该让k8s来选择端口,用户自己来选择可用端口代价太大
nodePort: 30007
使用场景
这种方式有两个缺点:
- 每个端口只能是一种服务
- 端口范围只能是 30000-32767(k8s规定)
所以在生产环境上不推荐使用这种方式暴露服务。更多的是在demo应用或临时应用上使用这种方式
LoadBalancer
介绍
LoadBalancer 服务是暴露服务到因特网的标准方式。如在GKE(Google Kubernetes Engine) 上,会启动一个Network Load Balancer[2],它将跟你一个单独的IP地址。所有通往指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,如 HTTP,TCP,UDP,Websocket,gRPC 或其它种类

使用场景
此方式最大的缺点是,每一个用LoadBalancer暴露的服务都需要付费
ExternalName
介绍
ExternalName可以通过返回 CNAME 记录和对应值,实现在kubenetes集群内部调用外部的服务。并且不用创建代理。

使用场景
希望在Kubernetes集群内,调用外部的服务。如DB、没迁移到Kubernetes上的应用。使用ExternalName面向的场景大多是临时调用,建议使用完后,删除或恢复为原配置
Ingress(envoy)
介绍
Ingress其实并不是一种服务类型,也就是说它并不是服务(Service),也和Service中Type属性无关。但它可以充当集群的入口点,它可以将路由规则整合到一个资源中,并扮演“智能路由”的角色。

但是这种图比较不容易理解。举一个常见的例子,实现外网的流量根据不同的路由地址会转发到不同的service上

公网IP为175.137.133.21,设定的规则如下:
- 外网路由
175.137.133.21:443/order映射到内网192.168.1.100:80 - 外网路由
175.137.133.21:443/logistics映射到内网192.168.1.110:80 - 外网路由
175.137.133.21:443/goods映射到内网192.168.1.120:80
当然也可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力。
使用场景
Ingress 可能是暴露服务的最强大方式,但同时也是最复杂的。Ingress 控制器有各种类型,包括 Google Cloud Load Balancer, Nginx,Contour,Istio等等。
如果想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议,那么Ingress 就是最有用的。同时Ingress还支持很多特性,如 SSL、认证等
详解kubernetes五种暴露服务的方式的更多相关文章
- css详解position五种属性用法及其含义
position(定位) position - 作为css属性三巨头(position.display.float)之一,它的作用是用来决定元素在文档中的定位方式.其属性值有五种,分别是 - stat ...
- Redis数据结构详解,五种数据结构分分钟掌握
redis数据类型分为:字符串类型.散列类型.列表类型.集合类型.有序集合类型.redis这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作.原子操作:最小的操作单位,不能 ...
- Keepalived详解(五):Keepalived集群中MASTER和BACKUP角色选举策略【转】
一.Keepalived集群中MASTER和BACKUP角色选举策略 在keepalived集群中,其实并没有严格意义上的主.备节点,虽然可以在keepalived配置文件中设置state选项为MAS ...
- Redis详解(五)——主从复制
Redis详解(五)--主从复制 面临问题 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的.而数据是最重要的,如果你不在乎,基本上也就不 ...
- 详解工作流框架Activiti的服务架构和组件
摘要:通过这篇文章,可以对工作流有一个基本的认识,为后续工作流框架Activiti的学习打下坚实的基础. 本文分享自华为云社区<BPMN工作流的基本概念!详解工作流框架Activiti的服务架构 ...
- SSE技术详解:一种全新的HTML5服务器推送事件技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- 前端技术之_CSS详解第五天
前端技术之_CSS详解第五天 一.行高和字号 1.1 行高 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. <!DOCTYPE html ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
- spring事务详解(五)总结提高
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...
- MySql详解(五)
MySql详解(五) MySql库的管理 一.创建库 create database [if not exists] 库名[ character set 字符集名]; 二.修改库 alter data ...
随机推荐
- AspNetCore中 使用 Grpc 简单Demo
为什么要用Grpc 跨语言进行,调用服务,获取跨服务器调用等 目前我的需要使用 我的抓取端是go 写的 查询端用 Net6 写的 导致很多时候 我需要把一些临时数据写入到 Redis 在两个服务器进行 ...
- Dubbo 02: 直连式
直连式 需要用到两个相互独立的maven的web项目 项目1:o1-link-userservice-provider 作为服务的提供者 项目2:o2-link-consumer 作为使用服务的消费者 ...
- C语言------数据类型与输入输出
仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2 .实训目的及要求 3 .源代码及运行截图 4 .小结 1 .实训名称 实训2: ...
- 齐博X1-栏目的调用5
本节继续说明栏目的调用父级.同级.子级三层的栏目调用 父级.同级.子级三层的栏目调用 fun('sort@family',$fid,'cms') 比如下面栏目10利用这个函数,就可以调用出 父级9 同 ...
- C# 7.0 添加和增强的功能【基础篇】
C# 7.0 版是与 Visual Studio 2017 一起发布. 虽然该版本继承和发展了C# 6.0,但不包含编译器即服务. 一.out 变量 以前我们使用out变量必须在使用前进行声明,C# ...
- 三、docker镜像管理
一.docker镜像管理 1.1.镜像搜索-search 从docker镜像仓库模糊搜索镜像 用法: docker search 镜像关键字 [root@zutuanxue ~]# docker se ...
- k8s运维之pod排错
k8s运维之pod排错 K8S是一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernetes的目标是让部署容器化变得简单并且高效 K8S的核心优势: 1,基于yaml文件实现容器的自动创建 ...
- mybatis-获取参数值的方式
MyBatis获取参数值的两种方式(重点) MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串 ...
- excel公式与快捷操作
将首行的公式,运用到这一整列 1.选中要输入公式的第一个单元格,SHIFT+CTRL+方向键下,在编辑栏中输入公式,按下CTRL+回车: 2.先输入要填充的公式,按下SHIFT+CTRL+方向键下,再 ...
- Oracle设置内存参数后,启动数据库报ORA-00843 ORA-00849解决办法
Oracle安装完成后,调优内存参数(MEMORY_TARGET和MEMORY_MAX_TARGET设置为0),重启数据库,报ORA-00843 ORA-00849错误. 根据提示,不应将MEMORY ...