在 Kubernetes (K8s) 中,Service、Ingress 和 NginxIngress 都是与网络相关的资源,帮助我们暴露和管理访问服务的方式。理解它们的功能和相互关系,有助于我们更好地部署和管理基于 Kubernetes 的应用。
Service 是 Kubernetes 中的一个资源,它定义了如何访问一个或多个运行中的 Pods。Service 主要用于提供网络服务,充当 Kubernetes 集群内的负载均衡器,确保请求可以被转发到正确的 Pod 上。
Service 的类型:
Ingress 是 Kubernetes 中的一种 API 资源,提供 HTTP 和 HTTPS 的路由功能,允许外部访问集群中的服务。它定义了基于 URL 路径或主机名的路由规则,将请求转发到对应的 Service。
Ingress 与 Service 配合使用,通过配置不同的路由规则,可以实现将外部请求根据不同的 URL 路径或主机名转发到不同的服务。
Ingress 特性:
NginxIngress 是 Nginx 官方提供的一个 Kubernetes Ingress Controller,它允许你使用 Nginx 来处理 Ingress 资源中的流量。Ingress Controller 是一个 Pod,它监听 Kubernetes 集群中的 Ingress 资源,基于定义的路由规则将流量转发到相应的 Service。
在 Kubernetes 集群中使用 Ingress Controller 作为流量的反向代理,NginxIngress Controller 是常用的一种方式。
NginxIngress 的作用:
Service、Ingress 和 NginxIngress 的关系Service 是 Kubernetes 内部的服务暴露机制,允许其他 Pods 或外部客户端访问服务。Ingress 是一个资源,帮助将外部的 HTTP(S) 请求路由到 Kubernetes 内部的 Service。NginxIngress 是一个 Ingress Controller,负责处理 Ingress 资源并将流量转发到相应的 Service。简单来说,Ingress 是定义 HTTP/HTTPS 路由规则的资源,而 Ingress Controller(如 NginxIngress)则是实际处理这些路由请求的组件,Service 则是具体的服务,它最终处理请求。
www.test1.com 和 www.test2.com 访问部署在 Kubernetes 中的 Java 服务假设你有两个域名 www.test1.com 和 www.test2.com,并且这些域名需要访问部署在 Kubernetes 集群中的不同 Java 服务,可以通过 Ingress 和 NginxIngress 来实现。具体步骤如下:
首先,确保 Kubernetes 集群中已经部署了 Nginx Ingress Controller。可以通过以下命令部署 Nginx Ingress:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml这会安装一个默认的 Nginx Ingress Controller,负责处理所有 Ingress 资源的流量。
假设你有两个 Java 服务,每个服务暴露在不同的端口和 Service 上。首先,为这些服务创建相应的 Service 资源。例如:
apiVersion: v1
kind: Service
metadata:
name: service1
spec:
selector:
app: java-app-1
ports:
- protocol: TCP
port: 80
targetPort: 8080apiVersion: v1
kind: Service
metadata:
name: service2
spec:
selector:
app: java-app-2
ports:
- protocol: TCP
port: 80
targetPort: 8080然后,创建一个 Ingress 资源,定义如何根据域名路由到不同的服务。以下是一个例子:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: www.test1.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- host: www.test2.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service2
port:
number: 80这个 Ingress 资源定义了两个路由规则:
www.test1.com 时,将流量转发到 service1。www.test2.com 时,将流量转发到 service2。确保你将 www.test1.com 和 www.test2.com 的 DNS 记录指向 Kubernetes 集群的外部负载均衡器(如果你使用的是云服务提供商的负载均衡器)或 Ingress Controller 的 IP 地址。
你可以通过以下命令查看 Ingress Controller 的外部 IP 地址:
kubectl get svc -n ingress-nginx找到 Nginx Ingress Controller 的外部 IP,并为两个域名配置 DNS 记录,指向这个 IP。
配置完 DNS 后,你可以通过浏览器访问 www.test1.com 和 www.test2.com,它们应该能够根据域名路由到不同的 Java 服务。
ClusterIP、NodePort、LoadBalancer)来控制访问范围。Service。通过合理配置 Service、Ingress 和 Ingress Controller,你可以实现基于域名的请求路由,从而将不同的域名访问请求引导到 Kubernetes 中的不同服务。在本例中,www.test1.com 和 www.test2.com 被路由到部署在 Kubernetes 中的两个不同 Java 服务。