Kubernetes的七层代理-Ingress资源

一、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端口

http://192.168.190.200:9000/dashboard/#/

至此,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实现高可用;

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值