0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是Ingress?Igress对外访问的三种方案

阿铭linux 来源:阿铭linux 2023-04-28 14:22 次阅读

什么是Ingress

有了Service之后,我们可以访问这个Service的IP(clusterIP)来请求对应的Pod,但是这只能是在集群内部访问。 要想让外部用户访问此资源,可以使用NodePort,即在node节点上暴漏一个端口出来,但是这个非常不灵活。为了解决此问题,K8s引入了一个新的API资源对象Ingress,它是一个七层的负载均衡器,类似于Nginx。

98bd8d22-e57a-11ed-ab56-dac502259ad0.png

三个核心概念:Ingress、Ingress Controller、IngressClass

Ingress用来定义具体的路由规则,要实现什么样的访问效果;

Ingress Controller是实现Ingress定义具体规则的工具或者叫做服务,在K8s里就是具体的Pod;

IngressClass是介于Ingress和Ingress Controller之间的一个协调者,它存在的意义在于,当有多个Ingress Controller时,可以让Ingress和Ingress Controller彼此独立,不直接关联,而是通过IngressClass实现关联。

Ingress实战

1)编辑ingress YAML文件

vimying.yaml#内容如下
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mying  ##ingress名字


spec:
  ingressClassName: myingc  ##定义关联的IngressClass


  rules:  ##定义具体的规则
  - host: aminglinux.com  ##访问的目标域名
    http:
      paths:
      - path: /
        pathType: Exact
        backend:  ##定义后端的service对象
          service:
            name: ngx-svc
            port:
              number: 80
查看ingress
kubectl get ing
kubectl describe ing mying
2)编辑IngressClass YAML文件
vimyingc.yaml#内容如下
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name:myingc


spec:
  controller: nginx.org/ingress-controller  ##定义要使用哪个controller
查看ingressClass
kubectl get ingressclass

3)安装ingress-controller

首先做一下前置工作

curl -O 'https://gitee.com/aminglinux/linux_study/raw/master/k8s/ingress.tar.gz'
tar zxf ingress.tar.gz
cd ingress
./setup.sh  ##说明,执行这个脚本会部署几个ingress相关资源,包括namespace、configmap、secrect等
编辑controller YAML文件
vi  ingress-controller.yaml #内容如下
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ngx-ing
namespace:nginx-ingress


spec:
  replicas: 1
  selector:
    matchLabels:
app:ngx-ing


  template:
    metadata:
      labels:
        app: ngx-ing
     #annotations:
       #prometheus.io/scrape: "true"
       #prometheus.io/port: "9113"
       #prometheus.io/scheme: http
    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: nginx/nginx-ingress:2.2-alpine
        imagePullPolicy: IfNotPresent
        name: ngx-ing
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        - name: readiness-port
          containerPort: 8081
        - name: prometheus
          containerPort: 9113
        readinessProbe:
          httpGet:
            path: /nginx-ready
            port: readiness-port
          periodSeconds: 1
        securityContext:
          allowPrivilegeEscalation: true
          runAsUser: 101 #nginx
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -ingress-class=myingc
          - -health-status
          - -ready-status
--nginx-status


          - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
          - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
应用YAML
kubectl apply -f ingress-controller.yaml
查看pod、deployment:
kubectl get po -n nginx-ingress
kubectl get deploy -n nginx-ingress
将ingress对应的pod端口映射到master上临时测试:
kubectl port-forward -n nginx-ingress ngx-ing-547d6575c7-fhdtt 8888:80 &
注意,测试前可以修改ng-deploy对应的两个pod里的/usr/share/nginx/html/index.html文件内容,用于区分两个pod。 使用curl测试:
curl -x127.0.0.1:8888 aminglinux.com
或者:
curl -H 'Host:aminglinux.com' http://127.0.0.1:8888
Igress对外访问的三种方案

上面对ingress做端口映射,然后通过其中一个节点的IP来访问ingress只是一种临时方案。那么正常如何做呢?有三种常用的方案:

1)Deployment+LoadBalancer

如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。 大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。 只要把域名解析指向该地址,就实现了集群服务的对外暴露。

2)Deployment+NodePort

同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。 由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。 NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。

3)DaemonSet+nodeSelector

用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通(如,上面的临时方案kubectl port-forward),直接使用宿主机的80/433端口就能访问服务。 这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。 缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。比较适合大并发的生产环境使用。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • nginx
    +关注

    关注

    0

    文章

    143

    浏览量

    12161
  • YAML
    +关注

    关注

    0

    文章

    21

    浏览量

    2314
  • 负载均衡器
    +关注

    关注

    0

    文章

    18

    浏览量

    2577

原文标题:一篇文章助你搞懂Ingress

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Kubernetes Ingress 高可靠部署最佳实践

    在Kubernetes集群中,Ingress是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力,您可以通过 Ingress 配置提供外部可访问的 URL、负载均衡、SSL、基于名称的虚拟主机等。作为集群流量
    发表于 04-17 14:35

    三种访问过程映像的方法

    硬实时的需求。用户可以通过python等高级语言编写程序,并且可以通过存储器中的过程映像便捷的写入或者读取所有当前过程值。本文将介绍从过程映像中访问数据的三种方法:直接从文件中读取、ioctl以及
    发表于 02-02 16:40

    常见的三种无线接入方式是什么?

    蓝牙无线组网的优点是什么?常见的三种无线接入方式是什么?蓝牙无线组网原理与上网方案分享
    发表于 05-26 06:33

    三种电源方案

    三种电源方案   电源+充电线路方案               &
    发表于 11-13 15:05 1094次阅读

    三种3D眼镜解决方案

    介绍了三种3D眼镜解决方案,MSP430方案,TPS65835方案,射频穿梭3D电视眼镜。
    发表于 09-14 10:23 36次下载
    <b class='flag-5'>三种</b>3D眼镜解决<b class='flag-5'>方案</b>

    阿里云Serverless Kubernetes通过Ingress提供7层服务访问

    摘要: 在阿里云Serverless Kubernetes集群中,我们可以通过LoadBalancer Service对外提供四层服务访问,同样我们也可以通过Ingress对外提供七
    发表于 07-23 14:02 1770次阅读
    阿里云Serverless Kubernetes通过<b class='flag-5'>Ingress</b>提供7层服务<b class='flag-5'>访问</b>

    访问集成Xilinx模数转换器的三种方法介绍

    了解访问集成Xilinx模数转换器(XADC)的三种方法; 通过直接连接到PS,作为PS或Microblaze的AXI外设,或作为逻辑的IP核。
    的头像 发表于 11-20 06:16 2631次阅读

    三种pads解决方案的对比

    三种垫解决方案交付核心能力来加速你的设计周期,提高生产率,提高质量。了解每个解决方案当你开始你的比较过程。
    的头像 发表于 10-30 07:06 3434次阅读

    C语言访问MCU寄存器的三种方式

    C语言访问MCU寄存器的三种方式 MCU中的特殊功能寄存器SFR,实际上就是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有3方法。
    发表于 10-28 17:21 11次下载
    C语言<b class='flag-5'>访问</b>MCU寄存器的<b class='flag-5'>三种</b>方式

    刺激能量收集发展的三种解决方案

    新技术星期二:刺激能量收集发展的三种解决方案
    的头像 发表于 12-30 09:40 549次阅读

    《中新社》关注“本源悟空”境外访问量美国排第一

    走进本源量子计算机组装与测试实验室,中国第代自主超导量子计算机“本源悟空”正伴随着机器运行的嗡鸣声,运算来自世界各地的量子计算任务。据介绍,在“本源悟空”的境外访问
    的头像 发表于 07-06 08:22 264次阅读
    《中新社》关注“本源悟空”境<b class='flag-5'>外访问</b>量美国排第一

    从零到一:构建高效稳定的HTTP海外访问策略

    在当今全球化的互联网时代,无论是企业拓展海外市场,还是个人追求更广阔的信息视野,高效稳定的HTTP海外访问策略都显得尤为重要。
    的头像 发表于 09-24 08:03 187次阅读

    探索HTTP海外访问的奥秘:解锁全球互联网资源

    探索HTTP海外访问的奥秘,实际上是在揭开如何高效、安全地解锁全球互联网资源的面纱。
    的头像 发表于 09-24 08:11 239次阅读

    优化HTTP海外访问:技术挑战与解决方案

    优化HTTP海外访问需要从多个方面入手,包括使用CDN加速、部署代理服务器或VPN、优化网络路由、采用高效的网络协议、加强数据安全与隐私保护以及选择可靠的云服务提供商等。
    的头像 发表于 09-25 08:08 219次阅读

    HTTP海外访问优化:提升跨国网络性能的秘诀

    HTTP海外访问优化是提升跨国网络性能的关键,涉及多个方面的技术和策略。
    的头像 发表于 10-15 08:04 276次阅读