k8s集群ingress碎碎念

比起君子讷于言而敏于行,我更喜欢君子善于言且敏于行。

目录

前言

[一、Ingress 是什么?](#一、Ingress 是什么?)

[二、Controller 是什么?](#二、Controller 是什么?)

[三、Ingress 的作用](#三、Ingress 的作用)

四、如何实现

[1. 安装 Ingress Controller](#1. 安装 Ingress Controller)

[2. 创建 Ingress 对象](#2. 创建 Ingress 对象)

[3. 高可用建议](#3. 高可用建议)

[4. 外部访问](#4. 外部访问)

总结


前言

ingress单独理解是好理解的,k8s的service、hostnameNetwork单独理解也是好理解的,排列组合用起来确实容易眼花缭乱。万变不离其宗,那就以不变应万变叭~


一、Ingress 是什么?

Ingress 是 Kubernetes 的 HTTP/HTTPS 层流量入口(入口控制器) ,它负责根据 域名和路径 将外部请求路由到集群内部的 Service。

  • Service(ClusterIP / NodePort) → 解决了 "找 Pod" 的问题
  • Ingress → 解决了 "找 Service 里的哪一个路径 / 域名" 的问题

Ingress 本身是一个 K8s 对象 + Controller 的组合,没 Controller 其实不能工作。

二、Controller 是什么?

Ingress Controller = 负责实现 Ingress 对象规则的实际服务

1)Ingress 就是一个"路由清单"或者"路由计划表",告诉 Kubernetes:"域名 myapp.example.com 的流量要送到哪个 Service"。

2)但是这个清单本身 不会自动搬运流量。它只是一个对象,存储在 Kubernetes 里。

3)Ingress Controller 才是真正做路由的程序,它会监听这个清单,把流量送到对应的 Service。

最常见的实现是 nginx,所以很多人说 Ingress Controller = nginx

三、Ingress 的作用

Ingress 的主要作用有:

  1. 基于域名路由:不同域名指向不同 Service

eg: app1.example.com → Service app1

app2.example.com → Service app2

  1. 基于路径路由:同一个域名下,不同路径指向不同 Service

eg: /api → Service api

/web → Service frontend

3.TLS/HTTPS 终端:Ingress 可以绑定证书,为多个域名提供 HTTPS

  1. 负载均衡(应用层):在 Service 之前,Ingress Controller 可以做 Layer7 负载均衡

  2. 跨集群/跨服务访问控制(结合注解或中间件):比如限流、白名单、重定向等

四、如何实现

1. 安装 Ingress Controller

Ingress 本身只是对象,需要 Controller 来真正路由流量。常见有:

  • NGINX Ingress Controller
  • Traefik
  • HAProxy Ingress

安装 NGINX Ingress Controller(简化示例):

复制代码
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.14.0/deploy/static/provider/cloud/deploy.yaml

2. 创建 Ingress 对象

注意:Ingress YAML里的端口 = Service端口

复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - myapp.example.com
    secretName: myapp-tls
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80
  • host → 域名路由
  • paths → 路径路由
  • backend.service.name/port → 指向内部 Service

3. 高可用建议

  • Ingress Controller 使用 Deployment/DaemonSet
    • DaemonSet → 每个节点一个 Pod,保证节点级别高可用
    • Deployment → 多副本 Pod,保证 Pod 高可用
  • hostNetwork: true → 如果要直接占用节点 80/443 端口

4. 外部访问

如果使用 NodePort 类型 Service + Ingress Controller → 外部访问端口在 30000-32767。(可以配置hostNetwork: true 占用节点的80/443端口)

如果使用 hostNetwork + DaemonSet → 外部可以直接访问节点的 80/443(这种方式可以访问每个节点的ip:80/443。但是有url的话,还是得前面再做一层nginx,或者直接用ingress)


总结

这里其实最让人乱七八糟的是端口,ingress的yaml里面写的是service服务的端口。service的yaml里面写的是三个端口。

port: 443 # Service 内部端口,集群内部访问这个 Service 用 443

targetPort: 443 # Pod 的端口,Service 转发到 Pod 444

nodePort: 32443 # 节点上暴露的端口,外部访问节点IP:32443也能访问 Pod

相关推荐
张忠琳11 小时前
【containerd 2.1.8】(Part 1)containerd 2.1.8 超深度源码分析 — 总体架构与模块全景
云原生·kubernetes·containerd
真实的菜13 小时前
微服务注册配置中心终极选型:2026指南
微服务·云原生·架构
正经教主14 小时前
【docker基础】第五课:Docker网络详解
运维·docker·容器
Waay16 小时前
K8s ETCD 详解|备份恢复+静态Pod原理+kubectl查询底层流程(面试必考)
面试·kubernetes·etcd
松岩16 小时前
dcgm-exporter部分指标
kubernetes
我是谁??18 小时前
ubuntu22.04 通过docker部署vLLM(Qwen3-0.6B)大模型+New API+OpenWebUI
docker·容器·vllm
Patrick_Wilson19 小时前
K8s 探针避坑:Next.js 不同部署模式下的健康检查实践
kubernetes·node.js·next.js
运维瓦工19 小时前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器
Plastic garden19 小时前
K8s(10)NFS 的动态 PV 创建数据库给k8s的mysql和redis
docker·容器·kubernetes
Plastic garden19 小时前
k8s(11) Pod 控制器,服务发现与存储管理
kubernetes