使用 NGINX Ingress 控制器在 Minikube 上设置 Ingress

Ingress 是一个 API 对象,它定义了允许外部访问集群中服务的规则。一个 Ingress 控制器 实现了 Ingress 中设置的规则。

此页面展示了如何设置一个简单的 Ingress,它根据 HTTP URI 将请求路由到服务 'web' 或 'web2'。

开始之前

本教程假设您使用 minikube 运行本地 Kubernetes 集群。访问 安装工具 了解如何安装 minikube

您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点的集群上运行本教程,这些节点不充当控制平面主机。如果您还没有集群,可以使用 minikube 创建一个,或者您可以使用以下 Kubernetes 游乐场之一

您的 Kubernetes 服务器必须是 1.19 或更高版本。要检查版本,请输入 kubectl version。如果您使用的是旧版本的 Kubernetes,请切换到该版本的文档。

创建 minikube 集群

如果您还没有在本地设置集群,请运行 minikube start 来创建一个集群。

启用 Ingress 控制器

  1. 要启用 NGINX Ingress 控制器,请运行以下命令

    minikube addons enable ingress
    
  2. 验证 NGINX Ingress 控制器是否正在运行

    kubectl get pods -n ingress-nginx
    

    输出类似于

    NAME                                        READY   STATUS      RESTARTS    AGE
    ingress-nginx-admission-create-g9g49        0/1     Completed   0          11m
    ingress-nginx-admission-patch-rqp78         0/1     Completed   1          11m
    ingress-nginx-controller-59b45fb494-26npt   1/1     Running     0          11m
    

部署一个 hello, world 应用

  1. 使用以下命令创建一个 Deployment

    kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
    

    输出应该是

    deployment.apps/web created
    

    验证 Deployment 是否处于 Ready 状态

    kubectl get deployment web 
    

    输出应该类似于

    NAME   READY   UP-TO-DATE   AVAILABLE   AGE
    web    1/1     1            1           53s
    
  2. 公开 Deployment

    kubectl expose deployment web --type=NodePort --port=8080
    

    输出应该是

    service/web exposed
    
  3. 验证 Service 是否已创建,并且是否在节点端口上可用

    kubectl get service web
    

    输出类似于

    NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    web       NodePort   10.104.133.249   <none>        8080:31637/TCP   12m
    
  4. 使用 minikube service 命令通过 NodePort 访问 Service。请按照您的平台说明操作

    minikube service web --url
    

    输出类似于

    http://172.17.0.15:31637
    

    调用上一步输出中获得的 URL

    curl http://172.17.0.15:31637 
    

    # The command must be run in a separate terminal.
    minikube service web --url 
    

    输出类似于

    http://127.0.0.1:62445
    ! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
    

    从另一个终端调用上一步输出中获得的 URL

    curl http://127.0.0.1:62445 
    

    输出类似于

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    

    您现在可以通过 Minikube IP 地址和 NodePort 访问示例应用程序。下一步让您使用 Ingress 资源访问应用程序。

创建 Ingress

以下清单定义了一个 Ingress,它通过 hello-world.example 将流量发送到您的 Service。

  1. 从以下文件创建 example-ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
    spec:
      ingressClassName: nginx
      rules:
        - host: hello-world.example
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: web
                    port:
                      number: 8080
  2. 通过运行以下命令创建 Ingress 对象

    kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
    

    输出应该是

    ingress.networking.k8s.io/example-ingress created
    
  3. 验证 IP 地址是否已设置

    kubectl get ingress
    

    您应该在 ADDRESS 列中看到一个 IPv4 地址;例如

    NAME              CLASS   HOSTS                 ADDRESS        PORTS   AGE
    example-ingress   nginx   hello-world.example   172.17.0.15    80      38s
    
  4. 通过按照您的平台说明操作,验证 Ingress 控制器是否正在引导流量

    curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
    

    minikube tunnel
    

    输出类似于

    Tunnel successfully started
    
    NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
    
    The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
    sudo permission will be asked for it.
    Starting tunnel for service example-ingress.
    

    从一个新的终端中,调用以下命令

    curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
    

    您应该看到

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
  5. 或者,您也可以从浏览器访问 hello-world.example

    在计算机上的 /etc/hosts 文件末尾添加一行(您需要管理员访问权限)

    查找 minikube 报告的外部 IP 地址

      minikube ip 
    

      172.17.0.15 hello-world.example
    

    127.0.0.1 hello-world.example
    

    在您进行此更改后,您的 Web 浏览器将向 Minikube 发送对 hello-world.example URL 的请求。

创建第二个 Deployment

  1. 使用以下命令创建另一个 Deployment

    kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
    

    输出应该是

    deployment.apps/web2 created
    

    验证 Deployment 是否处于 Ready 状态

    kubectl get deployment web2 
    

    输出应该类似于

    NAME   READY   UP-TO-DATE   AVAILABLE   AGE
    web2   1/1     1            1           16s
    
  2. 公开第二个 Deployment

    kubectl expose deployment web2 --port=8080 --type=NodePort
    

    输出应该是

    service/web2 exposed
    

编辑现有的 Ingress

  1. 编辑现有的 example-ingress.yaml 清单,并在末尾添加以下行

    - path: /v2
      pathType: Prefix
      backend:
        service:
          name: web2
          port:
            number: 8080
    
  2. 应用更改

    kubectl apply -f example-ingress.yaml
    

    您应该看到

    ingress.networking/example-ingress configured
    

测试您的 Ingress

  1. 访问 Hello World 应用的第一个版本。

    curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
    

    minikube tunnel
    

    输出类似于

    Tunnel successfully started
    
    NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
    
    The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
    sudo permission will be asked for it.
    Starting tunnel for service example-ingress.
    

    从一个新的终端中,调用以下命令

    curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
    

    输出类似于

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
  2. 访问 Hello World 应用的第二个版本。

    curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example/v2
    

    minikube tunnel
    

    输出类似于

    Tunnel successfully started
    
    NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
    
    The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
    sudo permission will be asked for it.
    Starting tunnel for service example-ingress.
    

    从一个新的终端中,调用以下命令

    curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example/v2
    

    输出类似于

    Hello, world!
    Version: 2.0.0
    Hostname: web2-75cd47646f-t8cjk
    

下一步

上次修改时间:2024 年 5 月 7 日下午 1:50 PST:更改 Ingress 教程的主机,以减轻安全风险。(cd6148bc97)