Kubernetes Ingress 是 Kubernetes 利用负载均衡、路由、TLS 等技术实现的 API 对外暴露服务的一种方式,因此,Kubernetes Ingress 通常用于服务的 HTTP(S) 流量管理。本篇文章将对 Kubernetes Ingress 进行科普,以及介绍 Ingress 的配置和使用方法。
Kubernetes Ingress 是什么?
Kubernetes Ingress 是 Kubernetes 中用来管理进入集群的外部网络流量的 API 对象。它最常见的使用场景是通过路由将公共 HTTP(S) 流量路由到单个服务或集群中的多个服务上。Ingress 通过将网络流量路由到正确的服务上,使得运维人员可以方便地将公共流量(例如,网页浏览器的请求)定向到符合要求的 Kubernetes 服务上。
Ingress 对象本身不处理流量。它仅是一种配置机制,暴露了多个服务的 IP 或主机主体。生成的配置(通常是代理的配置)由 Kubernetes 通过插件所维护的软件构建,并且由 Kubernetes 代理所重新加载。
Ingress 概述
在 Kubernetes 中创建 Ingress 对象后,Kubernetes 代理(Nginx、Traefik 等)将根据特定的规则路由到集群中的不同 Service 上,每个 Service 又可以进一步映射到 Pod 等具体的后端服务,完成业务逻辑的处理。
其中:
- Ingress Controller:负责将 Ingress 对象中定义的规则应用到对应的服务上,根据负载均衡算法分配请求。
- Ingress Resource:定义公共流量转发的规则。
- Service:提供 K8s 内部各种服务的访问方式,如:ClusterIP、NodePort、LoadBalancer、ExternalName。
- Pod:一个 Kubernetes 中的最小服务单元。
Ingress 的配置
下面是一个简单的 Nginx Ingress 示例,假设我们要将如下 url 请求转发到不同的服务:
https://example.com/hello/ -> hello-service https://example.com/world/ -> world-service
首先,需要创建两个 Deployment 和 Service:
apiVersion: apps/v1kind: Deploymentmetadata:name: hello-deploylabels:app: hellospec:replicas: 1selector:matchLabels:app: hellotemplate:metadata:labels:app: hellospec:containers:- name: helloimage: dockercloud/hello-worldports:- containerPort: 80---apiVersion: v1kind: Servicemetadata:name: hello-servicespec:selector:app: helloports:- name: httpport: 80targetPort: 80
apiVersion: apps/v1kind: Deploymentmetadata:name: world-deploylabels:app: worldspec:replicas: 2selector:matchLabels:app: worldtemplate:metadata:labels:app: worldspec:containers:- name: worldimage: tutum/hello-worldports:- containerPort: 8000---api: v1kind: Servicemetadata:name: world-servicespec:selector:app: worldports:- name: httpport: 80targetPort: 8000
创建完成后,可以运行命令:
kubectl apply -f deployment.yaml -f service.yaml
接下来,创建 Ingress 规则,下面的代码将 example.com/hello 访问路由到 hello-service 的端口 80,将 example.com/world 访问路由到 world-service 的端口 80:
apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:name: test-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:rules:- host: example.comhttp:paths:- path: /hellobackend:serviceName: hello-serviceservicePort: 80- path: /worldbackend:serviceName: world-serviceservicePort: 80
接着,在本地计算机的 /etc/hosts 文件中添加以下行,将 example.com 的 IP 地址解析为本地计算机的 IP 地址。
127.0.0.1 example.com
访问 https://example.com/hello/
访问 https://example.com/world/
总结
在本文中,我们了解了 Kubernetes Ingress,介绍了 Ingress 对象的作用和使用场景,并演示了如何使用 Nginx Ingress 来管理进入集群的外部网络流量。如果你想进一步学习 Kubernetes 或者其他容器技术,那么可以查看 Kubernetes、Docker 的相关官方文档。
