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

K8S中Ingress的采用

1. Ingress的介绍

1.1 Pod 的漂移

Kubernetes 具有强大的副本控制能力,能保证在任意副本(Pod)挂掉时自动从其他机器启动一个新 的,还可以动态扩容等,通俗地说,这个 Pod 可能在任何时刻出现在任何节点上,也可能在任何时刻死 在任何节点上;那么自然随着 Pod 的创建和销毁,Pod IP 肯定会动态变化;那么如何把这个动态的 Pod IP 暴露出去?这里借助于 Kubernetes 的 Service 机制,Service 可以以标签的形式选定一组带有指定标签的 Pod,并监控和自动负载他们的 Pod IP,那么我们向外暴露只暴露 Service IP 就行了;这就是 NodePort 模式:即在每个节点上开起一个端口,然后转发到内部 Pod IP 上。

客户端请求-->node 节点的 ip:端口--->service 的 ip:端口--->pod 的 ip:端口

1.2 Ingress 介绍

Ingress 官网定义:Ingress 可以把进入到集群内部的请求转发到集群中的一些服务上,从而可以把服务映射到集群外部。Ingress 能把集群内 Service 配置成外网能够访问的 URL,流量负载均衡,提供基于 域名访问的虚拟主机等。

1.3 Ingress Controller 介绍

Ingress Controller 是一个七层负载均衡调度器,客户端的请求先到达这个七层负载均衡调度器,由七层 负载均衡器在反向代理到后端 pod,常见的七层负载均衡器有 nginx、traefik,以我们熟悉的 nginx 为 例,假如请求到达 nginx,会通过 upstream 反向代理到后端 pod 应用,但是后端 pod 的 ip 地址是一 直在变化的,因此在后端 pod 前需要加一个 service,这个 service 只是起到分组的作用,那么我们 upstream 只需要填写 service 地址即可。

1.4 Ingress 和 Ingress Controller 总结

Ingress Controller 可以理解为控制器,它通过不断的跟 Kubernetes API 交互,实时获取后端 Service、Pod 的变化,比如新增、删除等,结合 Ingress 定义的规则生成配置,然后动态更新上边的 Nginx 或者 trafik 负载均衡器,并刷新使配置生效,来达到服务自动发现的作用。

Ingress 则是定义规则,通过它定义某个域名的请求过来之后转发到集群中指定的 Service。它可以通过 Yaml 文件定义,可以给一个或多个 Service 定义一个或多个 Ingress 规则。

2. Ingress 完整实战指南

2.1 获取官方部署文件

https://github.com/kubernetes/ingress-nginx/releases

## 获取文件 我这里的文件版本是 1.5.1
curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/baremetal/deploy.yaml

2.2 部署前修改YAML文件

## 1. 这里我修改了nodePort的端口范围,在command的字段下面添加如下参数
[root@k8s-master /etc/kubernetes/manifests]# grep    service-node-port kube-apiserver.yaml- --service-node-port-range=80-32767
## 2. 重启kube-apiserver
## 下载的 deploy.yaml 包含完整的 RBAC、Deployment 等配置。默认使用 LoadBalancer 类型 Service,需要改为 NodePort.
...
---
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/component: controllername: ingress-nginx-controllernamespace: ingress-nginx
spec:type: NodePortports:- name: httpport: 80protocol: TCPtargetPort: httpnodePort: 80- name: httpsport: 443protocol: TCPtargetPort: httpsnodePort: 443selector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/component: controller
...
---

2.3 部署controller

# 1. 直接应用部署后的yaml文件
[root@k8s-master /manifests/ingress]# kubectl  apply -f deployment.yaml
# 2. 查看pod状态
[root@k8s-master /manifests/ingress]# kubectl get pods -n ingress-nginx
NAME                                       READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-89769d8f9-kjcsg   1/1     Running   0          32m
# 3. 检查 service
[root@k8s-master /manifests/ingress]# kubectl get svc -n ingress-nginx
NAME                       TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                 AGE
ingress-nginx-controller   NodePort   10.200.132.122           80:80/TCP,443:443/TCP   33m
# 4. 查看 controller 日志
[root@k8s-master /manifests/ingress]# kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -f

3. 创建测试应用

3.1 部署应用v1

[root@k8s-master /manifests/ingress]# cat tomcat-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: ingress-tomcat
spec:replicas: 2selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcatimage: 192.168.0.77:32237/library/tomcat:alpineports:- name: httpcontainerPort: 8080name: ajpcontainerPort: 8009
---
apiVersion: v1
kind: Service
metadata:name: service-tomcat
spec:selector:app: tomcatports:- name: httptargetPort: 8080port: 8080- name: ajptargetPort: 8009port: 8009
## 检查 pod 和 service
[root@k8s-master /manifests/ingress]# kubectl  get pod,svc

4. 核心ingress的配置

4.1 基础单路由配置

[root@k8s-master /manifests/ingress]# cat ingress-basic.yaml
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: tomcat
spec:controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: basic-ingressnamespace: default
spec:## ingressClassName 要一直ingressClassName: tomcat## 定义后端转发的规则rules:## #通过域名进行转发- host: tomcat.lucky.comhttp:paths:- path: /pathType: Prefix## 配置后端服务backend:## service的名称要一直service:name: service-tomcatport:number: 8080
## 检查ingress
[root@k8s-master /manifests/ingress]# kubectl  get ingress
NAME            CLASS    HOSTS              ADDRESS         PORTS   AGE
basic-ingress   tomcat   tomcat.lucky.com   192.168.0.162   80      7m11s
[root@k8s-master /manifests/ingress]# kubectl  describe ingress basic-ingress

4.2 访问

--- 1. 在window的电脑上修改hosts文件:
C:\
Windows\System32\drivers\etc
--- 2. 管理员打开hosts 文件,增加一下内容
192.168.0.162 tomcat.lucky.com
--- 3. 浏览器域名访问

4.3 Ingress 的https代理配置

--- 1. 创建自签证书(测试用)
[root@k8s-master /manifests/ingress]# openssl req -x509 -nodes -days 365 -newkey rsa:2048   -keyout tls.key -out tls.crt   -subj "/CN=tomcat.lucky.com"
--- 2. 创建 Secret
[root@k8s-master /manifests/ingress]# kubectl create secret tls tomcat-ingress-secret    --cert=tls.crt --key=tls.key  --namespace=default
-- 3. 查看
[root@k8s-master /manifests/ingress]# kubectl  describe  secret tomcat-ingress-secret
--- 4. 修改yaml文件
[root@k8s-master /manifests/ingress]# cat ingress-basic-tls.yaml
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: tomcat
spec:controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: basic-ingressnamespace: default
spec:ingressClassName: tomcat## 添加tls信息tls:- hosts:- tomcat.lucky.com## secret 名称secretName: tomcat-ingress-secretrules:- host: tomcat.lucky.comhttp:paths:- path: /pathType: Prefixbackend:service:name: service-tomcatport:number: 8080
--- 4. 浏览器通过https的方式访问

如果想详细了解更多知识的小伙伴可以参考我的个人博客:

https://xingzhibang.top/

http://www.jsqmd.com/news/64434/

相关文章:

  • 深入解析:Chrome插件:实现Axure RP HTML原型的便捷预览
  • Ubuntu下,MySQL查询报错sql_mode=only_full_group_by
  • CRNN
  • 2025年广东地区湘菜供应链江西小炒社区厨房称重自选食材配送服务商TOP5评测!全品类供应+定制化服务权威榜单发布,赋能餐饮高效运营
  • 详细介绍:【数据库】国产数据库替代实战:金仓KES如何以“智能运维 + 低资源占用”年省百万运维成本?
  • 学习心得
  • 『NAS』在群晖部署一款好看的白板工具-Excalidraw
  • 方差的迭代计算公式 - 指南
  • Ubuntu下,MySQL密码遗失时修改密码
  • 一些特性的演变过程(C++11、C++14、C++17、C++20)
  • 支离破碎发言(七)
  • MD-FPN
  • 2025最新贵州特产/伴手礼供应商TOP5推荐!贵州/贵阳/遵义/毕节/黔东南特产选购平台/渠道/供应商/采购渠道榜单发布,甄选贵州地道风物好礼
  • 进程监控:通过 SSH 远程监测嵌入式设备进程重启
  • 街头徒手健身3硬核核心训练
  • 我们的休闲娱乐区,会变成什么样子(哽咽)
  • 【ZeroRange WebRTC】对称加密 vs 非对称加密(从原理到实践) - 详解
  • Cloudflare成功抵御AISURU僵尸网络发起的破纪录29.7 Tbps DDoS攻击
  • 2025最新贵州伴手礼厂家/采购渠道/供应商/平台/卖场/超市TOP5推荐!地道风物+文化赋能权威榜单发布,甄选贵礼传递黔地心意
  • 从 Spring Boot 2.x 到 3.5.x + JDK21:一次完整的生产环境迁移实战 - Rainbow
  • 2025.12.6日21:24-incapacity无能力
  • 001.makdown快速入门
  • Focal Loss
  • 2025最新贵州/贵阳手信/伴手礼厂家 TOP5 评测!地道风物+文化赋能权威榜单发布,甄选贵礼传递山水心意
  • Oracel VirtualBox安装Windows11时无法找到ISO文件或不满足系统要求
  • 百度统计、Google Analytics平替开源网站分析工具:Umami - 教程
  • 19
  • 18
  • JavaScript 数组 对象 Map Set (映射,集合) 没有字典
  • 舆情处置高效的技术深度解析:Infoseek 字节探索的 AI 闭环架构与实现逻辑