Kubernetes支持多种将外部流量引入集群的方法。ClusterIPNodePortIngress是三种广泛使用的资源,它们都在路由流量中发挥作用。每一个都允许您使用一组独特的功能和折衷方案来公开服务。

背景

默认情况下,Kubernetes上运行的服务都是在自己的 Pod 里过着与世隔绝的生活,外部无法打扰他们。我们可以通过创建  Service 使容器供外部世界可见,这个“外部世界” 即可以整个集群、也可以是整个互联网。

Service将流量路由到Pod内的容器中。Service是一种用于在网络上公开Pod的抽象机制。每个Service有一个类型——ClusterIPNodePortLoadBalancer。这些定义了外部流量如何到达服务。

但是光有Service也不行 ,有时候我们需要将不同域名和URL路径上的流量路由到集群内部,这就需要Ingress帮助才行。

ClusterIP

ClusterIP 是默认的Service类型,不指定Type时默认就是ClusterIP类型的ServiceClusterIP在集群内提供网络连接。它通常无法从外部访问。我们将这些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字段仍然是必需的,因为NodePortClusterIP提供支持。

创建NodePort Service的同时还会自动创建一个ClusterIP 类型的ServiceNodePort会将端口上的流量路由给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 ServiceKubernetes将会从30000-32767这个范围随机分配一个端口作为NodePort端口,不过我们可以通过设置ports.nodePort字段来手动指定端口:

spec:ports:- name: httpport: 80targetPort: 8080nodePort: 32000protocol: TCP

这个会将 32000 端口上的流量通过Service最终路由给Pod里容器的 8080 端口。

您可以使用NodePort快速设置用于开发环境的服务或在其上公开TCPUDP服务,但是对于公开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。它让我们可以使用声明性语句配置路由和ServiceIngress控制器将提供你的路由并将它们映射到服务。

总结

ClusterIPNodePortIngress将流量路由到集群中的服务。每一个都是为不同的用例设计的。ClusterIP更多是为集群内服务的通信而设计,某些向集群外部暴露的TCPUDP服务适合使用NodePort。而如果向外暴露的是HTTP服务,且需要提供域名和URL路径路由能力时则需要在Service上面再加一层Ingress做反向代理才行。

可能你对IngressIngress-Controller还是有一点模糊,后面我在写一篇Ingress的实践文章,给大家扫扫盲。

没有关注的同学,可以关注一下后面的文章动态。

相关阅读

  • 学练结合,快速掌握K8S Service

  • K8S 里常提到的 Pod 是什么

你知道K8S暴露服务的方式有哪些吗?相关推荐

  1. k8s暴露端口的方式

    方式1:clusterIP 此类型会提供一个集群内部的虚拟IP(与pod不在同一网段),以供集群内部的pod之间通信使用.clusterIP也是kubernetes service的默认类型 主要需要 ...

  2. Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务

    一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...

  3. dubbo源码学习三—暴露服务exporter、invoker

    前面我们知道通过自定义标签,我们可以定位到相关标签的解析,同时梳理出三个重要的bean:ServiceBean.ReferenceBean.ConfigCenterBean. 通过Servicebea ...

  4. k8s-(七)暴露服务的三种方式

    上一篇博客总结的项目怎么部署到k8s上运行,但是运行pod ip是docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,外部网络并没有办法访问,并且,pod ip是随时会变的,不是固定的, ...

  5. 如何在Kubernetes中暴露服务访问

    Kubernetes概述 最近的一年,kubernetes的发展如此闪耀,正被越来越多的公司采纳用于生产环境的实践.同时,我们可以在最著名的开发者问答社区StackOverflow上看到k8s的问题数 ...

  6. k8s service服务发现详解:ipvs代理模式、服务类型

    目录 k8s服务发现Service 理解 Service的实现模型 userspace代理模式 iptables代理模式 ipvs代理模式 Service定义 Service配置清单重要字段 创建Cl ...

  7. Kubernetes系列之五:使用yaml文件创建service向外暴露服务

    系列链接 Kubernetes系列之一:在Ubuntu上快速搭建一个集群Demo Kubernetes系列之二:将Slave节点加入集群 Kubernetes系列之三:部署你的第一个应用程序到k8s集 ...

  8. 《docker+k8s微服务容器化实践》笔记2

    5-3 集群环境搭建_A  5-4 集群环境搭建_B  5-5 集群环境搭建_C 这次开始动手操作,首先是Mesos的安装,怎么来安装Mesos.源码:https://github.com/limin ...

  9. Dubbo暴露服务过程

    Dubbo服务暴露机制 前言 在进行服务暴露机制的分析之前,必须谈谈什么是URL,在Dubbo服务暴露过程中URL是无处不在的,贯穿了整个过程. 一般情况下,URL指的是统一资源定位符,标准格式如下: ...

最新文章

  1. DispatcherServlet代码分析及运行过程
  2. 正式发布python版本的年份_飞书首次举办产品发布会,新版本“”正式发布
  3. ip_vs实现分析(2)
  4. 女性开车5大安全驾车好习惯 为您支招
  5. iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图
  6. JavaScript中带有示例的Math.abs()方法
  7. 作者:​王宁(1979-),男,厦门华厦学院副教授、高级工程师。
  8. JS-function-BOM(window,history,location,navigator,screen)
  9. Web服务器的配置与管理(1) IIS的安装与基本设置
  10. 应用机器学习(七):随机森林
  11. CF 2A-Winner
  12. 兰州大学计算机复试英语翻译,2019兰州大学计算机专硕复试回忆
  13. 全网首发:No package ‘usbutils‘ found
  14. 快用苹果助手安装失败_最新建行信用卡调额失败后的抓包详细教程
  15. canva怎么组合_教你使用Canvas合成图片
  16. ssh:connect to host localhost port 22: Connection refused解决方法
  17. iOS App “去评分” 功能的几种实现总结
  18. hdwiki上传附件不显示bug解决办法
  19. 高翔视觉SLAM十四讲课本代码运行
  20. matplotlib绘图颜色大全

热门文章

  1. 权限修饰符(public、protected、default、private)权限验证
  2. Django在根据models生成数据库表时报 __init__() missing 1 required positional argument 'on_d...
  3. C++中栈内存和堆内存
  4. java-什么是实例初始化块?
  5. 如何让HTML在手机上实现直接拨打电话以及发送短信?
  6. iOS vuforia 学习钻研(一)
  7. 异常处理 Exception
  8. 环形buffer缓冲区
  9. python入门-简单的文件备份程序
  10. 怎样为企业挑选正确的EDR解决方案