20221220 8. Ingress
简介
K8s集群对外暴露服务的方式目前只有三种:loadblancer、nodeport、ingress
ingress由两部分组成:ingress controller和ingress服务。
其中ingress controller目前主要有两种:基于nginx服务的ingress controller和基于traefifik的ingress controller。
而其中traefifik的ingress controller,目前支持http和https协议。由于对nginx比较熟悉,而且需要使用TCP负载,所以在此我们选择的是基于nginx服务的ingress controller。
在kubernetes集群中,我们知道service和pod的ip仅在集群内部访问。如果外部应用要访问集群内的服务,集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube-proxy组件将其转发给相关的pod。
而Ingress就是为进入集群的请求提供路由规则的集合,通俗点就是提供外部访问集群的入口,将外部的HTTP或者HTTPS请求转发到集群内部service上。
Ingress-Nginx
Ingress-Nginx组成
Ingress-nginx一般由三个组件组成:
-
反向代理负载均衡器:通常以service的port方式运行,接收并按照ingress定义的规则进行转发,常用的有nginx,Haproxy,Traefifik等,本次实验中使用的就是nginx
-
Ingress Controller:监听APIServer,根据用户编写的ingress规则(编写ingress的yaml文件),动态地去更改nginx服务的配置文件,并且reload重载使其生效,此过程是自动化的(通过lua脚本来实现)
-
Ingress:将nginx的配置抽象成一个Ingress对象,当用户每添加一个新的服务,只需要编写一个新的ingress的yaml文件即可
Ingress-Nginx的工作原理
-
ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化。然后读取它,按照自定义的规则,规则就是写明了那个域名对应哪个service,生成一段nginx配置。
-
再写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入
/etc/nginx.conf
文件中。然后reload一下使配置生效,以此达到分配和动态更新问题。
ingress与ingress-controller
-
ingress对象:指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。
-
ingress-controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。
ingress-controller
ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。
但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据ingress对象生成配置并应用新配置到反向代理,比如nginx-ingress就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置。
nginx-controller原理
# 查看ingress-nginx 命名空间下的pod
kubectl get pods -n ingress-nginx
# 进入ingress-nginx 的pod
kubectl exec nginx-ingress-controller-6779f7d56-26hp6 -n ingress-nginx -- cat /etc/nginx.conf
ingress
ingress是一个API对象,和其他对象一样,通过yaml文件来配置。ingress通过http或https暴露集群内
部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于host的方向代理。ingress要依
靠ingress-controller来具体实现以上功能。
Ingress-Nginx官网地址
基于nginx服务的ingress controller根据不同的开发公司,又分为k8s社区的ingres-nginx和nginx公司的nginx-ingress。
Ingress-Nginx
下载资源文件
根据github上的活跃度和关注人数,我们选择的是k8s社区的ingres-nginx
下载ingrees-controller
打开github官网:选择某一个具体版本后进入 deploy/static/ 目录中,复制mandatory.yaml文件内容。
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.30.0/deploy/static/mandatory.yaml
下载ingress服务
ingress 示例
运行ingress-controller
在mandatory.yaml文件的Deployment资源中增加属性
sepc.template.sepc.hostNetWork: true
hostNetwork网络,这是一种直接定义Pod网络的方式。如果在Pod中使用hostNetwork:true配置网络,那么Pod中运行的应用程序可以直接使用node节点的端口
# 运行ingress/mandatory.yaml文件
kubectl apply -f mandatory.yaml
运行ingress服务
# 运行ingress/service-nodeport.yaml文件
kubectl apply -f service-nodeport.yaml
部署tomcat服务
ingress/tomcat-service.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat-deployment
spec:
replicas: 1
template:
metadata:
name: tomcat-deployment
labels:
app: tomcat-deployment
spec:
containers:
- name: tomcat-deployment
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
restartPolicy: Always
selector:
matchLabels:
app: tomcat-deployment
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
selector:
app: tomcat-deployment
ports:
- port: 8080
targetPort: 8080
nodePort: 30088
type: NodePort
# 运行tomcat-service
kubectl apply -f tomcat-service.yml -n
部署ingress规则文件
ingress/ingress-tomcat.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-test
spec:
rules:
- host: ingress-tomcat.lagou.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat-svc
port:
number: 8080
# 运行ingress规则
kubectl apply -f ingress-tomcat.yml
# 查看ingress
kubectl get ingress
# 查看ingress服务:查看service的部署端口号
kubectl get svc -n ingress-nginx
# 查看ingress-controller运行在那个node节点
kubectl get pod -n ingress-nginx -o wide
通过ingress访问tomcat
修改hosts文件后
159.75.19.155 ingress-tomcat.lagou.com