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 请求转发到不同的服务:

  1. https://example.com/hello/ -> hello-service https://example.com/world/ -> world-service

首先,需要创建两个 Deployment 和 Service:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: hello-deploy
  5. labels:
  6. app: hello
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: hello
  12. template:
  13. metadata:
  14. labels:
  15. app: hello
  16. spec:
  17. containers:
  18. - name: hello
  19. image: dockercloud/hello-world
  20. ports:
  21. - containerPort: 80
  22. ---
  23. apiVersion: v1
  24. kind: Service
  25. metadata:
  26. name: hello-service
  27. spec:
  28. selector:
  29. app: hello
  30. ports:
  31. - name: http
  32. port: 80
  33. targetPort: 80
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: world-deploy
  5. labels:
  6. app: world
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: world
  12. template:
  13. metadata:
  14. labels:
  15. app: world
  16. spec:
  17. containers:
  18. - name: world
  19. image: tutum/hello-world
  20. ports:
  21. - containerPort: 8000
  22. ---
  23. api: v1
  24. kind: Service
  25. metadata:
  26. name: world-service
  27. spec:
  28. selector:
  29. app: world
  30. ports:
  31. - name: http
  32. port: 80
  33. targetPort: 8000

创建完成后,可以运行命令:

  1. kubectl apply -f deployment.yaml -f service.yaml

接下来,创建 Ingress 规则,下面的代码将 example.com/hello 访问路由到 hello-service 的端口 80,将 example.com/world 访问路由到 world-service 的端口 80:

  1. apiVersion: networking.k8s.io/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: test-ingress
  5. annotations:
  6. nginx.ingress.kubernetes.io/rewrite-target: /
  7. spec:
  8. rules:
  9. - host: example.com
  10. http:
  11. paths:
  12. - path: /hello
  13. backend:
  14. serviceName: hello-service
  15. servicePort: 80
  16. - path: /world
  17. backend:
  18. serviceName: world-service
  19. servicePort: 80

接着,在本地计算机的 /etc/hosts 文件中添加以下行,将 example.com 的 IP 地址解析为本地计算机的 IP 地址。

  1. 127.0.0.1 example.com

访问 https://example.com/hello/
访问 https://example.com/world/

总结

在本文中,我们了解了 Kubernetes Ingress,介绍了 Ingress 对象的作用和使用场景,并演示了如何使用 Nginx Ingress 来管理进入集群的外部网络流量。如果你想进一步学习 Kubernetes 或者其他容器技术,那么可以查看 Kubernetes、Docker 的相关官方文档。