一、这都是什么
ingress:路由转发规则集合,k8s的默认资源。
service:提供服务对外暴露功能,模式有4种:ClusterIP(集群内部访问),Nodeport,Loadbalance,ExternalNAME(这三个可以对外提供服务)。
ingress-controller:实际规则转发工作者, ingress-controller并不是k8s的默认资源。
二、工作原理
ingress-contronler通过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。
而这个ingress规则写明了哪个域名对应k8s集群中的哪个service,然后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。
然后再把该配置动态的写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,然后reload一下,使其配置生效。以此来达到域名分配置及动态更新的效果。
通过ingress-controller访问后端的请求是不走kube-proxy的代理的,也就是下图中的
1
、3
不走kube-proxy,2
、4
还是走kube-proxy。
ingress-controller有很多种:Kubernetes-Ingress-Controller
、NGINX Ingress Controller
、Kong Ingress
、Traefik
、HAProxy Ingress
等10多种,用那种需要结合自身实际需求去选择,无特殊场景一般用k8s-ingress-controller
。
三、访问流程图
说明:
1、<>
里面代表资源类型,无此符号的部分是这个资源的名字
2、实线部分是实际访问流程,虚线部分是路由规则的维护
流程分解:
实线:
1、企业级应用场景最常用的方式就是用外层4层或7层负载来保证后端服务的可用性,如图是负载nginx这个ingress-controller的svc。
2、nginx-controller有自己的service,用的是nodeport模式对外暴露端口,关联后端ingress-controller。
3、ingress-controller拿到请求后转发给后端的service。
4、service通过标签选择器,找到后面对应的pod。
虚线:
5、ingress里面test.k8s.com
这个域名的路由规则。
6、ingress的规则会通过k8s-apiserver
对外提供查询。
7、ingress-controller查询k8s-apiserver拿到ingress路由规则,并更新在自己的配置文件里面。
四、配置实战
ingress-controller安装通过kuboard集成插件完成,这里不再赘述,网上文章也很多,可以参考kuboard安装ingress-controller:实战-使用-ingress-访问-web-应用
创建ingress+svc+deployment,并关联ingress-controller:
应用程序的yaml文件:
[root@k8s-master ingress]# vim app-nginx.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 ##容器端口
svc的yaml文件,主要是对外暴露应用端口:
[root@k8s-master ingress]# vim service-nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc ##svc名称
namespace: test ##名称空间
spec:
type: ClusterIP ##用clusterIP模式
ports:
- protocol: TCP
port: 8090 ##svc暴露的端口
targetPort: 80 ##关联容器端口
selector:
app: nginx ##标签选择器,这里选择app:nginx的pod
ingress配置文件:
[root@k8s-master ingress]# vim ingress-app.yaml
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
查看ingress-controller的配置是否更新:
访问测试,先拿到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
修改本机host,通过浏览器访问测试
192.168.XXX.XXX test.k8s.com
如有误,请各位大佬指正
原创不易,求赞