k8s series 10: Ingress访问服务

1,041 阅读3分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

   前面文章中,访问服务使用的Service NodePort 方式映射的端口,用户访问时需要输入IP+PORT,这种方式在开发测试时用用也没关系,只是不方便记。但是如果是生产服务 把这样的地址给到用户,肯定是不行,浏览都会给你标记危险网站,用户更是一脸懵。

为了解决上述问题,传统方式是使用域名,客户只需要知道域名既可,不需要记IP+PORT,那么k8s在1.19版本ingress GA,做为入口服务提供。

Ingress介绍

入口

  将外部流量转发路由到集群内部的服务上,将集群内部的服务暴露在域名上

将请求到Ingress的流量转发到后端服务的示例图:

 Ingress配置服务提供外部可访问的URL(http,https),并且负载平衡流量(基于策略)

一个配置对应一个入口控制器,一个入口控制器通常有一个负载均衡器,帮助处理流量

Ingress不会公开任意端口和协议向 Internet 公开 HTTP 和 HTTPS 以外的服务通常使用Service.Type=NodePort,这和nginx代理后端相似

控制器

 虽然k8s中有Ingress对象资源,但Ingress控制器需要自已来创建,并相应的第三方控制器众多,在选择中或许会生产困难选择症。

  • 控制器列表:

官方维护的是nginx Ingress,可以根据自身情况和场景来选择相应的控制器

流行度在国内较高是nginx,istio,Traefix,haproxy,apisix等。其中Traefix自带漂亮UI. istio是ServiceMesh. 而apisix是国内开源的类网关服务,最近融了一笔大钱,风头正盛. haproxy则是老牌正反向代理

博主没有一一体验过,给不出相应的对比图,但是按照习惯,先测试一个官方推荐的nginx ingress试试。

k8s也支持使用多个ingress在一个集群组合使用

Ingress部署

  nginx ingress官网:  kubernetes.github.io/ingress-ngi…

博主这边使用的xenserver自建虚拟机,所以安装的话不能选择云,需要选择裸机(Bare-metal)部署, 因为还没有写helm相关的文章,本文就不使用helm安装ingress,直接以原始方式安装

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

也可以将yaml下载下来,自行修改

验证安装结果, --watch是持续输出,观察整个过程,直到结束(成功或失败)

kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch

Ingress控制器部署好了,暴露服务以供外部访问还需要相应配置

接下来我们以depoyment方式部署的springboot-hive 为例,来创建一个配置

  • host就是域名,serviceName就是定义的service服务的名字,可以用kubectl get svc -n devops查看 servicePort类似

------------------------------

apiVersion: extensions/v1
kind: Ingress
metadata:
  name: springboot-hive-ingress
  namespace: devops
  labels:
    app: springboot
spec:
  rules:
    - host: springboot-hive.libaigo.com
      http:
        paths:
        - path: /
          backend:
            serviceName: springboot-hive-service
            servicePort: 8080

-------------------------------

kubectl apply -f ingress.yaml
kubectl get ingress -A

可以看到成功的将spingboot-hive.libaogo.com 配置成功,端口80

因为我们没有做DNS解析,所以这里还需要将该域名 写到hosts中。spingboot-hive.libaogo.com对应的IP 选择k8s集群任意一台node节点IP 既可

然后访问spingboot-hive.libaogo.com 服务

默认服务暴露2个端点,如下。

  • /healthz that returns 200

  • / that returns 404

统一入口

 在公有云上,可以使用SLB负载均衡来做入口,代理到相应的节点,但是本地环境没有,如果需要测试可以使用官网的MetalLB(还在测试阶段),当然本地也可能再加一个nginx或haproxy做代理效果是一样的。当时会出现单点故障,值得注意

  • 公有云

云环境

  • 本地环境

裸机环境