一、ingress概述
1,引发问题
目前使用svc资源做网络暴露,使用nodeport类型,一个业务对应一个宿主机端口,那么如果业务多了,所占用的宿主机端口也就多了,虽然说宿主机端口一般情况下都是够用的,但是,对于研发、运维来讲,不同业务不同的端口,业务如果过多,管理起来就更加费力;
2,总结
1,集群宿主机端口占用太多
2,当一个端口需要被多个服务使用的时候,就力不从心了,假设两个业务,都想要用443端口,那么就无法使用了;
3,ingress资源
ingress资源,是k8s中抽象的资源,给管理员提供暴露服务的入口“自定义”的方法,换句话说就是编辑网络暴露入口的规则;
ingress资源,根据ingress生成具体的“路由规则”,同时借助SVC资源实现pod的负载均衡;
二、部署ingress资源的依赖组件traefik
使用ingress设置外部访问路由规则,需要有附加组件traefik的支持;
参考链接:Traefik Installation Documentation - Traefik
安装方式有很多种,可以在traefik官网查看,本次教学,我们使用刚刚学过的helm方式安装;
1,添加traefik的helm仓库
[root@k8s231 ingress]# helm repo add traefik https://traefik.github.io/charts
"traefik" has been added to your repositories
2,更新helm仓库
[root@k8s231 ingress]# helm repo update
3,拉取traefik的chart压缩包
[root@k8s231 ingress]# helm pull traefik/traefik
4,解压chart压缩包
[root@k8s231 ingress]# tar xf traefik-26.1.0.tgz
5,修改traefik中的svc类型
因为traefik的svc类型默认是云端负载均衡器的类型(loadbancer),为了学习,我们需要将其修改为nodeport;
将787行的service类型,type改成NodePort
[root@k8s231 ingress]# vim traefik/values.yaml +787
782 service:
783 enabled: true
784 ## -- Single service is using `MixedProtocolLBService` feature gate.
785 ## -- When set to false, it will create two Service, one for TCP and one for UDP.
786 single: true
787 #type: LoadBalancer
788 type: NodePort
6,安装traefik的chart
[root@k8s231 ingress]# helm install xinjizhiwatraefik traefik
注意:等待traefik的pod拉取成功,编程running之后,再做下一步操作哦;
[root@k8s231 ingress]# kubectl get pods
7,暴露traefik的dashboard管理页面
通过traefik的dashboard就可以页面访问查看访问路由了;
[root@k8s231 ingress]# kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000 --address 0.0.0.0
8,浏览器访问k8s集群的9000端口
浏览器访问:http://10.0.0.231:9000/dashboard/#/
至此,ingress资源的依赖traefik组件就部署成功了;
三、traefik组件与ingress之间的关系
1,traefik对外暴露宿主机的两个端口,然后转发到trafik的svc暴露的80和443端口;
[root@k8s231 template]# kubectl get svc
2,traefik将域名通过ingress规则,转发到对应业务服务的svc资源上
3,也正因为这个方式,使得业务本身的svc不需要再对外使用宿主机暴露端口了;
4,任何请求,都先到traefik中;
四、ingress规则七层反向代理实战
1,模拟两个业务服务网
· 创建【业务一】
[root@k8s231 template]# cat 01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm01
spec:
replicas: 3
selector:
matchLabels:
k8s: xinjizhiwa
template:
metadata:
labels:
k8s: xinjizhiwa
spec:
containers:
- name: c1
image: nginx:1.20.1-alpine
---
apiVersion: v1
kind: Service
metadata:
name: svc01
spec:
ports:
- port: 80
targetPort: 80
selector:
k8s: xinjizhiwa
[root@k8s231 template]# kubectl apply -f 01.yaml
· 创建【业务二】
[root@k8s231 template]# cat 02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm02
spec:
replicas: 3
selector:
matchLabels:
k8s: xjzw
template:
metadata:
labels:
k8s: xjzw
spec:
containers:
- name: c1
image: nginx:1.24.0-alpine
---
apiVersion: v1
kind: Service
metadata:
name: svc02
spec:
ports:
- port: 80
targetPort: 80
selector:
k8s: xjzw
[root@k8s231 template]# kubectl apply -f 02.yaml
2,创建ingress资源(设置路由规则)
[root@k8s231 template]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress01
annotations:
#指定ingress控制器为“traefik”;
kubernetes.io/ingress.class: traefik
spec:
#设置ingress的访问规则;
rules:
#访问ingress的主机名称是什么?谁来访问我?就是“域名”
- host: www.xinjizhiwa.com
#定义http相关的规则
http:
#指定这个规则的域名,路由到哪个SVC上?
paths:
#指定svc的信息
- backend:
service:
#svc名称
name: svc01
#svc访问端口
port:
number: 80
#指定匹配的类型,此处我们使用“前缀匹配”,(容错性比较强)
pathType: Prefix
path: "/"
#path: "/333"
#访问ingress的主机名称是什么?谁来访问我?就是“域名”
- host: zabbix.xinjizhiwa.com
#定义http相关的规则
http:
#指定这个规则的域名,路由到哪个SVC上?
paths:
#指定svc的信息
- backend:
service:
#svc名称
name: svc02
port:
number: 80
pathType: Prefix
path: "/"
[root@k8s231 template]# kubectl apply -f ingress.yaml
3,本地浏览器解析两个域名
10.0.0.231 www.xinjizhiwa.com www.xjzw.com
4,浏览器使用域名访问
· 【业务一】访问traefik模拟的80端口
www.xinjizhiwa.com:30608
· 【业务一】访问traefik模拟的443端口
https://www.xinjizhiwa.com:31605/
· 【业务二】访问traefik模拟的80端口
zabbix.xinjizhiwa.com:30608
· 【业务二】访问traefik模拟的443端口
https://zabbix.xinjizhiwa.com:31605
五,企业级ingress架构(了解)
多traefik实现高可用;
至此,k8s的七层反向代理,traefik组件配合ingress规则学习完毕;