Shaw0xyz 发表于 2024-7-6 15:45:40

k8s 对外服务之 Ingress

本帖最后由 Shaw0xyz 于 2024-7-6 16:12 编辑

1. 引言

在 Kubernetes (k8s) 集群中,如何将内部服务暴露给外部用户是一个重要的问题。Ingress 是 k8s 提供的一种资源,用于管理外部访问集群内部服务的方式。本文将详细介绍 Ingress 的概念、工作原理、配置方法以及常见的使用场景。

2. Ingress 概述

Ingress 是 k8s 中的一种 API 对象,用于管理外部 HTTP 和 HTTPS 访问集群内部服务的路由规则。与 NodePort 和 LoadBalancer 不同,Ingress 提供了更为灵活和丰富的功能,如基于域名的虚拟主机、多路径路由和 TLS 支持。

3. Ingress 的工作原理

3.1 Ingress 控制器

Ingress 资源本身并不实际处理流量,需要一个 Ingress 控制器来执行路由规则。Ingress 控制器是一个运行在 k8s 集群中的应用程序,它监控 Ingress 资源的变化,并相应地配置底层的负载均衡器或代理服务器(如 NGINX、Traefik 等)。

3.2 路由规则

Ingress 资源定义了流量路由的规则,包括主机名、路径和目标服务。一个简单的 Ingress 配置示例如下:

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

在上述配置中,所有对 `example.com` 的请求都会被转发到 `example-service` 服务的 80 端口。

4. 配置 Ingress

4.1 安装 Ingress 控制器

首先需要在集群中安装一个 Ingress 控制器。以 NGINX Ingress 控制器为例,可以使用以下命令进行安装:

    kubectl apply -f https://raw.githubusercontent.co ... r/cloud/deploy.yaml

4.2 创建 Ingress 资源

创建一个 Ingress 资源以定义路由规则。以下是一个示例配置文件:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
      annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: myapp.example.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

该配置将 `myapp.example.com/app1` 的请求路由到 `app1-service`,将 `myapp.example.com/app2` 的请求路由到 `app2-service`。

4.3 配置 TLS

为 Ingress 配置 TLS 可以确保传输安全性。首先需要创建一个包含证书和密钥的 Secret:

    kubectl create secret tls my-tls-secret --key tls.key --cert tls.crt

然后在 Ingress 配置中引用该 Secret:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: secure-ingress
    spec:
      tls:
      - hosts:
      - secure.example.com
      secretName: my-tls-secret
      rules:
      - host: secure.example.com
      http:
          paths:
          - path: /
            pathType: Prefix
            backend:
            service:
                name: secure-service
                port:
                  number: 443

5. 常见问题解答

5.1 为什么我的 Ingress 配置没有生效?

确保 Ingress 控制器已经正确安装并运行,同时检查 Ingress 资源的配置是否正确,特别是主机名和路径。

5.2 如何调试 Ingress 配置?

可以通过查看 Ingress 控制器的日志来调试问题。例如,对于 NGINX Ingress 控制器,可以使用以下命令查看日志:

    kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

5.3 可以使用 Ingress 管理非 HTTP/HTTPS 流量吗?

Ingress 主要用于管理 HTTP 和 HTTPS 流量。如果需要管理其他类型的流量,可以使用 Service 类型的 LoadBalancer 或 NodePort。

6. 结论

Ingress 是 Kubernetes 提供的一种强大且灵活的外部流量管理工具。通过理解 Ingress 的工作原理和配置方法,用户可以更高效地管理集群中的外部访问请求,并为微服务架构提供可靠的流量路由解决方案。

希望本文对你在实际使用 Ingress 时有所帮助,如有其他问题,欢迎讨论交流。






/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & Linux ...

~互撩~ TG: @Shaw_0xyz
页: [1]
查看完整版本: k8s 对外服务之 Ingress