当前位置: 首页 > news >正文

Service与Ingress:如何将你的应用暴露给世界

引言:从“内部通讯”到“对外开放”

想象Kubernetes集群是一座繁忙的办公楼,每个Pod(容器)是楼内的员工。

  • Service 就像前台的接待员,负责将外部电话(请求)转接到正确的员工(Pod)。

  • Ingress 则是整栋楼的门卫,管理所有入口通道,支持复杂的访客规则(如VIP通道、安全检查)。

本文将教你如何通过 ServiceIngress 让外部用户安全访问你的应用!


一、Service:内部服务的交通枢纽

1.1 为什么需要Service?

  • Pod是动态的:Pod可能随时被销毁或重建,IP地址不固定。

  • 负载均衡需求:多个Pod副本需要共享流量。

Service的作用:为Pod提供稳定的虚拟IP(VIP)和DNS名称,实现服务发现与负载均衡。


1.2 Service的三种类型

1. ClusterIP(默认)
  • 用途:仅供集群内部访问(如微服务间通信)。

  • 示例配置

    
    apiVersion: v1
    
    kind: Service
    
    metadata:
    
      name: internal-service
    
    spec:
    
      selector:
    
        app: my-app
    
      ports:
    
        - protocol: TCP
    
          port: 80 # Service端口
    
          targetPort: 8080 # Pod端口
    
      type: ClusterIP
    
    
2. NodePort
  • 用途:通过节点IP(master节点的对外ip)+固定端口暴露服务,适合开发测试。

  • 端口范围:30000-32767。

  • 示例访问http://<节点IP>:30080

    
    spec:
    
      type: NodePort
    
      ports:
    
        - port: 80
    
          targetPort: 8080
    
          nodePort: 30080 # 手动指定端口(可选)
    
    
3. LoadBalancer
  • 用途:在云平台上自动创建外部负载均衡器(如AWS ELB)。

  • 示例

    
    spec:
    
      type: LoadBalancer
    
    

1.3 动手实验:暴露一个NodePort服务

步骤1:创建Deployment(若尚未存在)

kubectl create deployment web-app --image=nginx:1.25 --replicas=3

步骤2:创建NodePort Service

# web-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: web-service

spec:

  selector:

    app: web-app

  ports:

    - protocol: TCP

      port: 80

      targetPort: 80

  type: NodePort


kubectl apply -f web-service.yaml

步骤3:访问服务

kubectl get svc web-service

输出示例:



NAME          TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
web-service   NodePort   10.99.62.165   <none>        80:31362/TCP   55s


通过浏览器访问:http://<你的节点IP>:31555(如 http://localhost:31555)。

在这里插入图片描述


二、Ingress:高级流量路由管家

2.1 为什么需要Ingress?

  • Service的限制

    • 每个Service需独立端口,难以管理。

    • 不支持基于域名或路径的路由。

  • Ingress的功能

    • 通过域名和路径将流量分发到不同Service。

    • 支持HTTPS、SSL终止、身份验证等。


2.2 安装Ingress控制器

Ingress需要配合控制器(如Nginx、Traefik)使用,以Nginx为例:


# 使用Helm安装(需提前安装Helm)

helm upgrade --install ingress-nginx ingress-nginx \

  --repo https://kubernetes.github.io/ingress-nginx \

  --namespace ingress-nginx --create-namespace



# 验证安装

kubectl get pods -n ingress-nginx


2.3 配置Ingress规则

场景:通过不同域名访问两个应用
  • blog.example.com → 博客服务(Service: blog-service)

  • shop.example.com → 商城服务(Service: shop-service)


# example-ingress.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: example-ingress

spec:

  rules:

  - host: blog.example.com # 域名1

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: blog-service

            port:

              number: 80

  - host: shop.example.com # 域名2

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: shop-service

            port:

              number: 80

应用配置

kubectl apply -f example-ingress.yaml


2.4 配置HTTPS(可选)

步骤1:准备证书(以自签名证书为例)

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \

  -keyout tls.key -out tls.crt -subj "/CN=example.com"

步骤2:创建Secret

kubectl create secret tls example-tls --cert=tls.crt --key=tls.key

步骤3:更新Ingress配置

spec:

  tls:

  - hosts:

      - blog.example.com

      - shop.example.com

    secretName: example-tls


三、常见问题与解决

  1. Service无法访问

    • 检查Service的selector是否与Pod标签匹配。

    • 确认防火墙开放了NodePort或LoadBalancer端口。

  2. Ingress返回404错误

    • 检查Ingress控制器的Pod是否正常运行。

    • 查看Ingress日志:

      
      kubectl logs -n ingress-nginx <ingress-controller-pod>
      
      
  3. HTTPS证书不生效

    • 确认Secret的名称与Ingress中secretName一致。

    • 检查证书域名是否与Ingress规则中的host匹配。


四、总结与下一步

通过本文,你学会了:

  • Service:为Pod提供稳定的内部/外部访问入口。

  • Ingress:通过域名和路径实现高级路由与HTTPS支持。



资源推荐

  • Ingress-Nginx官方文档

  • Kubernetes Service类型详解


现在,你的应用已经可以向全世界say hello了!🎉 无论是内部微服务还是面向用户的Web应用,Service和Ingress都是不可或缺的桥梁。

相关文章:

  • 嵌入式 ARM Linux 系统构成(6):应用层(Application Layer)
  • VSTO(C#)Excel开发1:起步 示例项目
  • 【从零开始学习计算机科学】计算机组成原理(二)信息表示与编码
  • Ardupilot开源无人机之Geek SDK进展2025Q1
  • 用AI学习ANN人工神经网络2——什么是Transformer
  • Element使用
  • 力扣72题编辑距离
  • 【弹性计算】异构计算云服务和 AI 加速器(三):GPU 虚拟化技术
  • nuxt2 打包优化使用“compression-webpack-plugin”插件
  • Docker常用命令清单
  • python用户图形界面wxpython库安装与使用
  • S19文件格式详解:汽车ECU软件升级中的核心镜像格式
  • 谷歌浏览器中 Google 翻译无法使用的解决办法
  • AcWing 5538. 回文游戏 博弈论
  • 从零开始学机器学习——网络应用
  • Spring Batch 概览
  • 数据库---1.0
  • FY-3D MWRI亮温绘制
  • 【C++】深入理解C++模板:从原理到实践
  • VMware虚拟机迁移失败的故障排查方法
  • 复旦大学艺术馆开馆:以当代视角再看文科文脉
  • 从《缶翁的世界》开始,看吴昌硕等湖州籍书画家对海派的影响
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 纽约市长称墨海军帆船撞桥已致2人死亡,撞桥前船只疑似失去动力
  • 马上评|科学红毯,让科学家成为“最亮的星”
  • 3月中国减持189亿美元美债、持仓规模降至第三,英国升至第二