Ingress暴露服务

通过前面的学习,我们应该已经能够搭建k8s集群,并在集群上部署应用程序了。然而,还有一个最重要的问题没有解决,我们如何访问集群上部署的服务(比如一个网站)?前面我们学习Service组件时,我们知道NodePort方式的Service能够在每个k8s节点上打开一个端口,供外部访问服务。但这种方式太过原始了,NodePort默认只支持30000以上的端口,而且也不能配置路径匹配、域名等信息区分流量。

实际上,暴露服务最好的方式是使用Ingress ControllerIngress组件,Ingress Controller可以简单理解为一个支持配置的类似Nginx的软件,Ingress则是它的配置文件,上面提到的区分流量等功能Ingress Controller都已经封装好了。

本篇中代码还是使用之前提到过的例子程序:https://gitee.com/gacfox/demo-onlineshop

安装使用MetalLB

在部署Ingress Controller之前,我们先要解决一个问题。我们知道k8s本身没有实现负载均衡LB,Service的LoadBalancer模式一般只支持公有云,而Ingress Controller一般都是使用LB模式。不过最近出现了MetalLB工具,它能够让我们在本地环境下体验LoadBalancer模式,便于我们观察学习。

MetalLB有若干种工作模式,我们实验环境可以使用Layer2模式,该模式下MetalLB会在选定节点上响应LB地址段的ARP请求,从而实现流量转发(当然这其实并没有起到负载均衡的作用,只是作为一个模拟的体验)。

部署配置文件:https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

使用MetalLB,除了部署文件我们还需要一个ConfigMap配置。

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.130-192.168.1.159

addresses指定一个k8s集群同网段的地址段,供LB为LoadBalancer模式的Service分配地址。这样部署完成后,MetalLB会自动监测集群中LoadBalancer模式的Service,对符合条件的Service进行地址分配,同时在外部网络进行ARP广播占据IP地址,此时我们的LoadBalancer模式的Ingress Controller就能正常使用了。

安装Ingress Controller

部署Ingress前需要在k8s集群中安装一个Ingress Controller,它和Ingress的关系就像是nginx程序和nginx程序的配置文件。我们的集群需要先安装Ingress Controller再部署Ingress

这个组件有多种实现,比较常用的是ingress-nginx

官方文档:https://kubernetes.github.io/ingress-nginx/

yaml资源清单文件:https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

我们这里实际可以先不执行kubectl apply,建议先将该yaml下载下来,了解其中为我们创建的内容再执行。

注意:除了ingress-nginx还有个nginx-ingress。前者是k8s社区提供的,后者是nginx社区提供的,目前两个组件都在并行发展,谁也不服谁,比较奇葩。

部署Ingress

实际上需要我们手动编写的资源只有一个Ingress,下面是一个例子。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: onlineshop-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: onlineshop.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: portal
            port:
              number: 8080
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web
            port:
              number: 8080

实际上,配置文件中的spec.rules字段和Nginx实现的功能十分相似。包括匹配的流量域名、路径的匹配模式、后端服务名、服务的端口等信息。配置十分简单、直观,这里就不多介绍了。

通过浏览器访问

本例子中,由于没有真正的公网IP和DNS域名解析,因此我们首先需要配置本机的host,使得域名onlineshop.com指向LB为Ingress Controller分配的IP。

我们可以使用如下命令查看具体IP和端口。

kubectl get svc -n ingress-nginx

host配置例子。

192.168.1.130 onlineshop.com

浏览器访问结果如下。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。