在 Minikube 环境中使用 NGINX Ingress 控制器配置 Ingress

Ingress是一种 API 对象,其中定义了一些规则使得集群中的 服务可以从集群外访问。 Ingress 控制器 负责满足 Ingress 中所设置的规则。

本节为你展示如何配置一个简单的 Ingress,根据 HTTP URI 将服务请求路由到 服务 webweb2

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

要获知版本信息,请输入 kubectl version.

创建一个 Minikube 集群

  1. 点击 Launch Terminal

  1. (可选操作)如果你在本地安装了 Minikube,运行下面的命令:

    minikube start
    

启用 Ingress 控制器

  1. 为了启用 NGINIX Ingress 控制器,可以运行下面的命令:

    minikube addons enable ingress
    
  1. 检查验证 NGINX Ingress 控制器处于运行状态:

    kubectl get pods -n kube-system
    
    说明: 这一操作可能需要近一分钟时间。

    输出:

    NAME                                        READY     STATUS    RESTARTS   AGE
    default-http-backend-59868b7dd6-xb8tq       1/1       Running   0          1m
    kube-addon-manager-minikube                 1/1       Running   0          3m
    kube-dns-6dcb57bcc8-n4xd4                   3/3       Running   0          2m
    kubernetes-dashboard-5498ccf677-b8p5h       1/1       Running   0          2m
    nginx-ingress-controller-5984b97644-rnkrg   1/1       Running   0          1m
    storage-provisioner                         1/1       Running   0          2m
    

部署一个 Hello World 应用

  1. 使用下面的命令创建一个 Deployment:

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

    输出:

    deployment.apps/web created
    
  1. 将 Deployment 暴露出来:

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

    输出:

    service/web exposed
    
  1. 验证 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
    
  1. 使用节点端口信息访问服务:

    minikube service web --url
    

    输出:

    http://172.17.0.15:31637
    
    说明: 如果使用的是 Katacoda 环境,在终端面板顶端,请点击加号标志。 然后点击 Select port to view on Host 1。 输入节点和端口号(这里是31637),之后点击 Display Port

    输出:

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

    你现在应该可以通过 Minikube 的 IP 地址和节点端口来访问示例应用了。 下一步是让自己能够通过 Ingress 资源来访问应用。

创建一个 Ingress 资源

下面是一个 Ingress 资源的配置文件,负责通过 hello-world.info 将服务请求 转发到你的服务。

  1. 根据下面的 YAML 创建文件 example-ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
    spec:
      rules:
        - host: hello-world.info
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: web
                    port:
                      number: 8080
  1. 通过运行下面的命令创建 Ingress 资源:

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

    输出:

    ingress.networking.k8s.io/example-ingress created
    
  1. 验证 IP 地址已被设置:

    kubectl get ingress
    
    说明: 此操作可能需要几分钟时间。
    NAME              CLASS    HOSTS              ADDRESS        PORTS   AGE
    example-ingress   <none>   hello-world.info   172.17.0.15    80      38s
    
  1. /etc/hosts 文件的末尾添加以下内容:

    说明: 如果你在本地运行 Minikube 环境,需要使用 minikube ip 获得外部 IP 地址。 Ingress 列表中显示的 IP 地址会是内部 IP 地址。
    172.17.0.15 hello-world.info
    

    此设置使得来自 hello-world.info 的请求被发送到 Minikube。

  1. 验证 Ingress 控制器能够转发请求流量:

    curl hello-world.info
    

    输出:

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
    说明: 如果你在使用本地 Minikube 环境,你可以从浏览器中访问 hello-world.info。

创建第二个 Deployment

  1. 使用下面的命令创建 v2 的 Deployment:

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

    输出:

    deployment.apps/web2 created
    
  1. 将 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
    
  1. 应用所作变更:

    kubectl apply -f example-ingress.yaml
    

    输出:

    ingress.networking/example-ingress configured
    

测试你的 Ingress

  1. 访问 HelloWorld 应用的第一个版本:

    curl hello-world.info
    

    输出:

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

    curl hello-world.info/v2
    

    输出:

    Hello, world!
    Version: 2.0.0
    Hostname: web2-75cd47646f-t8cjk
    
    说明: 如果你在本地运行 Minikube 环境,你可以使用浏览器来访问 hello-world.info 和 hello-world.info/v2。

接下来

最后修改 February 19, 2021 at 5:33 PM PST : fix typo (9303a6689)