首页 > 数据库 > 数据库开发技术 > Ingess kubernetes 原生LB
在之前的文章已经提到,Service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalancer,但是这两种方式,都有一定的缺点:
NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,无异于变相增加维护成本
LB方式的缺点是每个service(后文简称为svc)需要一个LB,浪费、麻烦,并且需要kubernetes之外设备的支持
基于这种现状,kubernetes官方提供了Ingress资源对象,它只需要一个NodePort或LB就可以满足暴露多个Service的需求。工作机制大致如下图表示:

Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于Nginx,可以理解成在Ingress里建立诸多映射规则,Ingress Controller通过监听这些配置规则并转化成Nginx的反向代理配置 , 然后对外部提供服务。在这里有两个核心概念:
ingress:kubernetes中的一个对象,作用是定义请求如何转发到svc的规则
ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等
Ingress的工作原理如下:
用户编写规则,说明哪个域名对应看k8s集群中的哪个svc
Ingress controller 动态感知Ingress规则的变化,然后生成一段对应的反向代理配置
Ingress controller会将生成的反向代理配置写入到一个运行着的Nginx服务中,并动态更新(如下图)

Ingress使用演示
创建文件夹
获取ingress-nginx
创建
查看ingress-nginx
NAME READY STATUS RESTARTS AGEpod/nginx-ingress-controller-fbf967dd5-4qpbp 1/1 Running 0 30s
查看svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx NodePort 10.98.75.177 <none> 80:32355/TCP,443:31355/TCP 11h
准备service和pod
为了后面的实验比较方便,创建如下图所示的模型

创建tomcat-nginx.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentnamespace: devspec:replicas: 2selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:name: nginximage: nginx:1.17.1ports:containerPort: 80---apiVersion: apps/v1kind: Deploymentmetadata:name: tomcat-deploymentnamespace: devspec:replicas: 3selector:matchLabels:app: tomcat-podtemplate:metadata:labels:app: tomcat-podspec:containers:name: tomcatimage: tomcat:8.5-jre10-slimports:containerPort: 8080---apiVersion: v1kind: Servicemetadata:name: nginx-servicenamespace: devspec:selector:app: nginx-podclusterIP: Nonetype: ClusterIPports:port: 80targetPort: 80---apiVersion: v1kind: Servicemetadata:name: tomcat-servicenamespace: devspec:selector:app: tomcat-podclusterIP: Nonetype: ClusterIPports:port: 8080targetPort: 8080
创建
查看
# kubectl get svc -n devNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-service ClusterIP None <none> 80/TCP 48stomcat-service ClusterIP None <none> 8080/TCP 48s
Http代理和Https代理
创建ing-http.yaml
apiVersion: extensions/v1beta1kind: Ingressmetadata:name: ing-httpnamespace: devspec:rules:host: nginx.test.comhttp:paths:path: /backend:serviceName: nginx-serviceservicePort: 80host: tomcat.test.comhttp:paths:path: /backend:serviceName: tomcat-serviceservicePort: 8080
创建
ingress.extensions/ing-http created
查看
# kubectl get ing ing-http -n devNAME HOSTS ADDRESS PORTS AGEing-http nginx.test.com,tomcat.test.com 80 22s
查看详情
...Rules:Host Path Backends---- ---- --------nginx.test.com / nginx-service:80 (10.244.1.96:80,10.244.1.97:80,10.244.2.112:80)tomcat.test.com / tomcat-service:8080(10.244.1.94:8080,10.244.1.95:8080,10.244.2.111:8080)...
本地配置host文件,解析上面的两个域名到集群中任一节点上就可以分别访问tomcat.test.com和nginx.test.com查看效果了(注意这里要看ingress-nginx暴露端口,访问时需要携带端口,如果需要是用80&443 后可以是用nginx座一层代理,或者traefik + nginx 实现)
Https代理
创建证书&生成证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=test.com"
创建密钥
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
创建ing-https.yaml
apiVersion: extensions/v1beta1kind: Ingressmetadata:name: ing-httpsnamespace: devspec:tls:hosts:nginx.test.comtomcat.test.comsecretName: tls-secret # 指定秘钥rules:host: nginx.test.comhttp:paths:path: /backend:serviceName: nginx-serviceservicePort: 80host: tomcat.test.comhttp:paths:path: /backend:serviceName: tomcat-serviceservicePort: 8080
创建
ingress.extensions/ing-https created
查看
# kubectl get ing ing-https -n devNAME HOSTS ADDRESS PORTS AGEing-https nginx.test.com,tomcat.test.com 10.104.153.38 80, 443 2m42s
查看详情
# kubectl describe ing ing-https -n dev...TLS:tls-secret terminates nginx.test.com,tomcat.test.comRules:Host Path Backends---- ---- --------nginx.test.com / nginx-service:80 (10.244.1.97:80,10.244.1.98:80,10.244.2.119:80)tomcat.test.com / tomcat-service:8080(10.244.1.99:8080,10.244.2.117:8080,10.244.2.120:8080)...
通过浏览器访问https://nginx.test.com和https://tomcat.test.com来查看了(要看创建ingress-nginx的时候暴露的端口是什么,访问时需要携带端口)
原文作者:步步运维步步坑;如有侵权,请联系管理员删除。