k8s 对外服务之 Ingress(七层代理)

一    Ingress 简介 理论方面

1, k8s service 作用

对集群内部:

它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制

 对集群外部:

对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问

2,外部的应用能够访问集群内的服务   的方法

NodePort:将service暴露在节点网络上,NodePort背后就是Kube-Proxy,Kube-Proxy是沟通service网络、Pod网络和节点网络的桥梁。
测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理就是个灾难。因为每个端口只能是一种服务,端口范围只能是 30000-32767

LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。受限于云平台,且通常在云平台部署LoadBalancer还需要额外的费用。
在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。

externalIPsservice允许为其分配外部IP,如果外部IP路由到集群中一个或多个Node上,Service会被暴露给这些externalIPs。通过外部IP进入到集群的流量,将会被路由到Service的Endpoint上。 

Ingress:只需一个或者少量的公网IP和LB,即可同时将多个HTTP服务暴露到外网,七层反向代理。
可以简单理解为service的service,它其实就是一组基于域名和URL路径,把用户的请求转发到一个或多个service的规则
 

在 Kubernetes (k8s) 中,NodePort, LoadBalancer, externalIPs, 和 Ingress 都是用来暴露服务到集群外部的不同方法,各自有其特定的使用场景和特点:

NodePort

  • 概念:NodePort 服务会在集群中每个节点上打开一个特定的端口,并将这个端口上的流量转发到 Service 的 backend pod 上。它是 Kubernetes 内置的最简单的一种服务暴露方式。           nodeport 简单粗暴理解就是 把容器端口映射 真机端口 再通过 kube-proxy 的 pod 处理流量
  • 使用场景:适用于测试环境或小规模部署,不需要复杂的负载均衡设置,只需要直接通过节点 IP 和 NodePort 访问服务。
  • 区别:相对简单,但不够灵活,随着服务数量增加,管理众多端口变得困难。

LoadBalancer

  • 概念:LoadBalancer 类型的服务会利用云提供商的负载均衡器(如 AWS ELB、GCP LB 等),自动创建一个外部负载均衡器,并将流量分发到集群中的节点。
  • 使用场景:适用于生产环境,需要高可用性和自动扩展的服务。尤其适合需要云提供商负载均衡支持的场景。
  • 区别:提供了更高级的流量管理和负载均衡功能,但依赖于云提供商支持,可能产生额外费用。

externalIPs

  • 概念:通过 externalIPs 字段,可以在 Service 定义中直接指定一个或多个外部 IP 地址,集群会将这些 IP 地址绑定到 Service 上,从而允许外部流量直接通过这些 IP 访问服务                            externalIPs 简单粗暴理解 就是把想要通过的ip 开小灶告诉service
  • 使用场景:适用  于已有外部负载均衡器或具有固定公网 IP 的情况,希望直接利用这些资源来路由流量到 Service。
  • 区别:提供了灵活性,允许使用自定义的外部 IP,但配置和管理外部负载均衡器的责任在于用户。

Ingress

  • 概念:Ingress 是一种更高级的流量路由规则集合,它根据 HTTP/HTTPS 路径或主机头等规则,将外部请求路由到集群内的不同服务。通常背后需要一个 Ingress Controller(如 Nginx Ingress Controller)来实现实际的路由逻辑。
  • 使用场景:适用于微服务架构,特别是当有多个服务需要对外暴露,并且需要基于 URL 路径或主机名进行路由时。
  • 区别:提供了一层七层(应用层)的路由,支持复杂的路由规则,如路径基于的路由、TLS 终端等,非常适合现代微服务架构。  ingress 简单粗暴理解 就是 有个nginx 的pod(实际是ingress controller) 做七层反向代理

总结

  • 选择依据:选择哪种暴露方式取决于服务的需求、部署环境以及对可扩展性、安全性、成本控制的要求。对于简单的服务或测试环境,NodePort 或 externalIPs 可能足够;而对于生产环境、复杂路由需求或需要云提供商支持的高可用服务,则倾向于使用 LoadBalancer 或 Ingress

3,  Ingress 组成

3.1   Ingress

●ingress:  nginx配置文件
ingress是一个API对象,通过yaml文件来配置,ingress对象的作用是定义请求如何转发到service的规则,可以理解为配置模板。
ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS以及基于域名的反向代理。ingress要依靠 ingress-controller 来具体实现以上功能。
 

3.2  ingress-controller

●ingress-controller:    当做反向代理或者说是转发器
ingress-controller是具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。
一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据 ingress对象生成配置并应用新配置到反向代理,比如ingress-nginx就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置。为了方便,后面的例子都以k8s官方维护的ingress-nginx为例。

Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx
Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/
 

总结:

ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller, 而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名、哪些URL要转发到哪些service等等。
 

4,  Ingress 工作原理

(1)ingress-controller通过和 kubernetes API

### Kubernetes 上部署 KKFileView 并启用 HTTPS 为了在 Kubernetes 中成功部署 KKFileView 应用程序并配置 HTTPS 支持,需遵循一系列操作来确保服务的安全性和可用性。 #### 准备工作 首先确认集群内 DNS 解析正常运作。如果遇到 `server can't find kubernetes.default.svc.cluster.local: NXDOMAIN` 的错误提示,则表明存在内部域名解析失败的情况[^1]。这可能影响到后续的服务发现机制以及应用间的通信稳定性。因此,在继续之前应解决此类问题,可以通过检查 CoreDNS 配置或网络插件设置来进行排查。 #### 创建命名空间 建议为项目创建独立的命名空间以便于资源管理和权限控制: ```yaml apiVersion: v1 kind: Namespace metadata: name: kkfileview ``` #### 构建 Docker 镜像 构建包含 KKFileView 应用程序的 Docker 镜像,并推送到私有仓库或者公共镜像库中。注意版本号的选择要与实际环境相匹配。 #### 编写 Deployment 文件 定义用于运行 Pod 的控制器对象,这里采用官方推荐的方式即 Deployment 来管理无状态的应用实例: ```yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: kkfileview name: kkfileview-deployment spec: replicas: 2 selector: matchLabels: app: kkfileview template: metadata: labels: app: kkfileview spec: containers: - image: your-docker-repo/kkfileview:latest name: kkfileview-container ports: - containerPort: 8080 protocol: TCP --- apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:region:account-id:certificate/certificate-id # 如果是在 AWS 使用 ELB 可选填此字段 labels: app: kkfileview name: kkfileview-service spec: type: LoadBalancer selector: app: kkfileview ports: - port: 443 targetPort: 8080 protocol: TCP name: https ``` 上述 YAML 片段展示了如何通过指定端口映射实现 HTTP 请求转发至容器内的 Web 服务器监听地址;同时设置了外部访问方式为负载均衡器(Load Balancer),并且指定了 SSL/TLS 加密证书 ARN 地址以开启 HTTPS 功能[^2]。 对于非 AWS 用户来说,可以忽略 annotation 字段中的内容,转而考虑其他云服务商提供的 Ingress Controller 或者自托管 Nginx 实现相同效果。 #### 获取 Let's Encrypt 免费证书 (可选) 为了让网站能够合法合规地提供加密连接,可以选择申请由 Let’s Encrypt 提供的有效期内免费签发的 X.509 数字证书。借助 cert-manager 这样的工具自动化处理整个流程会更加便捷高效。 #### 测试验证 完成以上步骤之后就可以尝试访问新上线的服务了。打开浏览器输入对应的公网 IP 地址加上 `/web` 路径查看是否能顺利加载页面。另外还可以利用命令行工具 curl 发送请求测试 API 接口响应情况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值