k8s ingress-controller处理流程及原理
一、这都是什么
ingress:路由转发规则集合,k8s的默认资源
service:提供服务对外暴露功能,模式有4种:ClusterIP(这个是集群内部访问),(nodeport,loadbalance,externalNAME)这三个可以对外提供服务
ingress-controller:实际规则转发工作者, ingress-controller并不是k8s的默认资源
二、他们的工作原理
1. ingress-contronler通过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。
2. 而这个ingress规则写明了哪个域名对应k8s集群中的哪个service,然后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。
3. 然后再把该配置动态的写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,然后reload一下,使其配置生效。以此来达到域名分配置及动态更新的效果。
4. 通过ingress-controller访问后端的请求是不走kube-proxy的代理的,也就是下图中的①③不走kube-proxy,②④还是走kube-proxy
5. ingress-controller有很多种:Kubernetes-Ingress-Controller、NGINX Ingress Controller、Kong Ingress、Traefik、HAProxy Ingress等10多种,用那种需要结合自身实际需求去选择,无特殊场景一般用k8s-ingress-controller
三、访问流程图
流程分解:
<>里面代表资源类型,无此符号的部分是这个资源的名字
图中实线部分是实际访问流程,虚线部分是路由规则的维护
①企业级应用场景最常用的方式就是用外层4层或7层负载来保证后端服务的可用性,如图是负载nginx这个ingress-controller的svc
②nginx-controller有自己的service,用的是nodeport模式对外暴露端口,关联后端ingress-controller
③ingress-controller拿到请求后转发给后端的service
④service通过标签选择器,找到后面对应的pod
*⑤ingress里面test.k8s.com这个域名的路由规则
*⑥ingress的规则会通过k8s-apiserver对外提供查询
*⑦ingress-controller查询k8s-apiserver拿到ingress路由规则,并更新在自己的配置文件里面
四、配置实战
1.ingress-controller安装通过kuboard集成插件完成,这里不再赘述,网上文章也很多,可以参考
kuboard安装ingress-controller参考链接:https://kuboard.cn/learning/k8sintermediate/service/ingress.html#实战-使用-ingress-访问-web-应用
2.创建ingress+svc+deployment,并关联ingress-controller
[root@k8s-master ingress]# vim app-nginx.yaml ##应用的yaml文件
apiVersion: apps/v1
kind: Deployment ##资源类型deployment
metadata:
name: nginx-app ##pod名称
namespace: test ##名称空间
spec:
replicas: 2 ##副本数
selector:
matchLabels: ##标签选择器
app: nginx
template: ##以下是pod模板
metadata:
labels:
app: nginx ##给pod作标签
spec:
containers:
- name: nginx ##容器名称
image: nginx:v1.20.0 ##镜像版本
ports:
- containerPort: 8090 ##容器端口
[root@k8s-master ingress]# vim service-nginx.yaml ##svc的yaml文件,主要是对外暴露应用端口
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc ##svc名称
namespace: test ##名称空间
spec:
type: ClusterIP ##用clusterIP模式
ports:
- protocol: TCP
port: 8090 ##容器端口
targetPort: 80 ##svc暴露的端口
selector:
app: nginx ##标签选择器,这里选择app:nginx的pod
[root@k8s-master ingress]# vim ingress-app.yaml ##ingress配置文件
apiVersion: extensions/v1beta1 ##k8s拓展接口及版本
kind: Ingress ##ingress资源类型
metadata:
name: nginx-app-ingress ##ingress名称
namespace: test ##名称空间
annotations:
spec:
ingressClassName: nginx ##这是最关键的一个配置,这个配置就是用来关联ingress-controller,这个值是ingress-controller的名称
rules: ##ingress的路由规则从这开始
- host: test.k8s.com ##这里配置域名
http: ##协议类型
paths: ##位置信息
- path: / ##域名的根目录
backend: ##关联后端信息
serviceName: nginx-app-svc ##关联的svc的名字
servicePort: 80 ##关联的svc的端口
[root@k8s-master ingress]# kubectl apply -f app-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f service-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f ingress-app.yaml
3.查看ingress-controller的配置是否更新
4.访问测试,先拿到ingress-controller的service暴露在服务器的端口,这里能看到:http是30215,https是32740
[root@k8s-master ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller-admission-nginx ClusterIP 10.111.48.12 <none> 443/TCP 24h
ingress-nginx-controller-nginx NodePort 10.107.204.218 <none> 80:30215/TCP,443:32740/TCP 24h
5.修改本机host,通过浏览器访问测试
192.168.XXX.XXX test.k8s.com
如有误,请各位大佬指正
原创不易,求赞