Kubernetes重要概念:Ingress详解

科技   2024-11-23 09:02   广东  



前面文章写了Service详解Ingress和Service的区别,这边文章详细写一下Ingress对象资源

1 Ingress概述

1.1 什么是Ingress

Ingress 是 Kubernetes 中用于管理外部 HTTP 和 HTTPS 流量的关键资源类型,它能够将这些流量路由到集群内的服务。在微服务架构中,Ingress 允许你使用单个入口点来管理多个服务,同时支持负载均衡、路径重写、TLS 终止等高级功能。

【温馨提示】Ingress目前官方已停止更新。新的功能正在集成至网关 API 中。但大部分场景还是在用Ingress来代理外部流量。

1.2 Ingress 的作用

统一入口:通过一个或多个域名访问集群内部的多个服务。

路径路由:根据 URL 路径,将流量分发给不同的服务。

支持 HTTPS:通过 TLS 终止,增强通信安全性。

负载均衡:在服务的多个 Pod 之间分发流量。

与外部流量网关集成:通过云负载均衡器(如 AWS ALB、GCP Load Balancer)或自定义 Ingress Controller 管理流量。

2. Ingress 基本架构

在 Kubernetes 中,Ingress 的功能依赖 Ingress Controller 实现。没有 Ingress Controller,仅创建 Ingress 资源是无法工作的。

2.1 Ingress 和 Ingress Controller

Ingress 是定义路由规则的资源。

Ingress Controller 是实现这些规则的组件,负责将流量路由到相应的服务。

常见的 Ingress Controller 类型包括:

  • Nginx Ingress Controller
  • Traefik
  • HAProxy
  • Envoy

2.2 Ingress 工作流程

  • 客户端发送 HTTP/HTTPS 请求。
  • 请求到达 Ingress Controller。
  • Ingress Controller 根据 Ingress 规则,将请求路由到集群内部的服务。
  • 服务处理请求,并返回响应。

3 部署Ingress Controller

ingress-nginx项目地址:

https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/index.md

3.1 获取部署yaml文件

wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0-beta.0/deploy/static/provider/cloud/deploy.yaml

我使用的是最新版本

(1)修改镜像地址在每个镜像前面添加docker.m.daocloud.io

(2)将Service发布类型改为NodePort默认是Loadbalancer。

3.2 部署Ingress控制器

kubectl apply -f deploy.yaml

查看pod的情况

kubectl get pod -n ingress-nginx

查看Service情况

kubectl get svc -n ingress-nginx

看到以上信息,说明ingress controller已经安装完成。

4. Ingress 配置结构

Ingress 资源的定义主要包括以下部分:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: liyb.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 80
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80
  tls:
  - hosts:
    - liyb.com
    secretName: tls-secret

5. Ingress 配置详解

5.1 metadata

  • name:Ingress 资源的名称。
  • annotations:用于配置特定 Ingress Controller 的行为。
  • nginx.ingress.kubernetes.io/rewrite-target:路径重写功能。

5.2 spec

  • ingressClassName:指定使用哪个 Ingress Controller 处理此 Ingress 资源。
  • rules:定义域名和路径的路由规则。
  • host:指定域名
  • http.paths:定义 URL 路径的路由规则。
  • path:URL 路径(如 /app1)。
  • pathType
  • Exact:精确匹配路径。
  • Prefix:匹配以此路径为前缀的请求。
  • ImplementationSpecific:由具体 Ingress Controller 决定匹配逻辑。
  • backend:指定后端服务。
  • service.name:目标服务名称。
  • service.port.number:目标服务的端口号。

5.3 tls

  • hosts:启用 HTTPS 的域名列表。
  • secretName:存储 TLS 证书和私钥的 Kubernetes Secret 名称。

6. Ingress Annotations

Annotations 用于配置特定的 Ingress Controller 行为。以下是常见的 Nginx Ingress Controller Annotations:

6.1 流量管理

  • nginx.ingress.kubernetes.io/rewrite-target:     重写 URL 路径。
  • nginx.ingress.kubernetes.io/force-ssl-redirect:     将 HTTP 请求重定向到 HTTPS。
  • nginx.ingress.kubernetes.io/use-regex:     启用正则表达式匹配路径。

6.2 负载均衡

nginx.ingress.kubernetes.io/affinity:     配置会话保持。

值:cookie 表示基于 cookie 的会话保持。

nginx.ingress.kubernetes.io/load-balance:     配置负载均衡策略。

值:round_robin、least_conn、ip_hash。

6.3 安全性

  • nginx.ingress.kubernetes.io/auth-type:     配置基础认证。
  • nginx.ingress.kubernetes.io/whitelist-source-range:     允许的 IP 地址列表。

6.4 性能优化

  • nginx.ingress.kubernetes.io/proxy-read-timeout:     设置后端响应超时时间。
  • nginx.ingress.kubernetes.io/proxy-body-size:     限制请求体大小。

7. Ingress Class

7.1 Ingress Class 简介

IngressClass 是 Kubernetes 1.18 引入的概念,用于支持集群中多种 Ingress Controller。你可以通过 ingressClassName 字段将 Ingress 资源与特定的 Controller 绑定。

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx

7.2 配置 Ingress 使用特定 Class

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: custom-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: custom.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: custom-service
            port:
              number: 80

8. Ingress 使用场景

8.1 单域名多路径路由

通过同一个域名,根据路径将请求分发给不同的服务。

spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /app1
        backend:
          service:
            name: app1-service
            port:
              number: 80
      - path: /app2
        backend:
          service:
            name: app2-service
            port:
              number: 80

8.2 多域名支持

支持多个域名的流量路由。

spec:
  rules:
  - host: app1.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: app1-service
            port:
              number: 80
  - host: app2.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: app2-service
            port:
              number: 80

8.3 启用 HTTPS

配置 Ingress 使用 HTTPS 提供安全访问。

spec:
  tls:
  - hosts:
    - example.com
    secretName: tls-secret

9 常见问题

9.1 Ingress 无法访问

原因:未正确配置 Ingress Controller。

解决:检查 Ingress Controller 是否运行,确保正确绑定 Ingress 资源。

9.2 TLS 证书无效

原因:TLS Secret 配置错误。

解决:确保 Secret 包含有效的证书和私钥。

9.3 外部 IP 无法获取

原因:LoadBalancer 类型的 Service 在本地环境无效。

解决:使用 NodePort 类型或本地开发工具(如 Minikube)分配 IP。


本篇文章主要是侧重详细介绍Ingress对象资源,缺少实战操作,后面的文章会对Ingress的使用实战进行讲解。



END


往期推荐


1

万字长文:K8S命令详解汇总【自用珍藏版】

2

Linux的150个常用命令汇总,运维大神不一定全部掌握!

3

K8S重要概念区分:Ingress 和 Service 的异同点

4

Docker的三种部署方法

5

Nginx常用功能配置

6

K8S证书又过期了?掌握这招,让你轻松享受十年!

运维李哥不背锅
专注于各种运维技术、,分享Linux基础知识,服务器,数据库,云原生和网络安全等相关技术,各种进阶知识等着你,助你成为技术达人!
 最新文章