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

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

本页向您展示如何设置一个简单的 Ingress,该 Ingress 根据 HTTP URI 将请求路由到服务 'web' 或 'web2'。

准备开始

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

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

您的 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 是否处于就绪状态

    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. 验证是否已创建服务,并且在节点端口上可用

    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 访问服务。按照您的平台的说明进行操作

    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,该 Ingress 通过 hello-world.example 将流量发送到您的服务。

  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 浏览器会将对 hello-world.example URL 的请求发送到 Minikube。

创建第二个 Deployment

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

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

    输出应为

    deployment.apps/web2 created
    

    验证 Deployment 是否处于就绪状态

    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)