codecamp

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

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

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

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

在开始之前

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

您的 Kubernetes 服务器版本必须不低于版本 1.19。要获知版本信息,请输入 ​kubectl version​。如果你使用的是较早的 Kubernetes 版本,请切换到该版本的文档。

启用 Ingress 控制器 

  1. 为了启用 NGINIX Ingress 控制器,可以运行下面的命令:
  2. minikube addons enable ingress
    
  3. 检查验证 NGINX Ingress 控制器处于运行状态:
    • minikube v1.19 或更高版本
    • kubectl get pods -n ingress-nginx
      

      说明: 最多可能需要等待一分钟才能看到这些 Pod 运行正常。

      输出类似于:

      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
    • minikube v1.18.1 或更早版本
    • kubectl get pods -n kube-system
      

      说明: 最多可能需要等待一分钟才能看到这些 Pod 运行正常。

      输出类似于:

      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

      请确保可以在输出中看到一个名称以 ​nginx-ingress-controller-​ 为前缀的 Pod。

部署一个 Hello World 应用

  1. 使用下面的命令创建一个 Deployment:
  2. kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
    

    输出:

    deployment.apps/web created
    
  3. 将 Deployment 暴露出来:
  4. kubectl expose deployment web --type=NodePort --port=8080
    

    输出:

    service/web exposed
    
  5. 验证 Service 已经创建,并且可能从节点端口访问:
  6. kubectl get service web
    

    输出类似于:

    NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    web       NodePort   10.104.133.249   <none>        8080:31637/TCP   12m
  7. 使用节点端口信息访问服务:
  8. 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​:
  2. 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
  3. 通过运行下面的命令创建 Ingress 对象:
  4. kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
    

    输出:

    ingress.networking.k8s.io/example-ingress created
    
  5. 验证 IP 地址已被设置:
  6. kubectl get ingress
    

    说明: 此操作可能需要几分钟时间。

    接下来你将会在ADDRESS列中看到IPv4地址,例如:

    NAME              CLASS    HOSTS              ADDRESS        PORTS   AGE
    example-ingress   <none>   hello-world.info   172.17.0.15    80      38s
  7. 在 ​/etc/hosts​ 文件的末尾添加以下内容(需要管理员访问权限):
  8. 说明: 如果你在本地运行 Minikube 环境,需要使用 ​minikube ip​ 获得外部 IP 地址。 Ingress 列表中显示的 IP 地址会是内部 IP 地址。

    172.17.0.15 hello-world.info
    

    添加完成后,在浏览器中访问URL ​hello-world.info​,请求将被发送到 Minikube。

  9. 验证 Ingress 控制器能够转发请求流量:
  10. curl hello-world.info
    

    你应该看到类似输出:

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

    说明: 如果你在使用本地 Minikube 环境,你可以从浏览器中访问 hello-world.info。

创建第二个 Deployment 

  1. 使用下面的命令创建第二个 Deployment:
  2. kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
    

    输出:

    deployment.apps/web2 created
    
  3. 将第二个 Deployment 暴露出来:
  4. kubectl expose deployment web2 --port=8080 --type=NodePort
    

    输出:

    service/web2 exposed
    

编辑现有的 Ingress 

  1. 编辑现有的 ​example-ingress.yaml​,在文件最后添加以下行:
  2.            - path: /v2
                 pathType: Prefix
                 backend:
                   service:
                     name: web2
                     port:
                       number: 8080
  3. 应用变更:
  4. kubectl apply -f example-ingress.yaml
    

    输出:

    ingress.networking/example-ingress configured
    

测试你的 Ingress 

  1. 访问 HelloWorld 应用的第一个版本:
  2. curl hello-world.info
    

    输出类似于:

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
  3. 访问 HelloWorld 应用的第二个版本:
  4. curl hello-world.info/v2
    

    输出类似于:

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

    说明: 如果你在本地运行 Minikube 环境,你可以使用浏览器来访问 hello-world.info 和 hello-world.info/v2。


Kubernetes 列出集群中所有运行容器的镜像
Kubernetes 为集群配置DNS
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Kubernetes 管理集群

Kubernetes Service

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }