K8S学习指南(23)-k8s核心对象Ingress

发布时间:2023年12月18日

前言

Kubernetes(K8s)是一个强大的容器编排平台,为容器化应用提供了丰富的功能和资源管理。在K8s中,Ingress是一个重要的核心对象,它允许我们定义对集群内服务的外部访问规则。本文将深入研究K8s中Ingress的概念、作用以及使用方法,并通过详细的示例来帮助读者更好地理解。

什么是Kubernetes Ingress?

Ingress是K8s中的一个API对象,用于管理和配置外部对集群内服务的访问。它允许我们定义HTTP和HTTPS路由规则,将请求从集群外部的负载均衡器引导到相应的服务。Ingress的灵活性使得我们能够实现高级的应用程序路由、SSL终端和负载均衡等功能。

通过Ingress,我们可以将集群内的多个服务暴露到外部,并根据需要进行定制化的路由设置。这为应用的扩展和灵活部署提供了便利。

Ingress的基本结构

Ingress由以下几个主要组件构成:

  1. 规则(Rules): 每个Ingress对象可以包含多个规则,每个规则定义了一组路径匹配规则和与之关联的后端服务。
  2. 后端服务(Backend Services): 规则中指定的后端服务是Ingress路由请求到达时的目标服务。这可以是集群中的Service、Pod或外部服务。
  3. 路径(Paths): 路径定义了应该如何将请求路由到后端服务。可以使用通配符和正则表达式进行路径匹配。
  4. TLS(Transport Layer Security): Ingress还支持TLS,用于启用HTTPS。TLS配置包括证书和密钥,确保数据在传输过程中的安全性。

下面是一个简单的Ingress对象的例子:

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

在这个例子中,我们定义了一个Ingress对象,它将mydomain.com/app的请求路由到名为my-app-service的Service,并启用了HTTPS。

Ingress的使用示例

为了更好地理解Ingress的使用,让我们通过一个具体的示例来演示。

假设我们有一个Web应用,包括前端(frontend)和后端(backend)服务。现在,我们希望通过Ingress将这两个服务暴露到外部,并在路径上进行定制化的路由。

首先,我们创建前端和后端的Deployment和Service:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: web-server
        image: my-frontend-image:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
yamlapiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: api-server
        image: my-backend-image:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

接下来,我们定义Ingress对象:

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

在这个示例中,我们定义了一个Ingress对象,它将mydomain.com/frontend的请求路由到前端服务,将mydomain.com/backend的请求路由到后端服务。此外,我们还启用了HTTPS,并指定了TLS证书的Secret。

动态更新Ingress规则

Ingress的一个强大之处在于它支持动态更新。当我们需要调整路由规则时,可以直接修改Ingress对象,而不需要重启应用或重新创建服务。

让我们通过一个动态更新的例子来演示:

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

在这个例子中,我们仅保留了前端服务的路由规则。然后,通过应用这个更新后的Ingress对象,K8s将自动更新负载均衡器的配置,使得只有mydomain.com/frontend的请求能够到达前端服务。

总结

通过本文的介绍,我们对K8s中的Ingress有了深入的了解。Ingress作为连接集群内服务和外部请求的桥梁,提供了灵活的路由和负载均衡功能。了解Ingress的基本结构、使用示例以及动态更新的能力,有助于开发者更好地利用K8s进行应用程序的外部暴露和访问控制。

希望通过本文的详细介绍和实例演示,读者能够更好地理解K8s中Ingress的原理和用法,为构建可靠、安全且高度可定制的容器化应用提供基础。

文章来源:https://blog.csdn.net/zhaopeng_yu/article/details/135023353
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。