一、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@master ~]# helm repo add traefik https://traefik.github.io/charts
"traefik" has been added to your repositories
2,更新helm仓库
[root@master ~]# helm repo update
3,拉取traefik的chart压缩包
[root@master ingress]# helm pull traefik/traefik
4,解压chart压缩包
[root@master ingress]# tar xf traefik-28.0.0.tgz
5,修改traefik中的svc类型
因为traefik的svc类型默认是云端负载均衡器的类型(loadbancer),为了学习,我们需要将其修改为nodeport;这个根据自己需求更改。
[root@master ingress]# vim traefik/values.yaml
6,安装traefik的chart
创建名称空间
[root@master ~]# kubectl create ns ingress-traefik
namespace/ingress-traefik created
traefik安装在名称空间中
[root@master ingress]# helm install ingress-traefik traefik -n ingress-traefik
NAME: ingress-traefik
LAST DEPLOYED: Mon May 13 15:02:55 2024
NAMESPACE: ingress-traefik
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Traefik Proxy v3.0.0 has been deployed successfully on ingress-traefik namespace !
注意:等待traefik的pod拉取成功,编程running之后,再做下一步操作哦;
7,暴露traefik的dashboard管理页面
通过traefik的dashboard就可以页面访问查看访问路由了;
[root@master ingress]# kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" -n ingress-traefik --output=name) -n ingress-traefik 9000:9000 --address 0.0.0.0 &
8,浏览器访问k8s集群的9000端口
至此,ingress资源的依赖traefik组件就部署成功了;
三、traefik组件与ingress之间的关系
1,traefik对外暴露宿主机的两个端口,然后转发到trafik的svc暴露的80和443端口;
[root@master ingress]# kubectl get svc -n ingress-traefik
ps: 因为我这里修改过k8s的端口访问,所以映射到暴露端口可能不在30000以上
2,traefik将域名通过ingress规则,转发到对应业务服务的svc资源上
3,也正因为这个方式,使得业务本身的svc不需要再对外使用宿主机暴露端口了;
4,任何请求,都先到traefik中;
四、ingress规则七层反向代理实战
1,模拟两个业务服务网
· 创建【业务一】
[root@master ingress]# cat 01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm01
spec:
replicas: 3
selector:
matchLabels:
k8s: dolphin-ingress
template:
metadata:
labels:
k8s: dolphin-ingress
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: dolphin-ingress
[root@master ingress]# kubectl apply -f 01.yaml
· 创建【业务二】
[root@master ingress]# cat 02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm02
spec:
replicas: 3
selector:
matchLabels:
k8s: dolphin-ingress2
template:
metadata:
labels:
k8s: dolphin-ingress2
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: dolphin-ingress2
[root@master ingress]# kubectl apply -f 01.yaml
2,创建ingress资源(设置路由规则)
注意:ingress是跟名称空间绑定的,只能路由到自己名称空间下
[root@master ingress]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress01
annotations:
#指定ingress控制器为“traefik”;我了解到目前有nginx和traefik两个控制器
kubernetes.io/ingress.class: traefik
spec:
#设置ingress的访问规则;
rules:
#访问ingress的主机名称是什么?谁来访问我?就是“域名”
- host: www.dolphin.com
#定义http相关的规则
http:
#指定这个规则的域名,路由到哪个SVC上?
paths:
#指定svc的信息
- backend:
service:
#svc名称
name: svc01
#svc访问端口
port:
number: 80
#指定匹配的类型,此处我们使用“前缀匹配”,(容错性比较强)
pathType: Prefix
path: "/"
#path: "/333"
#访问ingress的主机名称是什么?谁来访问我?就是“域名”
- host: www.dolphin2.com
#定义http相关的规则
http:
#指定这个规则的域名,路由到哪个SVC上?
paths:
#指定svc的信息
- backend:
service:
#svc名称
name: svc02
port:
number: 80
pathType: Prefix
path: "/"
[root@master ingress]# kubectl apply -f ingress.yaml
ingress.networking.k8s.io/ingress01 unchanged
3,本地浏览器解析两个域名
windows: C:\Windows\System32\drivers\etc\hosts
192.168.190.200 www.dolphin.com www.dolphin2.com
4,浏览器使用域名访问
访问80端口(24617) http
访问443端口(4134)https
五,企业级ingress架构(了解)
多traefik实现高可用;