07_在k8s集群中安装ingress-nginx
文章目录0 背景与架构0.1 为什么需要ingress-nginx0.2 环境架构0.3 镜像拉取方案1 安装前准备1.1 下载ingress-nginx部署文件1.2 替换镜像地址1.3 修复DNS解析问题1.3.1 问题现象1.3.2 修复方法2 安装ingress-nginx2.1 应用部署文件2.2 验证部署3 测试Ingress3.1 部署测试应用3.2 验证Ingress3.3 从宿主机访问4 常见问题与解决4.1 镜像拉取失败ImagePullBackOff4.2 DNS解析问题4.3 EXTERNAL-IP一直pending5 总结感谢阅读0 背景与架构0.1 为什么需要ingress-nginx在 《06_在k8s集群中安装MetalLB实现LoadBalancer》 中我们通过 MetalLB 让裸金属集群的LoadBalancerService 获得了外部 IP。但 MetalLB 只解决了四层负载均衡的问题当我们需要基于域名或路径进行七层路由例如foo.com转发到foo-servicebar.com转发到bar-service就需要用到 Kubernetes 的Ingress资源。然而Ingress本身只是一个声明式的规则对象它需要Ingress Controller来真正解析这些规则并转发流量。ingress-nginx是 Kubernetes 社区最流行的 Ingress Controller 实现它以 Nginx 作为数据平面能够动态监听Ingress资源变化并自动生成 Nginx 配置。0.2 环境架构IP虚拟机名称角色说明192.168.56.101rockylinux10-1control-planek8s master 节点192.168.56.102rockylinux10-2workerk8s worker 节点192.168.56.103rockylinux10-3workerk8s worker 节点0.3 镜像拉取方案由于国内网络限制我们采用以下镜像源原始仓库替换地址用途registry.k8s.iok8s.m.daocloud.ioDaoCloud 的 k8s 镜像代理1 安装前准备1.1 下载ingress-nginx部署文件由于虚拟机内直接访问raw.githubusercontent.com会超时我们在Mac 宿主机上下载 YAML 文件然后传输到虚拟机。在 Mac 上执行curl-L-oingress-nginx-deploy.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.15.1/deploy/static/provider/cloud/deploy.yaml传输到 master 节点scpingress-nginx-deploy.yaml root192.168.56.101:/root/在 master 节点上创建目录并移动文件# 在 rockylinux10-1 上执行mkdir-p/root/ingress-nginxmv/root/ingress-nginx-deploy.yaml /root/ingress-nginx/cd/root/ingress-nginx1.2 替换镜像地址ingress-nginx-deploy.yaml中的镜像默认来自registry.k8s.io国内拉取会超时。根据 DaoCloud 镜像加速 https://gitee.com/daocloud/public-image-mirror 的说明将registry.k8s.io替换为k8s.m.daocloud.iosed-is/registry.k8s.io/k8s.m.daocloud.io/gingress-nginx-deploy.yaml验证替换结果grepimage:ingress-nginx-deploy.yaml期望输出image:k8s.m.daocloud.io/ingress-nginx/controller:v1.15.1sha256:594ceea76b01c592858f803f9ff4d2cb40542cae2060410b2c95f75907d659e1image:k8s.m.daocloud.io/ingress-nginx/kube-webhook-certgen:v1.6.9sha256:01038e7de14b78d702d2849c3aad72fd25903c4765af63cf16aa3398f5d5f2ddimage:k8s.m.daocloud.io/ingress-nginx/kube-webhook-certgen:v1.6.9sha256:01038e7de14b78d702d2849c3aad72fd25903c4765af63cf16aa3398f5d5f2dd注意kube-webhook-certgen镜像出现了两次分别用于admission-create和admission-patch两个 Job这是正常的。1.3 修复DNS解析问题1.3.1 问题现象完成镜像地址替换后执行kubectl apply时 Pod 报ErrImagePullfailed to pull image k8s.m.daocloud.io/ingress-nginx/kube-webhook-certgen:v1.6.9sha256:... failed to resolve reference ...: dial tcp: lookup m.daocloud.io on 192.168.1.1:53: no such host但此时在节点上执行ping k8s.m.daocloud.io却可以成功解析。这是因为glibc 和 Go 的 DNS 解析器行为不同ping使用 glibc 解析器遇到NXDOMAIN会继续尝试下一个 DNS而containerd使用 Go 解析器遇到NXDOMAIN直接放弃。节点的/etc/resolv.conf中192.168.1.1无法解析公网域名containerd 在第一个 DNS 就失败了。1.3.2 修复方法在所有 K8s 节点rockylinux10-1、10-2、10-3上为 NAT 网卡enp0s9配置可解析公网域名的 DNS# 配置 DNS将公共 DNS 放在最前面nmcli connection modifyenp0s9\ipv4.dns114.114.114.114 8.8.8.8 192.168.1.1 192.168.0.1\ipv4.ignore-auto-dnsyes# 重启网卡使配置生效nmcli connection downenp0s9nmcli connection upenp0s9验证 DNS 配置cat/etc/resolv.conf期望输出# Generated by NetworkManager nameserver 114.114.114.114 nameserver 8.8.8.8 nameserver 192.168.1.1 # NOTE: the libc resolver may not support more than 3 nameservers. # The nameservers listed below may not be recognized. nameserver 192.168.0.1 nameserver fd17:625c:f037:3::3说明114.114.114.114和8.8.8.8已经排在最前面containerd 使用 Go 解析器时会优先用它们解析公网域名因此无需重启 containerd直接执行kubectl apply即可成功拉取镜像。2 安装ingress-nginx2.1 应用部署文件在 master 节点rockylinux10-1上执行cd/root/ingress-nginx kubectl apply-fingress-nginx-deploy.yaml2.2 验证部署在 master 节点rockylinux10-1上执行kubectl get all-ningress-nginx期望输出刚执行完kubectl apply几秒后的状态NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-psjcd 0/1 Completed 0 8s pod/ingress-nginx-admission-patch-hjxn2 0/1 Completed 0 6s pod/ingress-nginx-controller-6c9bd4845d-dfcvr 1/1 Running 0 10s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.1.47.212 192.168.56.240 80:31922/TCP,443:32639/TCP 10s service/ingress-nginx-controller-admission ClusterIP 10.1.192.23 none 443/TCP 10s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 10s NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-6c9bd4845d 1 1 1 10s NAME COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create 1/1 5s 8s job.batch/ingress-nginx-admission-patch 1/1 4s 6s关键点说明ingress-nginx-admission-create和ingress-nginx-admission-patch是两个 JobCOMPLETIONS 为1/1对应的 Pod 状态为Completed表示它们已经成功执行完成。ingress-nginx-controller的 Pod 状态为RunningService 类型为LoadBalancerEXTERNAL-IP由 MetalLB 分配。这两个 Job 生成的 Pod 会在执行完成后保留一段时间随后会被自动清理因此过一段时间再执行kubectl get all可能就看不到它们了。届时可以用kubectl get events确认它们曾经执行成功。查看 Job 相关的 events 记录的命令kubectl get events-ningress-nginx|grepingress-nginx-admission3 测试Ingress3.1 部署测试应用创建文件kiada-ingress.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:kiadaspec:replicas:2selector:matchLabels:app:kiadatemplate:metadata:labels:app:kiadaspec:containers:-name:kiada# 这个镜像要自己用 k8s in action 相关的代码打镜像image:m.daocloud.io.localcache.registry:55000/kiada:0.5ports:-containerPort:8080---apiVersion:v1kind:Servicemetadata:name:kiadaspec:selector:app:kiadaports:-port:80targetPort:8080---apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:kiada-ingressspec:ingressClassName:nginxrules:-host:kiada.example.comhttp:paths:-path:/pathType:Prefixbackend:service:name:kiadaport:number:80应用kubectl apply-fkiada-ingress.yaml3.2 验证Ingresskubectl get ingress期望输出NAME CLASS HOSTS ADDRESS PORTS AGE kiada-ingress nginx kiada.example.com 192.168.56.240 80 30s3.3 从宿主机访问由于kiada.example.com是虚构域名需要在 Mac 的/etc/hosts中添加解析将域名指向 Ingress Controller 的外部 IP。在 Mac 上执行echo192.168.56.240 kiada.example.com|sudotee-a/etc/hosts192.168.56.240就是前面通过 MetalLB 分配给ingress-nginx-controller的EXTERNAL-IP可以通过kubectl get svc -n ingress-nginx查看实际值。然后在Safari 浏览器中访问http://kiada.example.com应该能看到 Kiada 页面。注意Chrome 浏览器可能因安全策略无法访问推荐使用 Safari。4 常见问题与解决4.1 镜像拉取失败ImagePullBackOff现象Pod 处于ImagePullBackOff错误信息包含no such host。排查kubectl describe pod-ningress-nginxpod-name|grep-EImage:|Failed解决确认registry.k8s.io已替换为k8s.m.daocloud.io并检查所有节点的 DNS 配置是否正确。4.2 DNS解析问题现象ping能通但containerd拉取镜像时报no such host。原因glibc 和 Go DNS 解析器对NXDOMAIN的处理不同。解决参考第 1.3 节在所有节点上通过nmcli配置公共 DNS。4.3 EXTERNAL-IP一直pending现象ingress-nginx-controller的EXTERNAL-IP始终为pending。原因裸金属集群缺少 LoadBalancer 实现。解决参考 《06_在k8s集群中安装MetalLB实现LoadBalancer》安装 MetalLB 并配置 IP 地址池。5 总结通过本文我们完成了以下工作下载了 ingress-nginx 部署文件从 Mac 宿主机下载并传输到 master 节点替换了镜像地址将registry.k8s.io替换为k8s.m.daocloud.io修复了 DNS 解析问题理解了 glibc 和 Go 解析器的差异通过nmcli配置公共 DNS成功安装了 ingress-nginx验证了 Pod、Service 和 IngressClass 正常创建测试了 Ingress 路由通过/etc/hosts解析验证了域名路由功能感谢阅读

相关新闻

基于Spring Boot的宠物用品商城系统开发与实践指南

基于Spring Boot的宠物用品商城系统开发与实践指南

毕业设计季总有人拿着“宠物用品系统”这个题目来找我聊,说白了这个题在Java Web方向的选题清单里几乎年年出现。还有一类人不是学生,是宠物店老板想把自己那套手工记账和微信群接单的流程搬到线上。这两类人虽然出发点不一样,但最终要的东西…

2026/10/10 3:20:15 阅读更多 →
河北省口碑好的母婴护理服务商盘点,资质齐全的正规家政机构不踩坑

河北省口碑好的母婴护理服务商盘点,资质齐全的正规家政机构不踩坑

在衡水,找月嫂、请育婴师,几乎是每个新手家庭的必经之路。可真到了挑选的时候,很多父母才发现,家政市场鱼龙混杂,有的机构只管牵线不管服务,有的月嫂短期培训就匆匆上岗,出了问题连人都找不到。…

2026/10/10 3:20:15 阅读更多 →
个人微信API二次开发:号掉线别急着新建,先救映射表

个人微信API二次开发:号掉线别急着新建,先救映射表

线上最危险的操作不是掉线本身,而是值班同学随手「再建一个号顶上」。半小时后你会看到:一半消息失败、一半回错人、客服觉得有两个机器人在抢答。 多设备与恢复路径见 GeWe 开放文档。 真正炸掉的是什么 不是微信,是你的 客户 → 主责设备…

2026/10/10 3:20:15 阅读更多 →

最新新闻

RISC-V MCU与PMIC协同:嵌入式电源管理方案设计与实现

RISC-V MCU与PMIC协同:嵌入式电源管理方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:00:24 阅读更多 →
基于测井曲线与机器学习的储层岩性识别实战指南

基于测井曲线与机器学习的储层岩性识别实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:00:24 阅读更多 →
配电变压器检测图像数据集:VOC到YOLO的转换与训练实战

配电变压器检测图像数据集:VOC到YOLO的转换与训练实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:00:24 阅读更多 →
配电变压器检测图像数据集:3000幅VOC标注助你快速跑通目标检测

配电变压器检测图像数据集:3000幅VOC标注助你快速跑通目标检测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:00:24 阅读更多 →
无锁环形缓冲区核心剖析:基于缓存行隔离与原子序号的单生产者多消费者设计

无锁环形缓冲区核心剖析:基于缓存行隔离与原子序号的单生产者多消费者设计

在高性能算子调度系统、微秒级异步日志引擎以及硬件网卡数据包分发器中,**单生产者多消费者(Single-Producer Multi-Consumer, SPMC)**是最普遍也最关键的并发拓扑结构。在这种架构下,单一的主控制线程(如算子计算图调…

2026/10/10 5:00:24 阅读更多 →
Oracle 19c Solaris x86-32 客户端安装包解析与实战避坑指南

Oracle 19c Solaris x86-32 客户端安装包解析与实战避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 4:59:23 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →