这是我参与更文挑战的第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个端点,如下。
-
/healthzthat returns 200 -
/that returns 404
统一入口
在公有云上,可以使用SLB负载均衡来做入口,代理到相应的节点,但是本地环境没有,如果需要测试可以使用官网的MetalLB(还在测试阶段),当然本地也可能再加一个nginx或haproxy做代理效果是一样的。当时会出现单点故障,值得注意
- 公有云
- 本地环境