在 Minikube 上使用 NGINX Ingress Controller 设置 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. 通过 NodePort 访问 Service,使用 minikube 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
    

    进行此更改后,您的网络浏览器将向 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)