Kubernetes支持多种将外部流量引入集群的方法。ClusterIP、NodePort和Ingress是三种广泛使用的资源,它们都在路由流量中发挥作用。每个都允许您公开具有一组独特功能和权衡的服务。背景默认情况下,运行在Kubernetes上的服务在自己的Pod中过着孤立的生活,外界无法打扰它们。我们可以通过创建一个Service让容器对外可见。这个“外部世界”可以是整个集群,也可以是整个互联网。服务将流量路由到Pod中的容器。Service是一种在网络上公开Pod的抽象机制。每个服务都有一个类型——ClusterIP、NodePort或LoadBalancer。这些定义了外部流量如何到达服务。但仅靠服务是不够的。有时我们需要将不同域名和URL路径上的流量路由到集群内部,这就需要Ingress的帮助。ClusterIPClusterIP是默认的服务类型。如果未指定Type,则默认为ClusterIP服务类型。ClusterIP提供集群内的网络连接。它通常无法从外部访问。我们将这些ClusterIP服务用于服务之间的内部网络。apiVersion:v1kind:Servicespec:metadata:name:my-serviceselector:app:my-apptype:ClusterIPports:-name:httpport:80targetPort:8080protocol:TCP上面的例子定义了一个ClusterIP服务。流向ClusterIP上的80端口的流量将被转发到您的Pod上的8080端口(targetPort配置项),带有app:my-app标签的Pod将作为服务的可用端点添加到服务中。您可以通过运行kubectlgetsvcmy-service查看分配的IP地址。集群中的其他服务可以使用10.96.0.1:80与该Service管理的服务进行交互。?kubectlgetsvcapp-serviceNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEmy-serviceClusterIP10.96.0.18080:80/TCP63dClusterIP可以使用spec.clusterIp字段手动设置为特定IP地址:spec:type:ClusterIPclusterIp:123.123.123.123NodePortNodePort在固定端口号上公开集群外部的服务,这允许从集群外部访问服务。在集群外,需要使用集群的IP地址和NodePort指定的端口进行访问。创建NodePort服务将打开集群中每个节点上的端口。Kubernetes自动将端口流量路由到它所连接的服务。以下是NodePort服务的示例:apiVersion:v1kind:Servicespec:metadata:name:my-serviceselector:app:my-apptype:NodePortports:-name:httpport:80targetPort:8080protocol:TCPNodePort的定义具有与ClusterIP服务。唯一的区别是类型设置为:“NodePort”。targetPort字段仍然是必需的,因为NodePort由ClusterIP支持。创建NodePortService时,会自动创建一个ClusterIP类型的Service,NodePort会将端口上的流量路由到ClusterIP类型的Service。这就是为什么我们查看下面的NodePortService时,发现它还有一个ClusterIP:?kubectlgetsvcmy-serviceNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEmy-serviceNodePort10.96.44.2448080:30176/TCP56d使用上面的例子创建NodePortService时,Kubernetes会随机分配一个30000-32767范围内的端口作为NodePort端口,但是我们可以通过设置ports.nodePort字段手动指定端口:spec:ports:-name:httpport:80targetPort:8080nodePort:32000protocol:TCP这会将32000端口的流量通过Service最终路由到Pod中容器的8080端口。您可以使用NodePort为开发环境快速设置服务或在其上暴露TCP或UDP服务,但NodePort不是暴露HTTP服务的理想选择,因为它们使用非HTTP标准端口,我们需要使用其他替代方案。IngressIngress其实是和Service完全不同的资源。可以看作是在Service之上的一层代理。Ingress通常用在Service前面,提供HTTP路由配置。它允许我们设置外部URL、基于名称的虚拟主机、SSL和负载平衡。要在Service前面添加Ingress,您的集群中需要一个Ingress-Controller。有多种控制器可供选择。大多数主要的云提供商都有自己的Ingress-Controller与他们的负载平衡基础设施集成。如果是自建K8S集群,通常使用nginx-ingress作为controller,使用NGINX服务器作为反向代理,将流量路由到后续Service。controllerNginx-Ingress的安装部署参考:https://kubernetes.github.io/ingress-nginx/deploy/介绍Ingress实践的文章后面会详细说明。Ingress可以使用Ingress资源类型创建。kubernetes.io/ingress.class注释可让您指明要创建的Ingress类。如果集群中安装了多个入口控制器,这将很有用。也可以在Ingress的不同分类下挂上不同的服务,增加一些高可用。apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:my-ingressannotations:kubernetes.io/ingress.class:nginxspec: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。它允许我们使用声明性语句配置路由和服务。Ingress控制器将提供您的路线并将它们映射到服务。汇总ClusterIP、NodePort、Ingress以将流量路由到集群中的服务。每个都是为不同的用例而设计的。ClusterIP更多是为集群内部服务的通信而设计的,一些暴露在集群外部的TCP和UDP服务适合使用NodePort。但是如果HTTP服务对外暴露,需要提供域名和URL路径路由能力,就需要在Service之上加一层Ingress作为反向代理。可能你对Ingress和Ingress-Controller还有些模糊。后面我会写一篇关于Ingress的实战文章,帮你扫盲。