友情提示:k8s的学习有一个规律,就是后面的内容都是在前面的铺垫上进行的,层层递进,我们要把每一集的内容都认真研究一下。
后续打算开始做视频课程,在视频中作者可以不限字数不限时间的对每个知识点详细说明,有兴趣的可以关注!
Ingress是什么?
为了容易理解,我们可以认为Ingress就是k8s版本的nginx。
下面准备做实验。
实验准备 第一步:安装Ingress
(1)下载安装文件(外网要通)
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-
v0.47.0/deploy/static/provider/baremetal/deploy.yaml
(2)安装Ingress部署文件
kubectl apply -f deploy.yaml
Ingress安装了哪些东西?
这是我们第一个关心的问题,先用命令看一下:
kubectl get pod,svc -n ingress-nginx -owide
可以看到主要有两个service和一个Pod,如下:
#一个Pod
ingress-nginx-controller → Ingress控制器
#两个service
ingress-nginx-controller → 类型为NodePort
IP:10.96.192.105
端口:30487(每个机器上都开启,参考NodePort这一章)
作用:Ingress的主要service,重点
ingress-nginx-controller-admission → 类型ClusterIP
IP:10.96.27.20
端口:443
作用:主要做准入控制,这个service我们暂不关注
Ingress网络拓扑结构

解释:
(1)Ingress给外部做转发,但它自身也是通过service向外提供服务,因此ingress-nginx-controller这个service是NodePort类型,在作者实验中分配的端口是30487,这又和NodePort一样了,结果就是每个机器上都开启了30487端口,这样保证在集群任一节点上都可以访问Ingress的service。
(2)那么谁给这个Ingress service提供服务,即真正干活的是谁呢?就是node1节点的ingress-nginx-controller,类型为Pod,它内部就是nginx进程。也就是说30487的端口映射这个Pod的80端口(443端口用于https),流量就进来了。(一般情况下Ingress的Pod会部署在工作节点上,而且也不是每个节点都有,在实验中得到验证)。
(3)ingress-nginx-controller的Pod得到流量之后,经过路由规则处理(也就是Nginx处理一下)就将流量转给我们内部的service,流程结束。
Ingress网络的NAT表
Ingress的service部署之后,和前面写过的service一样,也是用iptables的nat表做了转发规则,基本一样,这里省略。
实验准备 第二步:部署三个副本的Pod
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: whoami
name: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- image: crpi-gj5arn39i861t1eu.cn-hangzhou.personal.cr.aliyuncs.com/dev-team-sz/whoami
name: whoami
实验准备 第三步:部署用户service文件-whoami-service.yml
#文件名:whoami-service.yml
apiVersion: v1
kind: Service
metadata:
labels:
app: whoami
name: whoami
spec:
selector:
app: whoami
ports:
- port: 9905 #sevice端口
protocol: TCP
targetPort: 9900 #目标端口
type: ClusterIP
执行用户的service文件:
kubectl apply -f whoami-service.yml
实验准备 第四步:部署Ingress配置文件-whoami-ingress.yml
whoami-ingress.yml是让用户service和Ingress建立关联的文件
#文件名:whoami-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-ingress # Ingress 资源名称
annotations:
# 指定使用 nginx Ingress 控制器(必须添加,否则可能无法识别)
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: / # 根路由,匹配所有访问根路径的请求
pathType: Prefix # 路径匹配方式(Prefix 表明前缀匹配)
backend:
service:
name: whoami # 要转发到的 Service 名称(和你的 Service 名称一致)
port:
number: 9905 # Service 的端口(和你的 Service port 一致)
执行该配置文件:
kubectl apply -f whoami-ingress.yml
配置执行之后,发生了什么?
ingress-nginx-controller会感知到Ingress资源的创建和变化,当它看到whoami-ingress.yml创建后,会生成类似的nginx配置片段:
# 匹配根路径的请求
location / {
# 转发到 whoami Service 的 ClusterIP:Port
proxy_pass http://whoami.default.svc.cluster.local:9905;
# 其他必要的代理配置(如请求头转发、超时设置等)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
...
}
这里的
whoami.default.svc.cluster.local是whoamiService在Kubernetes集群内部的DNS名称(格式为Service名称.命名空间.svc.cluster.local),通过它可以直接访问Service的ClusterIP。这个会在后面的DNS相关文章中再写。
完整的网络拓扑结构

测试代码:
#在任一节点机上执行
curl localhost:30487/
结果如下:
Whoami Service
=================
Client IP: 10.244.36.106
X-Forwarded-For: 10.244.169.180
X-Real-IP: 10.244.169.180
Request Method: GET
Request Path: /
Server Hostname: whoami-7988855855-vmltn
Server IP: 10.244.36.102
User-Agent: curl/7.29.0
实验结束的清理工作
#删除用户service
kubectl delete svc whoami
#删除用户Deploy
kubectl delete deploy whoami
#删除用户Ingress配置文件
kubectl delete ingress whoami-ingress
#删除Ingress,我们采用删除命名空间的方式
kubectl delete namespace ingress-nginx
总结
这篇介绍了Ingress的操作,流程如下:
- 安装Ingress,会创建两个service和一个Pod,其中controller的service和上一篇的NodePort一样,会映射宿主机的一个端口,列如30487。
- 用户在任一节点机发送请求,列如192.168.234.101:30487/,数据包会通过NAT流向Ingress的Pod。
- Pod内部是一个Nginx进程,它会通过路由映射和负载均衡,将流量转到用户的service。
- 用户的service会通过均衡算法,将流量引到真正工作的后台Pod,流程结束。
谢谢观看!



收藏了,感谢分享