精通k8s(13)Ingress模式详解

友情提示: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网络拓扑结构

精通k8s(13)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相关文章中再写。

完整的网络拓扑结构

精通k8s(13)Ingress模式详解

测试代码:

#在任一节点机上执行
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的操作,流程如下:

  1. 安装Ingress,会创建两个service一个Pod,其中controller的service和上一篇的NodePort一样,会映射宿主机的一个端口,列如30487。
  2. 用户在任一节点机发送请求,列如192.168.234.101:30487/,数据包会通过NAT流向Ingress的Pod。
  3. Pod内部是一个Nginx进程,它会通过路由映射和负载均衡,将流量转到用户的service。
  4. 用户的service会通过均衡算法,将流量引到真正工作的后台Pod,流程结束。

谢谢观看!

© 版权声明

相关文章

1 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    世最幸面包厨 读者

    收藏了,感谢分享

    无记录