赞
踩
目前使用svc资源做网络暴露,使用nodeport类型,一个业务对应一个宿主机端口,那么如果业务多了,所占用的宿主机端口也就多了,虽然说宿主机端口一般情况下都是够用的,但是,对于研发、运维来讲,不同业务不同的端口,业务如果过多,管理起来就更加费力;
1,集群宿主机端口占用太多
2,当一个端口需要被多个服务使用的时候,就力不从心了,假设两个业务,都想要用443端口,那么就无法使用了;
ingress资源,是k8s中抽象的资源,给管理员提供暴露服务的入口“自定义”的方法,换句话说就是编辑网络暴露入口的规则;
ingress资源,根据ingress生成具体的“路由规则”,同时借助SVC资源实现pod的负载均衡;
使用ingress设置外部访问路由规则,需要有附加组件traefik的支持;
安装方式有很多种,可以在traefik官网查看,本次教学,我们使用刚刚学过的helm方式安装;
[root@k8s231 ingress]# helm repo add traefik https://traefik.github.io/charts
"traefik" has been added to your repositories
[root@k8s231 ingress]# helm repo update
[root@k8s231 ingress]# helm pull traefik/traefik
[root@k8s231 ingress]# tar xf traefik-26.1.0.tgz
因为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
[root@k8s231 ingress]# helm install xinjizhiwatraefik traefik
注意:等待traefik的pod拉取成功,编程running之后,再做下一步操作哦;
[root@k8s231 ingress]# kubectl get pods
通过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
至此,ingress资源的依赖traefik组件就部署成功了;
1,traefik对外暴露宿主机的两个端口,然后转发到trafik的svc暴露的80和443端口;
[root@k8s231 template]# kubectl get svc
2,traefik将域名通过ingress规则,转发到对应业务服务的svc资源上
3,也正因为这个方式,使得业务本身的svc不需要再对外使用宿主机暴露端口了;
4,任何请求,都先到traefik中;
[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
[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
10.0.0.231 www.xinjizhiwa.com www.xjzw.com
www.xinjizhiwa.com:30608
zabbix.xinjizhiwa.com:30608
https://zabbix.xinjizhiwa.com:31605
多traefik实现高可用;
至此,k8s的七层反向代理,traefik组件配合ingress规则学习完毕;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。