你知道K8S暴露服务的方式有哪些吗?
Kubernetes
支持多种将外部流量引入集群的方法。ClusterIP
、NodePort
和Ingress
是三种广泛使用的资源,它们都在路由流量中发挥作用。每一个都允许您使用一组独特的功能和折衷方案来公开服务。
背景
默认情况下,Kubernetes
上运行的服务都是在自己的 Pod 里过着与世隔绝的生活,外部无法打扰他们。我们可以通过创建 Service 使容器供外部世界可见,这个“外部世界” 即可以整个集群、也可以是整个互联网。
Service
将流量路由到Pod
内的容器中。Service
是一种用于在网络上公开Pod
的抽象机制。每个Service
有一个类型——ClusterIP
、NodePort
或LoadBalancer
。这些定义了外部流量如何到达服务。
但是光有Service
也不行 ,有时候我们需要将不同域名和URL路径上的流量路由到集群内部,这就需要Ingress
帮助才行。
ClusterIP
ClusterIP 是默认的Service
类型,不指定Type
时默认就是ClusterIP
类型的Service
。ClusterIP
在集群内提供网络连接。它通常无法从外部访问。我们将这些ClusterIP Service
用于服务之间的内部网络。
apiVersion: v1
kind: Service
spec:metadata:name: my-serviceselector:app: my-apptype: ClusterIPports:- name: httpport: 80targetPort: 8080protocol: TCP
上面的示例定义了一个ClusterIP Service
。到ClusterIP
上端口 80 的流量将转发到你的Pod
上的端口 8080 (targetPort配置项),携带 app: my-app
标签的 Pod 将被添加到 Service
中作为作为服务的可用端点。
可以通过运行 kubectl get svc my-service
查看分配的 IP 地址。集群中的其他服务可以使用 10.96.0.1:80 与这个的 Service 管控的服务进行交互。
➜ kubectl get svc app-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service ClusterIP 10.96.0.1 <none> 8080:80/TCP 63d
可以使用 spec.clusterIp
字段手动将 ClusterIP 设置为特定 IP 地址:
spec:type: ClusterIPclusterIp: 123.123.123.123
NodePort
NodePort
在固定端口号上公开向集群外部暴露服务,它允许从集群外部访问该服务,在集群外部需要使用集群的 IP 地址和NodePort
指定的端口才能访问。创建NodePort Service
将在集群中的每个Node
上开放该端口。Kubernetes
会自动将端口流量路由到它所连接的服务。下面是一个 NodePort Service
的示例:
apiVersion: v1
kind: Service
spec:metadata:name: my-serviceselector:app: my-apptype: NodePortports:- name: httpport: 80targetPort: 8080protocol: TCP
NodePort
的定义与ClusterIP Service
具有相同的属性。唯一的区别是把类型设置成了:"NodePort"。targetPort
字段仍然是必需的,因为NodePort
由ClusterIP
提供支持。
创建NodePort Service
的同时还会自动创建一个ClusterIP
类型的Service
,NodePort
会将端口上的流量路由给ClusterIP
类型的 Service。
这也就是为什么下面我们查看NodePort Service
时发现他也是有 ClusterIP 的原因:
➜ kubectl get svc my-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service NodePort 10.96.44.244 <none> 8080:30176/TCP 56d
使用上述例子创建NodePort Service
,Kubernetes
将会从30000-32767这个范围随机分配一个端口作为NodePort
端口,不过我们可以通过设置ports.nodePort
字段来手动指定端口:
spec:ports:- name: httpport: 80targetPort: 8080nodePort: 32000protocol: TCP
这个会将 32000 端口上的流量通过Service
最终路由给Pod
里容器的 8080 端口。
您可以使用NodePort
快速设置用于开发环境的服务或在其上公开TCP
或UDP
服务,但是对于公开HTTP
服务来说NodePort
不是一个的理想选择,因为其使用的都是非HTTP
标准的端口,我们需要使用其他替代方案。
Ingress
Ingress
实际上是与Service
完全不同的资源,算是Service
上面的一层代理,通常在 Service
前使用Ingress
来提供HTTP
路由配置。它让我们可以设置外部 URL、基于域名的虚拟主机、SSL 和负载均衡。
给Service
前面加Ingress
,你的集群中需要有Ingress-Controller
才行。有多种控制器可供选择。大多数主要的云提供商都有自己的Ingress-Controller
,与他们的负载平衡基础设施相集成。如果是自建K8S集群,通常使用nginx-ingress
作为控制器,它使用NGINX
服务器作为反向代理来把流量路由给后面的Service
。
关于控制器Nginx-Ingress的安装部署参考:https://kubernetes.github.io/ingress-nginx/deploy/ 后面介绍
Ingress
实践的文章也会再细说。
可以使用Ingress
资源类型创建Ingress
。kubernetes.io/ingress.class 注释可让你指明正在创建的Ingress
分类。如果集群里安装了多个Ingress-Controller
这将很有用,也可以将不同的Service
分别挂在不同分类的Ingress
下面,增加一些高可用性。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: my-ingressannotations:kubernetes.io/ingress.class: nginx
spec:rules:- host: example.comhttp:paths:- path: /backend:serviceName: my-serviceservicePort: 80- host: another-example.comhttp:paths:- path: /backend:serviceName: second-serviceservicePort: 80
上面定义了两个Ingress
端点。第一个主机规则将 example.com 流量路由到my-service
服务上的端口 80。第二条规则将 another-example.com 流量路由到second-service
。
如果想使用 HTTPs
访问服务,可以通过在Ingress
规范中设置tls
字段来配置 SSL
:
spec:tls:- hosts:- example.com- secretName: my-secret
不过前提是在集群中需要通过Secret
对象配置这些域名的证书信息。
当需要处理来自多个域名 和 URL 路径的流量时,应该使用Ingress
。它让我们可以使用声明性语句配置路由和Service
。Ingress
控制器将提供你的路由并将它们映射到服务。
总结
ClusterIP
、NodePort
、Ingress
将流量路由到集群中的服务。每一个都是为不同的用例设计的。ClusterIP
更多是为集群内服务的通信而设计,某些向集群外部暴露的TCP
和UDP
服务适合使用NodePort
。而如果向外暴露的是HTTP
服务,且需要提供域名和URL
路径路由能力时则需要在Service
上面再加一层Ingress
做反向代理才行。
可能你对Ingress
,Ingress-Controller
还是有一点模糊,后面我在写一篇Ingress
的实践文章,给大家扫扫盲。
没有关注的同学,可以关注一下后面的文章动态。
相关阅读
学练结合,快速掌握K8S Service
K8S 里常提到的 Pod 是什么
你知道K8S暴露服务的方式有哪些吗?相关推荐
- k8s暴露端口的方式
方式1:clusterIP 此类型会提供一个集群内部的虚拟IP(与pod不在同一网段),以供集群内部的pod之间通信使用.clusterIP也是kubernetes service的默认类型 主要需要 ...
- Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务
一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...
- dubbo源码学习三—暴露服务exporter、invoker
前面我们知道通过自定义标签,我们可以定位到相关标签的解析,同时梳理出三个重要的bean:ServiceBean.ReferenceBean.ConfigCenterBean. 通过Servicebea ...
- k8s-(七)暴露服务的三种方式
上一篇博客总结的项目怎么部署到k8s上运行,但是运行pod ip是docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,外部网络并没有办法访问,并且,pod ip是随时会变的,不是固定的, ...
- 如何在Kubernetes中暴露服务访问
Kubernetes概述 最近的一年,kubernetes的发展如此闪耀,正被越来越多的公司采纳用于生产环境的实践.同时,我们可以在最著名的开发者问答社区StackOverflow上看到k8s的问题数 ...
- k8s service服务发现详解:ipvs代理模式、服务类型
目录 k8s服务发现Service 理解 Service的实现模型 userspace代理模式 iptables代理模式 ipvs代理模式 Service定义 Service配置清单重要字段 创建Cl ...
- Kubernetes系列之五:使用yaml文件创建service向外暴露服务
系列链接 Kubernetes系列之一:在Ubuntu上快速搭建一个集群Demo Kubernetes系列之二:将Slave节点加入集群 Kubernetes系列之三:部署你的第一个应用程序到k8s集 ...
- 《docker+k8s微服务容器化实践》笔记2
5-3 集群环境搭建_A 5-4 集群环境搭建_B 5-5 集群环境搭建_C 这次开始动手操作,首先是Mesos的安装,怎么来安装Mesos.源码:https://github.com/limin ...
- Dubbo暴露服务过程
Dubbo服务暴露机制 前言 在进行服务暴露机制的分析之前,必须谈谈什么是URL,在Dubbo服务暴露过程中URL是无处不在的,贯穿了整个过程. 一般情况下,URL指的是统一资源定位符,标准格式如下: ...
最新文章
- DispatcherServlet代码分析及运行过程
- 正式发布python版本的年份_飞书首次举办产品发布会,新版本“”正式发布
- ip_vs实现分析(2)
- 女性开车5大安全驾车好习惯 为您支招
- iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图
- JavaScript中带有示例的Math.abs()方法
- 作者:​王宁(1979-),男,厦门华厦学院副教授、高级工程师。
- JS-function-BOM(window,history,location,navigator,screen)
- Web服务器的配置与管理(1) IIS的安装与基本设置
- 应用机器学习(七):随机森林
- CF 2A-Winner
- 兰州大学计算机复试英语翻译,2019兰州大学计算机专硕复试回忆
- 全网首发:No package ‘usbutils‘ found
- 快用苹果助手安装失败_最新建行信用卡调额失败后的抓包详细教程
- canva怎么组合_教你使用Canvas合成图片
- ssh:connect to host localhost port 22: Connection refused解决方法
- iOS App “去评分” 功能的几种实现总结
- hdwiki上传附件不显示bug解决办法
- 高翔视觉SLAM十四讲课本代码运行
- matplotlib绘图颜色大全
热门文章
- 权限修饰符(public、protected、default、private)权限验证
- Django在根据models生成数据库表时报 __init__() missing 1 required positional argument 'on_d...
- C++中栈内存和堆内存
- java-什么是实例初始化块?
- 如何让HTML在手机上实现直接拨打电话以及发送短信?
- iOS vuforia 学习钻研(一)
- 异常处理 Exception
- 环形buffer缓冲区
- python入门-简单的文件备份程序
- 怎样为企业挑选正确的EDR解决方案