一、Master集群网络
master集群的网络比较简单,和通常的负载均衡集群一样。多个节点的apiserver的ip与端口(6443)使用负载均衡的ip与端口。在master/node节点join时均使用此负载均衡的ip与端口,这样就是master节点的集群网络。
- master 节点之间的网络:如果有多个 master 节点,它们之间需要通过 etcd 这个分布式键值存储来保持数据的一致性。etcd 通常使用 Raft 协议来实现高可用和容错性,它需要每个节点之间都能够互相通信,因此需要配置一个可靠的网络连接。
- master 节点和 node 节点之间的网络:master 节点和 node 节点之间需要通过 kube-apiserver 这个组件来进行通信。kube-apiserver 是 master 节点上运行的组件,它提供了 RESTful 的 API 接口,供外部客户端和内部组件访问 k8s 集群的资源和状态。node 节点上运行着 kubelet 和 kube-proxy 这两个组件,它们需要定期向 kube-apiserver 汇报节点和 Pod 的信息,或者接收 kube-apiserver 的指令。因此,需要配置一个安全和稳定的网络连接。
- master 节点和外部客户端之间的网络:外部客户端可以通过 kubectl 命令行工具或者其他方式来访问 master 节点上的 kube-apiserver,从而对 k8s 集群进行管理和操作。为了保证安全性和可访问性,需要配置一个合适的网络地址和端口,并且使用 TLS/SSL 加密通信。
二、Node集群网络
K8s集群对外暴露服务的方式主要有以下几种:
- NodePort:将服务暴露到集群中每个节点的固定端口,客户端可以通过节点的 IP 地址和端口访问服务。
- LoadBalancer:使用云平台的负载均衡器将服务暴露到公网,客户端可以通过公网 IP 地址和端口访问服务。
- Ingress:使用 Ingress 控制器将服务暴露到公网,并提供统一的域名访问。
1、NodePort
NodePort 是 Kubernetes 提供的一种最简单的服务暴露方式。当 Service 的类型为 NodePort 时,Kubernetes 会为该 Service 分配一个固定的端口,该端口会映射到集群中每个节点的相同端口。客户端可以通过集群中任何节点的 IP 地址和端口访问服务。
NodePort 的配置非常简单,只需要在 Service 的 spec 中设置 type 为 NodePort,并指定端口号即可。例如,以下 YAML 定义了一个 NodePort 服务:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30000
该服务将暴露到集群中每个节点的 30000 端口。客户端可以通过集群中任何节点的 IP 地址和 30000 端口访问该服务。
NodePort 的优点是简单易用,可以快速将服务暴露到集群外部。但是,NodePort 也有一定的缺点。
Kubernetes NodePort 类型的服务将在每个节点上暴露一个端口,并分配一个 cluster IP 地址。外部客户端可以通过 <NodeIP>:<NodePort> 来访问该服务。NodePort 类型的服务适用于需要在集群外部访问的服务,例如 Web 服务。
NodePort 类型的服务有以下优点:
- 配置简单,只需要指定 type: NodePort 即可。
- 部署快速,不需要额外的组件。
- 可用于任何类型的服务,包括 HTTP、TCP 和 UDP。
NodePort 类型的服务也有以下缺点:
- 端口范围有限,只能使用 30000-32767 之间的端口。
- 每个端口只能提供一种服务,无法同时提供多个服务。
- 需要手动打开防火墙来允许外部流量进入集群。
2、LoadBalancer
LoadBalancer 是 Kubernetes 提供的一种更高级的服务暴露方式。当 Service 的类型为 LoadBalancer 时,Kubernetes 会在云平台上创建一个负载均衡器(一般付费购买相应的负载均衡产品),并将该负载均衡器绑定到 Service 上。客户端可以通过负载均衡器的公网 IP 地址和端口访问服务。
LoadBalancer 类型的服务有以下优点:
- 具有高可用性,可以保证服务始终可用。
- 可以为多个服务提供负载均衡,提高服务的性能。
- 可以使用任意端口来暴露服务。
- 可以为服务提供 SSL/TLS 保护。
LoadBalancer 类型的服务也有以下缺点:
- 配置复杂,需要指定负载均衡器的类型和配置。
- 部署需要额外的时间和资源。
- 可能需要额外付费,具体取决于负载均衡器的类型。
3、Ingress
Ingress 是 Kubernetes 提供的一种更灵活的服务暴露方式。Ingress 控制器可以将多个 Service 统一到一个域名下,并提供路由规则,使得客户端可以通过统一的域名访问不同的Service。
具体选择哪种方式需要根据实际需求来决定。如果需要快速部署服务,NodePort 是一个不错的选择。如果需要将服务暴露到公网,LoadBalancer 或 Ingress 是更好的选择。
它具有以下优点:
- 灵活性和强大功能:Ingress 可以根据请求的路径、主机名、HTTP 方法等来路由流量到不同的 Service。Ingress 还可以提供负载均衡、SSL/TLS 保护、缓存等功能。
- 易用性:ngress 的配置简单,可以使用 YAML 文件来定义 Ingress 规则。
- 可扩展性:Ingress 可以使用多个 Ingress Controller 来实现负载均衡和高可用性。
Ingress 的缺点:
- 性能开销:Ingress Controller 需要在集群中运行,会消耗一定的资源。
- 复杂性:Ingress 的配置可能比较复杂,需要一定的学习成本。
三、相关问题
1、已经有了Service为什么还需要ingress?
Kubernetes Service 和 Ingress 都是用来将 Kubernetes 服务暴露给外部世界的资源对象。它们之间主要的区别如下:
- Service是Kubernetes 的核心概念,用于将 Pod 集合抽象成一个逻辑单元,并提供一个统一的访问入口。Service 有四种类型:ClusterIP、NodePort、LoadBalancer 和 ExternalName。其中,ClusterIP 类型的 Service 只在集群内部可用,NodePort 类型的 Service 在集群内部和集群外部都可用,LoadBalancer 类型的 Service 在集群外部可用,ExternalName 类型的 Service 指向一个外部主机或域名。
- Ingress 是 Kubernetes 的扩展资源对象,用于为 Service 提供更灵活和强大的路由功能。Ingress 可以根据请求的路径、主机名、HTTP 方法等来路由流量到不同的 Service。Ingress 还可以提供负载均衡、SSL/TLS 保护、缓存等功能。
因此,Service 和 Ingress 可以结合起来使用,以实现更灵活和强大的服务路由功能。例如,可以使用 Service 将 Pod 集合抽象成一个逻辑单元,然后使用 Ingress 为该 Service 提供路由和负载均衡功能。
2、是否可以使用nginx代替ingress?
Ingress 和外部 Nginx 之间的主要区别如下:
- 部署位置:Ingress 是 Kubernetes 中的资源对象,需要在 Kubernetes 集群中部署。外部 Nginx 可以部署在 Kubernetes 集群外部,也可以部署在 Kubernetes 集群内部。
- 管理方式:Ingress 由 Kubernetes 控制器管理,可以使用 Kubernetes API 来管理 Ingress。外部 Nginx 需要通过外部工具或命令来管理。
- 功能:Ingress 提供了更丰富的功能,例如负载均衡、SSL/TLS 保护、缓存等。外部 Nginx 可以通过插件来扩展功能,但可能不如 Ingress 的功能丰富。
Ingress 是 Kubernetes 中更完整的解决方案,它提供了更丰富的功能和更灵活的配置方式。如果您需要使用 Kubernetes 集群中的所有功能,那么使用 Ingress 是更好的选择。
以下是一些使用外部 Nginx 代替 Ingress 的场景:
- 您已经有现有的 Nginx 服务器,并且不想部署 Ingress。
- 您需要使用外部 Nginx 的特定功能,例如特定的插件或配置。
- 您需要将 Kubernetes 服务暴露到外部网络,但不需要使用 Ingress 的所有功能。
3、NodePort vs Ingress
- NodePort是一种简单易用的外部访问方式,它在所有节点上开放一个端口,转发流量到服务。它的优点是不需要额外的IP地址或负载均衡器,但它的缺点是端口范围有限(30000-32767),不安全(容易被攻击),不支持七层协议(无法根据域名或路径路由),并且性能受限于节点数 。
- Ingress是一种强大灵活的外部访问方式,它在多个服务前端,根据路径或域名路由流量到服务。它的优点是可以暴露多个服务,支持HTTP/HTTPS协议,提供高性能和高可用性,并且可以集成各种插件和功能(如SSL/TLS终止、认证、重写、限流等)。但它的缺点是复杂难懂,需要额外的控制器和插件,以及云环境或物理设备提供的负载均衡器 。
四、部署应用的步骤
在 k8s node 集群节点部署的 java 应用,要想向外提供访问服务,需要使用 k8s 的 Service 和 Ingress 这两个资源对象。Service 是一种抽象,它定义了一组 Pod 的逻辑访问方式,可以实现 Pod 之间和 Pod 与外部网络之间的负载均衡和服务发现。Ingress 是一种规则集合,它定义了如何将外部请求路由到集群内部的 Service 上,可以实现域名、路径、SSL/TLS 等高级功能 。具体可以通过以下几个步骤来实现:
- 首先,需要在 node 节点上创建一个 Deployment对象,来定义 java 应用的 Pod 的数量、规格、镜像等信息,并且为每个 Pod 分配一个 IP 地址。
- 然后,需要在 node 节点上创建一个 Service 对象,来定义 java 应用的访问方式,如端口、协议、选择器等信息,并且为 Service 分配一个虚拟 IP 地址。
- 接着,需要在 node 节点上创建一个 Ingress 对象,来定义 java 应用的外部访问规则,如域名、路径、证书等信息,并且为 Ingress 分配一个公网 IP 地址或者域名。
- 最后,需要在 node 节点上安装一个 Ingress Controller 组件,如 nginx-ingress、traefik 等,来根据 Ingress 对象的规则,将外部请求转发到对应的 Service 上。