前言
Ingress 是 Kubernetes 中的一种资源对象,用于管理从集群外部到内部服务的 HTTP 和 HTTPS 路由。它提供了灵活的路由功能、SSL/TLS 终止、负载均衡和虚拟主机支持。Ingress 需要一个 Ingress 控制器来实际处理路由,并且可以通过配置不同的控制器来满足不同的需求,目前公司内在使用微服务项目部署的时候也是使用该组件进行的路由配置,这里做下学习记录,了解基本使用和原理即可。
一、Ingress是什么?
Ingress 是 Kubernetes 中的一种资源对象,用于管理从集群外部访问集群内服务的 HTTP 和 HTTPS 路由。它提供了一种灵活的方式来定义如何将外部请求路由到集群内部的服务,通常用于暴露 HTTP 和 HTTPS 服务。
-
为什么使用 Ingress?
在 Kubernetes 中,虽然可以通过 Service 的类型为 NodePort 或 LoadBalancer 将服务暴露给外部,但 Ingress 提供了更高级和灵活的流量管理功能,包括:
- 基于主机名和路径的路由:可以根据请求的 URL 路径和主机名将流量路由到不同的服务。
- TLS/SSL 终止:可以在 Ingress 层处理 SSL/TLS,加密外部到 Ingress 的流量。
- 负载均衡:可以在多个服务之间分配流量。
- 虚拟主机:可以在同一个 IP 地址上处理多个域名(虚拟主机)。
-
Ingress 控制器
Ingress 资源本身并不直接管理流量,它需要一个 Ingress 控制器来实际处理路由。Ingress 控制器是集群中的一个组件,负责根据 Ingress 资源的定义配置负载均衡器或代理服务器。常见的 Ingress 控制器有:- NGINX Ingress Controller
- Traefik
- HAProxy
- Istio Ingress Gateway
我们这里使用了 NGINX Ingress controller。
二、使用步骤
1. 使用 kubectl安装 ingress
➜ ~ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
2. 创建部署资源
- 创建资源
- example-deployment.yaml
定义一个名为 example-deployment 的 Deployment 资源。这个资源会创建并管理一组 Nginx 容器。如下所示:
apiVersion: apps/v1 # API 版本,apps/v1 用于描述 Deployment 资源
kind: Deployment # 资源类型,这里是 Deployment
metadata:
name: example-deployment # Deployment 的名称
spec:
replicas: 2 # 副本数量,这里指定创建 2 个 Pod 实例
selector:
matchLabels:
app: example # 选择器,匹配具有 app=example 标签的 Pod
template:
metadata:
labels:
app: example # Pod 模板的标签,确保 Pod 拥有 app=example 标签
spec:
containers:
- name: nginx # 容器的名称
image: nginx:latest # 使用的 Docker 镜像,这里是最新版本的 nginx
ports:
- containerPort: 80 # 容器暴露的端口,这里是 80 端口
关键点:
其中replicas: 2,这告诉 Kubernetes 部署控制器(Deployment Controller)创建 2 个运行 nginx 容器的 Pod,并确保它们始终处于运行状态。如果其中一个 Pod 出现故障,Deployment 控制器会自动重新创建它,以维持指定的副本数。
- example-service.yaml
这个 Service 会找到所有带有 app=example 标签的 Pod(即 example-deployment 创建的 2 个 Pod),并将请求转发到这些 Pod 的 80 端口。Service 本身是一个负载均衡器,可以将流量均匀分布到所有匹配的 Pod 上。
apiVersion: v1 # API 版本,v1 用于描述 Service 资源
kind: Service # 资源类型,这里是 Service
metadata:
name: example-service # Service 的名称
spec:
selector:
app: example # 选择器,匹配具有 app=example 标签的 Pod
ports:
- protocol: TCP # 使用的协议,这里是 TCP
port: 80 # Service 暴露的端口
targetPort: 80 # 目标容器的端口,Service 会将请求转发到这个端口
- example-ingress.yaml
在 example-ingress.yaml 中,定义了一个 Ingress 对象,它管理外部访问到集群内服务的 HTTP 和 HTTPS 路由。
将访问 example.local 主机名和 / 路径的 HTTP 请求转发到名为 example-service 的 Service 的 80 端口。Ingress 控制器会根据这些规则配置负载均衡器,并处理外部流量的路由。
apiVersion: networking.k8s.io/v1 # API 版本,networking.k8s.io/v1 用于描述 Ingress 资源
kind: Ingress # 资源类型,这里是 Ingress