专业的编程技术博客社区

网站首页 > 博客文章 正文

k8s之Ingress工作原理(k8s envoy ingress)

baijin 2024-09-11 00:42:03 博客文章 6 ℃ 0 评论

作者: 徐良永

目录

?

① 先看一个ingress.yaml文件

② ingress controller是什么

③ 外部流量如何接入k8s集群

④ 微服务的接入



1 先看一个ingress.yaml文件

下面是一个ingress文件

重点看一下rules部分

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 labels:
 app: ingress
 name: ingress
 namespace: pre-release
 annotations:
 # ingress.kubernetes.io/rewrite-target: /
spec:
 rules:
 # host 域名
 - host: bj-zw-k8s.preview.local
 http:
 paths:
 # url路径
 - path: /dssresources 
 #对应的后端服务 包括服务名和端口
 backend: 
 serviceName: dss-resources-svc
 servicePort: 80

这个rules部分的意思是这样的:

  1. http请求的host头为bj-zw-k8s.preview.local将被匹配
  2. http请求的path以/dssresources 开头将被匹配

如 http://bj-zw-k8s.preview.local/dssresources/xxxxx 会被匹配

那么请求被匹配后由谁来处理呢 ---- backend

  1. backend.serviceName 对应后端服务名称
  2. backend.servicePort 对应后端服务端口

这样请求

http://bj-zw-k8s.preview.local/dssresources/xxxxx

就被转发到 对应的backend了

看完了这个ingress文件,是不是感觉与nginx的配置有点类似

实际上这个ingress配置文件 会被翻译成nginx.conf

这个翻译工作由ingress controller 完成

2 ingress controller是什么

重点:ingress controller 会感知所有namespace的ingress资源文件

用户执行

kubectl apply ingress.yaml

文件后 k8s感知到变化就调用 ingress controller 把它翻译成nginx.conf

并写到nginx pod中,pod的名字默认nginx-ingress-controller开头

如下



上图可以看到有三个pod 实际上pod里面的容器就是nginx

我们进入pod看一下nginx配置文件

kubectlexec-it nginx-ingress-controller-65c6984c4-zlpz9 /bin/bash -n ingress-nginx

执行后会进入容器,

cat/etc/nginx/nginx.conf

会看到如下配置


这段配置就是由ingress.yaml配置解析后生成的

3 外部流量如何接入k8s集群

如下图

k8s集群内启动三个nginx

但是外部流量如何接入进来呢?



这里要引入k8s Service组件的概念,Service有三种类型:

ClusterIP,NodePort,LoadBalancer

我们这里要使用LoadBalancer类型引入外部流量

配置文件如下

externalIPs 通过svc创建,在指定的node上监听端口

下表指定了三个node来监听 ,监听端口分别是 80 和 443

这样请求到10.20.18.135:80 的流量会被引入到k8s集群

apiVersion:v1kind:Servicemetadata:name:ingress-nginxnamespace:ingress-nginxspec:type:LoadBalancerexternalIPs:-10.20.18.135-10.20.18.136-10.20.18.137ports:-name: httpport:80targetPort:80protocol:TCP-name: httpsport:443targetPort:443protocol:TCPselector:app.kubernetes.io/name:ingress-nginx?

流量引入后会被nginx接收分发,如下图



4 微服务的接入

流量引入后,接下来就是分发到各个微服务了,比如上面的ingress文件中的

path:/dssresources

会被分发到Service

backend:serviceName:dss-resources-svcservicePort:80

我们还是画图来直观的感受一下



实际上上图中的 Service (dss-resources-svc)是用于服务发现的,真正调用下面的pod时并不会经过service这层,而是直连pod

End

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表