Kubernetes Ingress 入门

发布时间 2023-10-23 16:42:43作者: MaxBruce

原文:https://zhuanlan.zhihu.com/p/637522663

如果你真的想了解 Kubernetes,Kubernetes Ingress 是一个需要理解的关键概念。在这篇文章中,我将解释什么是 Kubernetes Ingress,我们为什么使用 Kubernetes Ingress,以及它的好处。最后,我们将看看开始使用 Kubernetes Ingress 的实践方法。

Kubernetes Docs中,它说 Ingress 是:

管理对集群中服务的外部访问的 API 对象,通常是 HTTP。

这里的定义很准确。如前所述,Ingress 是一个 API 对象,用于管理对 Kubernetes 集群中服务的外部访问。

使用Ingress 让我们能够访问 Kubernetes 集群中的服务。

它是在 Kubernetes 中使用服务对象的替代方法。它更安全,因为没有端口暴露在外部供用户用于访问我们的应用程序。

在集群中实施 Ingress 时,有两个关键组件需要了解。他们是:

  • Ingress 对象
  • Ingress 控制器

Ingress 对象:Ingress 对象是一种资源,它定义了将外部流量路由到集群内服务的规则。它定义了处理外部请求如何路由到内部服务的路由规则。

创建Ingress 对象时还定义了请求协议(HTTP 和 HTTPS)。Ingress 对象基本上是用于在 Kubernetes 集群中创建 Ingress 资源的清单文件。

 

以下是 Ingress 对象的示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-object
spec:
  rules:
  - host: mydomain.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              name: http
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              name: http

 

在此示例中,我们将Ingress 对象命名为 ingress-object。

我们还可以看到,在rules下,我们定义了一些东西,比如:

  • host:主机拥有一个有效的域名,我们的请求将被路由到该域名。
  • http:http 定义了路径、服务和端口,我们正在将任何其他请求映射到 paths 参数中定义的任何指定路径。

注意:如果您在 Kubernetes 集群中配置了 SSL,这也可以是 https 协议。

 

 

Ingress 控制器:Ingress 控制器是 Kubernetes 集群的重要组成部分。

它充当来自集群外部的传入请求的网关。Ingress Controller 还可以执行各种任务,例如负载平衡、身份验证和授权等。

Ingress 控制器的一些示例包括 Nginx、Traefik 等。

 

为什么要使用 Kubernetes Ingress?

Ingress 是一个安全的解决方案,可以帮助我们访问 Kubernetes 集群中的任何服务。现在,问题是在将您的应用程序暴露给外界时,Ingress 如何比 Service 更安全?

Ingress 比 Service 更安全,因为当您希望允许外部流量进入您的集群时,它不会公开任何端口。例如,当您在集群中运行一个简单的 Flask 应用程序时,您希望通过服务公开该应用程序。执行此操作的众多方法之一是拥有 NodePort 类型的服务并在集群节点上公开特定端口。

或者,如果您使用 Ingress 来公开您的应用程序,您所要做的就是设置路由规则以将任何传入请求映射到连接到您的应用程序的服务。在使用 Ingress 时,我们仍然需要使用服务,但不同的是,现在我们的服务将不会有 NodePort 类型对外暴露任何端口。我们将拥有的服务类型将是 ClusterIP 类型的服务。这样,我们只允许集群内所有服务之间的内部网络连接,使其更加安全。

Kubernetes Ingress 的优势

使用 Ingress 有一些好处,其中包括:

  • 提高集群安全性
  • 更好的流量路由
  • 改进的负载平衡
  • 自动缩放

 

 

开始使用 Kubernetes Ingress

 

在本节中,我们将了解如何开始使用 Kubernetes Ingress。

这将是一个教程,在本教程中,我们将完成以下部分:

  • 在 Minikube 中设置Ingress 控制器
  • 了解 Ingress 中的路由

 

先决条件

要学习本教程,您必须满足以下要求:

 

在 Minikube 中设置Ingress控制器

 

对于本教程,我们将使用 Nginx Ingress Controller。

首先,我们需要确保我们已经启动并运行了 Minikube。

我们可以使用以下命令启动 Minikube:

minikube start

启动 Minikube 后,我们需要安装 Nginx控制器。为此,请输入以下命令:

minikube addons enable ingress 

我们可以通过使用以下命令列出集群中的命名空间来确保 Nginx 控制器已成功安装:

kubectl get namespace

ingress-nginx 将显示为 Minikube 上的命名空间之一。

 

了解 Ingress 中的路由

现在我们已经安装了 Nginx Ingress 控制器,让我们看看如何创建一个入口对象并使用它来配置我们的路由规则。

首先,我们需要创建 pod 和服务,我们将使用它们为我们的Ingress 对象定义路由规则。

我们将创建一个后端 pod 和后端服务。后端 pod 将是一个 flask 服务器,而后端服务将是 ClusterIP 类型的服务,指向后端 pod。

要创建我们的后端 pod,我们需要创建一个 backend.yml 文件并将这段代码添加到其中。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: callspadeoz123/flask-docker:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "200m"
        ports:
        - containerPort: 5000

对于后端服务,创建一个名为 backend-svc.yml 的文件并向其中添加以下代码:

apiVersion: v1
kind: Service
metadata:
  name: backend-svc
spec:
  selector:
    app: backend
  type: ClusterIP
  ports:
  - port: 5000
    targetPort: 5000

接下来,我们需要在我们的 Minikube 集群中部署部署和服务。

我们可以用这个命令来做到这一点:

kubectl apply -f backend.yml
kubectl apply -f backend-svc.yml

我们可以使用以下命令检查我们的 pod 和服务是否已启动并正在运行:

kubectl get pod 

kubectl get service

 

在确认我们的服务和 pod 都启动并运行后,我们现在可以创建我们的Ingress 对象。

 

要创建我们的 ingress 对象,请创建一个名为 ingress.yml 的文件(只要它是一个 yml 文件,您可以随意调用该文件)并添加以下代码块:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  labels:
    name: my-ingress
spec:
  rules:
  - host: flask-server.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: backend-svc
            port: 
              number: 5000

 

正如您在 spec 中看到的,它下面有一个称为Rules。

Rules标量包含其他重要标量,例如:

  • host:主机是域名,必须是入口可用于路由外部请求的有效域。
  • protocol(http/https):协议可以是http或者https。在这种情况下,我们使用的是 http。
  • path:路径就是我们添加到浏览器的域名的路径
  • pathType:pathType 表示我们要添加到主机的路径类型。
  • backend:后端定义请求应在内部路由到的服务和端口。

 

接下来,我们需要ingress.yml像这样应用我们的文件:

kubectl apply -f ingress.yml

如果我们仔细观察,我们可以看到我们的主机名是flask-server.com,但这不是互联网上的注册域名。我们可以通过一些努力让它在我们的本地机器上运行。

要在本地机器上注册域名,我们需要将服务器的 IP 地址映射到我们想要的任何名称。

可以通过运行以下命令获取我们ingress 服务器的 IP 地址:

kubectl get ingress

注意:应用我们的ingress 清单后,它需要一些时间(大约一分钟)来初始化一个 IP 地址供我们使用。

我们应该得到这样的输出:

NAME         CLASS   HOSTS              ADDRESS          PORTS   AGE
my-ingress   nginx   flask-server.com   192.168.59.100   80      102m

 

注意:您的 IP 会有所不同。

现在,要将 IP 地址映射到主机名,请打开位于 etc 目录中的主机文件进行编辑,如下所示:

sudo nano /etc/hosts

在文件中,添加主机名和 IP 地址,如下所示:

 

现在我们已经配置了我们的主机,我们可以在我们的网络浏览器中访问主机,我们应该看到我们的 flask 应用程序启动并运行。

我们还可以有更多的路由到我们的ingress 对象:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  labels:
    name: my-ingress
spec:
  rules:
  - host: flask-server.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: backend-svc
            port: 
              number: 5000
      - pathType: Prefix
        path: "/path"
        backend:
          service:
            name: serviceName
            port:
              number: servicePort

 

结论

如果您发现 Kubernetes Ingress 是一个令人困惑的话题,我希望我能帮助您揭开神秘面纱并简化它。一开始这是一个很难理解的概念,但是当您掌握了它并不断练习用它来构建更多内容时,它就会变得非常容易使用。