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都是不可或缺的桥梁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux学习篇】--开发工具第一期

目录 1. Linux编辑器的使用--vim使用 1.1 vim的基本概念 1.2 vim基本操作 1.3 vim正常模式&#xff08;指令模式&#xff09;命令集 1.4 vim末行模式命令集 1.5 vim配置 2. Linux编译器-gcc/g使用 2.1 背景知识 2.2 gcc如何完成 2.3 gcc选择项 1. Linux编…

Elastic:AI 会开始取代网络安全工作吗?

作者&#xff1a;来自 Elastic Joe DeFever 不会&#xff0c;但它正在从根本上改变这些工作。 生成式 AI (GenAI) 正迅速成为日常安全工作流程中的一个重要组成部分。那么&#xff0c;它是合作伙伴还是竞争对手&#xff1f; GenAI 技术在安全堆栈几乎每个方面的广泛应用&#…

Windows 11 IoT 企业版 LTSC 2025 特制适度 22635.5025

文件: Windows 11 IoT 企业版 LTSC 2025 特制适度 22635.5025 install.esd 大小: 2.57G&#xff08;2768694310 字节&#xff09; 修改时间: 2025年3月9日, 星期日, 11 : 40 : 15 MD5: BFCB23BC2F78CA9243FFA68D5DDDDFC1 SHA1: C4D8BBF8B8D8E0E8E49DE5E9CC8D7F77385A745A CRC32…

Lab18_ SQL injection with filter bypass via XML encoding

文章目录 前言&#xff1a;进入实验室构造 payload 前言&#xff1a; 实验室标题为&#xff1a; 通关 XML 编码绕过过滤器的 SQL 注入 简介&#xff1a; 此实验室的库存检查功能中存在 SQL 注入漏洞。查询结果在应用程序的响应中返回&#xff0c;因此您可以使用 UNION 攻击…

kali虚拟机登录页面发癫 大写锁定输入不了密码

不知道怎么了 总是发癫 重启切换太麻烦了 还有时候不成功 kali其实可以开启虚拟键盘 如下 就解决的 发癫kali 发癫 发癫

【汇编语言】单片机程序执行过程

一、任务需求 指示灯LED4闪烁&#xff0c;亮0.5秒&#xff0c;灭0.5秒&#xff0c;无限循环 二、针对硬件的编程 1、确定原理图2、确定硬件的物理关系 三、设计步骤 1.用自己的语言描述工作流程 1.1指示灯LED4亮1.2延时0.5秒1.3指示灯LED4灭1.4延时0.5秒1.5跳转到1.1步 …

【Linux篇】调试器-gdb/cgdb使用

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;Liunx &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路&#xff01; 文章目录 1. 前言2.关于gdb2.1 快速认识gdb2.2 安装cgdb2.3 gdb命令2.4 调试 & 断点 3.常见技巧3.…

ThinkPhp 5 安装阿里云内容安全(绿化)

composer require alibabacloud/green-20220302 首先要把php5(不支持php7)的执行文件设置到PATH环境变量 此外还要先执行composer update php5.5和php5.6的区别 5.5认为 <? 开头的也是php文件&#xff0c;包括 <?php 5.6认为 <? 开头的不是php文件&#xff0c;只…

Level DB --- 写流程计算

写流程架构Level DB --- 写流程架构-CSDN博客已经介绍&#xff0c;写流程计算包括写日志&#xff0c;和将kv插入到memtable中。 写日志和写memtable 用户端插入的kv数据&#xff0c;既要写日志同时也要写memtable。写日志是指kv记录要同步到日志文件中&#xff1b;写memtable…

JavaWeb-servlet6中过滤器和监听器

Servlet 过滤器 Servlet 过滤器&#xff08;Filter&#xff09;与 Servlet 十分相似&#xff0c;但 Filter 具有拦截客户端请求的功能&#xff0c; Filter 可以改变请求中的内容&#xff0c;以便满足实际开发中的需要。对于程序开发人员而言&#xff0c; Filter 实质上就是 We…

SQL PLUS与Oracle数据库的交互

一、SQL Plus与数据库的交互 可以 使用2种基本类型的命令与数据库进行交互&#xff1a; 服务器执行的命令&#xff1a;SQLQ命令&#xff08;以&#xff1b;结束&#xff09;和PL/SQL程序块&#xff08;以/结束&#xff09; 本地命令&#xff1a;SQL Plus命令 二、设置SQL Pl…

Git系列之git tag和ReleaseMilestone

以下是关于 Git Tag、Release 和 Milestone 的深度融合内容&#xff0c;并补充了关于 Git Tag 的所有命令、详细解释和指令实例&#xff0c;条理清晰&#xff0c;结合实际使用场景和案例。 1. Git Tag 1.1 定义 • Tag 是 Git 中用于标记特定提交&#xff08;commit&#xf…

WinForm模态与非模态窗体

1、模态窗体 1&#xff09;定义&#xff1a; 模态窗体是指当窗体显示时&#xff0c;用户必须先关闭该窗体&#xff0c;才能继续与应用程序的其他部分进行交互。 2&#xff09;特点&#xff1a; 窗体以模态方式显示时&#xff0c;会阻塞主窗体的操作。用户必须处理完模态窗体上…

关闭Windows安全中心,解析与实操指南

在这个数字化时代&#xff0c;Windows操作系统作为我们日常工作和娱乐的基石&#xff0c;其内置的Windows安全中心&#xff08;Windows Defender Security Center&#xff09;在保护系统安全方面扮演着重要角色。然而&#xff0c;对于某些高级用户或特定需求场景&#xff0c;关…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 标签库:自定义标签的开发与应用

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、JSP 标签…

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包&#xff08;closures&#xff09;被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量&#xff0c;即使外部函数已执行完毕&#xff0c;这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解&#xff0c;尤其在变量捕获和…

根据指定 Excel 模板将 Excel 明细数据生成新的 Excel 文档

在日常工作中&#xff0c;我们常常需要生成 Excel 文档&#xff0c;例如将 Excel 数据 自动转换为独立的 Excel 文件。在这种需求下&#xff0c;如何高效地将 Excel 表格 中的每一条数据生成一个对应的 Excel 文档&#xff0c;并且让文档中的内容根据 Excel 数据动态变化&#…

前端杂的学习笔记

什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器/反向代理服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;并且支持热部署&#xff0c;启动简单&#xff0c;可以做到7*24不间断运行 正代和反代 学习nginx&a…

C#控制台应用程序学习——3.8

一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库&#xff0c;C# 程序可以方便地调用这些类库来实现各种功能&#xff0c;如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…