在上一节中,您学习了向群集外部客户端公开服务的两种方法(节点端口和负载平衡器)。本节介绍——Ingress的另一种方法。

为什么需要Ingress

一个很重要的原因是每个LoadBalancer服务都需要属于它自己的负载均衡器以及独立的公共IP地址,而Ingress只需要一个公网IP就能为许多服务提供访问。当客户端发送HTTP请求到Ingress时,Ingress会根据请求中的主机名和路径决定将请求转发到哪个服务,如下图所示:

通过一个Ingress就可以暴露多个服务。

Ingress在网络堆栈的应用层上工作,可以提供诸如基于cookie的会话绑定等service无法提供的特性。

什么是Ingress

Ingress是Kubernetes中的一种资源对象,它使我们能够为运行在kubernetes集群中的应用程序配置一个HTTP负载均衡器,该应用程序由一个或多个服务表示。为了将这些应用程序交付给Kubernetes集群之外的客户端,这种负载均衡器是必要的。Ingress公开从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingresss资源上定义的规则控制。

下面是一个简单的例子,Ingress将其所有的流量发送到一个服务:

Ingress资源支持如下特性:

  • 基于内容的路由
  • 基于主机的路由。例如,将带有主机报头的请求路由到一组服务,带有主机报头bar.exam的请求路由到另一组服务
  • 基于路径的路由。例如,将以/service-a开头的URI请求路由到服务a,以/service-b开头的URI请求路由到服务b。
  • 针对每个主机名的TLS/SSL terminiation代理,比如
  • 什么是Ingress控制器

    Ingress控制器一个运行在集群中的应用,它会根据Ingress资源配置一个HTTP负载均衡器。该负载均衡器可以是一个运行在集群中的软件负载均衡器,也可以是一个在集群外部运行的硬件或者云负载均衡器。不同的负载均衡器需要不同的Ingress控制器实现方式。

    如果想要Ingress能正常工作,首先必须确保在集群中运行Ingress控制器。不同的Kubernetes环境使用不同的控制器实现方式,但有些根本不提供默认的控制器。

    例如,GKE(Google Kubernetes Engine)使用Google Cloud Platform自己的HTTP负载均衡特性来提供Ingress功能。对于Minikube来说,最初并没有提供开箱即用的控制器,但现在它包含一个可以启用的插件便于Ingress的功能。

    本文我们使用Nginx Ingress控制器来演示如何使用Ingress控制器。

    安装Nginx Ingress控制器

    Master节点上下载de文件:

    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/de

    之所以先下载这个文件,而不是直接通过kubectl apply -f 命令执行,是因为国内无法访问该文件中指定的k8s.gcr.io下的镜像。所以将文件下载下来后,还需要使用我们事先准备好的阿里云镜像替换该镜像:

    sed -i 's#k8s.gcr.io/ingress-nginx/controller:v0.41.2@sha256:1f4f402b9c14f3ae92b11ada1dfe9893a88f0faeb0b2f4b903e2c67a0c3bf0de#registry.cn-shanghai.aliyuncs.com/pmx/ingress-nginx:v0.41.2@sha256:8aa4fda472ec83ae59fe0ce9720684d769ed277ff9bdcbb0169178dc9d1f8e85#g' de

    另外,对外开放的时候,需要固定Node上的端口,如果不想Kubernetes帮我们随机生成,可以修改该文件。找到Source: ingress-nginx/template,在ports上添加nodePort,设置http端口为32080,https端口为32443:

    然后创建Nginx Ingress控制器:

    kubectl apply -f de

    检查Ingress控制器pod是否已经启动:

    kubectl get pods -n ingress-nginx
     -l a --watch

    查看生成的service:

    到此处就可以直接通过nodeIP:nodePort的方式来访问这个服务。

    这个服务是nginx Ingress 控制器对外访问的一个入口,接收集群外部流量:

    说明Nginx Ingress控制器部署成功。

    通过如下命令查看Ingress 控制器的版本:

    POD_NAMESPACE=ingress-nginx
    POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l a --field-selector= -o jsonpath='{.items[0].me}')
    kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version

    接下来我们就可以创建我们的第一个Ingress资源了。

    创建后端服务

    创建一个后端服务来演示如何通过Ingress进行访问。

    vim

    apiVersion: v1
    kind: Service
    metadata:
     name: test-tomcat-svc
    spec:
     selector:
       app: tomcat
     ports:
     - name: http
       targetPort: 8080
       port: 8080

    vim

    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: test-tomcat-deploy
    spec:
     replicas: 3
     selector:
       matchLabels:
         app: tomcat
     template:
       metadata:
         labels:
           app: tomcat
       spec:
         containers:
         - name: tomcat
           image: tomca
           ports:
           - name: http
             containerPort: 8080
    kubectl apply -f

    kubectl get deploy

    创建Ingress资源

    vim

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
     name: test-tomcat-ingress-nginx
     annotations:
       kuberne: "nginx"
    spec:
     rules:
     - host:
       http:
         paths:
         - path:
           backend:
             serviceName: test-tomcat-svc
             servicePort: 8080
    kubectl apply -f

    进入nginx ingresss控制器pod,查看更新后的nginx配置文件:

    kubectl exec -it ingress-nginx-controller-55bcfcfd89-xfvmv -n ingress-nginx bash
    cat nginx.conf

    访问后端服务

    在本地Windows系统上配置hosts文件,添加一条hosts记录:

    192.168.188.132

    其中192.168.188.132为节点IP地址。

    访问地址::32080

    如果觉得本文对您有帮助,欢迎关注我的头条号订阅更新,我会不断推出更多学习教程、视频以及偏实战的文章!

    1.《【ff9修改器】专题从零开始学K8s: 28.Ingress》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

    2.《【ff9修改器】专题从零开始学K8s: 28.Ingress》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

    3.文章转载时请保留本站内容来源地址,https://www.cxvn.com/gl/djyxgl/187287.html