温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么简单入门Kubernetes Ingress

发布时间:2021-10-12 14:24:20 来源:亿速云 阅读:142 作者:柒染 栏目:云计算

怎么简单入门Kubernetes Ingress

1. 什么是Kubernetes Ingress?

Kubernetes Ingress 是一种用于管理外部访问 Kubernetes 集群中服务的 API 对象。它充当了集群的入口点,允许你将外部流量路由到集群内部的服务。与传统的 LoadBalancer 或 NodePort 服务不同,Ingress 提供了更高级的路由功能,如基于主机名或路径的路由、TLS 终止等。

1.1 Ingress 的作用

  • 路由流量:Ingress 可以根据请求的主机名或路径将流量路由到不同的服务。
  • TLS 终止:Ingress 可以处理 HTTPS 请求,并在集群内部使用 HTTP。
  • 负载均衡:Ingress 可以将流量分发到多个后端服务实例,实现负载均衡。
  • 简化外部访问:通过 Ingress,你可以使用一个统一的入口点来管理多个服务的访问。

1.2 Ingress 与 Service 的区别

  • Service:Kubernetes Service 用于在集群内部或外部暴露一组 Pod。Service 可以是 ClusterIP、NodePort 或 LoadBalancer 类型。Service 通常用于集群内部的通信或简单的外部访问。
  • Ingress:Ingress 是一个更高级的抽象,它允许你基于 HTTP/HTTPS 请求的主机名或路径进行路由。Ingress 通常与 Ingress Controller 一起使用,后者负责实际处理流量。

2. Ingress 的基本概念

2.1 Ingress 资源

Ingress 资源是 Kubernetes 中的一种 API 对象,用于定义如何将外部流量路由到集群内部的服务。Ingress 资源通常包含以下信息:

  • 主机名:用于匹配请求的主机名。
  • 路径:用于匹配请求的路径。
  • 后端服务:指定流量应该路由到的 Kubernetes 服务。
  • TLS 配置:用于配置 HTTPS 的证书和密钥。

2.2 Ingress Controller

Ingress Controller 是实际处理 Ingress 资源的组件。它负责监听 Ingress 资源的变化,并根据配置的路由规则将流量转发到相应的后端服务。常见的 Ingress Controller 包括:

  • NGINX Ingress Controller:基于 NGINX 的 Ingress Controller,支持丰富的路由功能。
  • Traefik:一个现代的 HTTP 反向代理和负载均衡器,支持自动发现和动态配置。
  • HAProxy Ingress Controller:基于 HAProxy 的 Ingress Controller,适用于高并发场景。
  • Istio Gateway:Istio 服务网格的一部分,提供了更高级的流量管理功能。

2.3 Ingress Class

Ingress Class 是 Kubernetes 1.18 引入的一个新概念,用于区分不同的 Ingress Controller。通过 Ingress Class,你可以在同一个集群中运行多个 Ingress Controller,并将不同的 Ingress 资源分配给不同的 Ingress Controller。

3. 如何部署 Ingress Controller

在开始使用 Ingress 之前,你需要先部署一个 Ingress Controller。以下以 NGINX Ingress Controller 为例,介绍如何部署 Ingress Controller。

3.1 部署 NGINX Ingress Controller

  1. 安装 Helm:Helm 是 Kubernetes 的包管理工具,可以简化 Ingress Controller 的安装过程。
   curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  1. 添加 Helm 仓库
   helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
   helm repo update
  1. 安装 NGINX Ingress Controller
   helm install ingress-nginx ingress-nginx/ingress-nginx
  1. 验证安装
   kubectl get pods -n default -l app.kubernetes.io/name=ingress-nginx

如果看到类似以下的输出,说明 NGINX Ingress Controller 已经成功部署:

   NAME                                        READY   STATUS    RESTARTS   AGE
   ingress-nginx-controller-7c6d8f5b5c-9q8q9   1/1     Running   0          1m

3.2 配置 Ingress Class

如果你在集群中运行了多个 Ingress Controller,可以通过 Ingress Class 来区分它们。以下是一个简单的 Ingress Class 配置示例:

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

在 Ingress 资源中,你可以通过 ingressClassName 字段指定使用哪个 Ingress Class:

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

4. 创建 Ingress 资源

在部署了 Ingress Controller 之后,你可以通过创建 Ingress 资源来定义路由规则。以下是一个简单的 Ingress 资源示例:

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

4.1 解释 Ingress 资源

  • metadata.name:Ingress 资源的名称。
  • metadata.annotations:用于配置 Ingress Controller 的特定行为。例如,nginx.ingress.kubernetes.io/rewrite-target 用于重写请求路径。
  • spec.rules:定义路由规则。每个规则可以包含一个主机名和多个路径。
  • spec.rules.host:匹配请求的主机名。
  • spec.rules.http.paths:定义路径和后端服务的映射。
  • spec.rules.http.paths.path:匹配请求的路径。
  • spec.rules.http.paths.backend.service.name:指定流量应该路由到的 Kubernetes 服务。
  • spec.rules.http.paths.backend.service.port.number:指定服务的端口号。

4.2 应用 Ingress 资源

将上述 YAML 文件保存为 example-ingress.yaml,然后使用 kubectl 命令应用该资源:

kubectl apply -f example-ingress.yaml

4.3 验证 Ingress 资源

你可以使用以下命令查看 Ingress 资源的状态:

kubectl get ingress

如果看到类似以下的输出,说明 Ingress 资源已经成功创建:

NAME             CLASS   HOSTS         ADDRESS   PORTS   AGE
example-ingress  nginx   example.com             80      1m

5. 配置 TLS 终止

Ingress 还支持配置 TLS 终止,以便处理 HTTPS 请求。以下是一个配置 TLS 的 Ingress 资源示例:

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

5.1 创建 TLS 证书

在配置 TLS 之前,你需要创建一个包含 TLS 证书和密钥的 Kubernetes Secret。以下是一个创建 TLS Secret 的示例:

kubectl create secret tls example-tls-secret --cert=path/to/tls.crt --key=path/to/tls.key

5.2 应用 TLS Ingress 资源

将上述 YAML 文件保存为 example-tls-ingress.yaml,然后使用 kubectl 命令应用该资源:

kubectl apply -f example-tls-ingress.yaml

5.3 验证 TLS 配置

你可以使用以下命令查看 Ingress 资源的状态:

kubectl get ingress

如果看到类似以下的输出,说明 TLS 配置已经成功应用:

NAME                 CLASS   HOSTS         ADDRESS   PORTS     AGE
example-tls-ingress  nginx   example.com             80, 443   1m

6. 高级路由配置

Ingress 还支持更高级的路由配置,如基于路径的重写、请求头修改等。以下是一些常见的配置示例。

6.1 路径重写

路径重写允许你将请求路径重写为不同的路径。以下是一个路径重写的示例:

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

在这个示例中,所有访问 /old-path 的请求都会被重写为 /new-path

6.2 请求头修改

你可以通过 Ingress 修改请求头,以便在后端服务中使用。以下是一个请求头修改的示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-header-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header X-Custom-Header "custom-value";
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

在这个示例中,所有请求都会添加一个 X-Custom-Header 请求头,值为 custom-value

7. 常见问题与解决方案

7.1 Ingress 资源未生效

如果 Ingress 资源未生效,可能是以下原因:

  • Ingress Controller 未正确部署:检查 Ingress Controller 的 Pod 是否正常运行。
  • Ingress Class 配置错误:确保 Ingress 资源中指定的 Ingress Class 与 Ingress Controller 匹配。
  • DNS 配置错误:确保 DNS 记录正确指向 Ingress Controller 的外部 IP 或域名。

7.2 TLS 证书无效

如果 TLS 证书无效,可能是以下原因:

  • 证书格式错误:确保证书和密钥的格式正确。
  • 证书与域名不匹配:确保证书的 Common Name (CN) 或 Subject Alternative Name (SAN) 与 Ingress 资源中的主机名匹配。
  • 证书未正确加载:检查 Kubernetes Secret 是否正确创建,并确保 Ingress 资源中引用了正确的 Secret 名称。

7.3 路径重写未生效

如果路径重写未生效,可能是以下原因:

  • 注解配置错误:确保 nginx.ingress.kubernetes.io/rewrite-target 注解配置正确。
  • 路径匹配错误:确保 Ingress 资源中的路径与请求路径匹配。

8. 总结

Kubernetes Ingress 是一个强大的工具,可以帮助你管理外部访问集群内部服务的流量。通过 Ingress,你可以实现基于主机名或路径的路由、TLS 终止、负载均衡等功能。本文介绍了如何部署 Ingress Controller、创建 Ingress 资源、配置 TLS 终止以及一些高级路由配置。希望这些内容能帮助你快速入门 Kubernetes Ingress,并在实际项目中应用这些知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI