k8singress可以被istio中的ingressgateway使用,其原理是,istiod会将ingress资源转换成gateway与virtualservice资源(这两个是istio中的资源).
下面让我们先测试一下
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: iest
namespace: default
annotations:
kubernetes.io/ingress.class: istio
spec:
rules:
- host: nginx.tl.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 8082
apiVersion: v1
kind: Pod
metadata:
name: nginx-db
namespace: default
labels:
name: test-nginx
version: v1
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: default
spec:
selector:
name: test-nginx
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8082
当我们创建完上面的资源后,我们可以使用命令查看生成的监听端口信息
istioctl pc listener istio-ingressgateway-64f994cbb9-ql69p.istio-system
istioctl pc listener <istio-ingressgatewayPOD的名称>.<pod所在的命名空间>
[root@master01 istio]# istioctl pc listener istio-ingressgateway-64f994cbb9-ql69p.istio-system
ADDRESS PORT MATCH DESTINATION
0.0.0.0 8080 ALL Route: http.8080
0.0.0.0 15021 ALL Inline Route: /healthz/ready*
0.0.0.0 15090 ALL Inline Route: /stats/prometheus*
这里我们只关注第一行信息,我们可以看到istio-ingressgateway监听了8080端口。
如何进行访问那?首先需要配置一下hosts让上面ingress配置的hosts能够访问到本机,然后我们进行访问。
# /etc/hosts
10.244.241.97 nginx.tl.com
<podIP地址> <ingress中的hots>
# 请求
curl nginx.tl.com:8080
到这里k8s原生ingress暴露实战就结束了,想必还有一个大大的疑问,为什么它监听的是8080端口,为什么不是8082端口或者80端口那?
本文的重点要开始了.
首先我们来看一下ingressgateway相关的svc
[root@master01 istio]# kubectl get svc -n istio-system istio-gateway
apiVersion: v1
kind: Service
metadata:
name: istio-ingressgateway
namespace: istio-system
spec:
ipFamilies:
- IPv4
ports:
- name: tl
nodePort: 30587
port: 80
protocol: TCP
targetPort: 8080
appProtocol: http
selector:
app: istio-ingressgateway
istio: ingressgateway
type: NodePort
有一部分port已删去,不重要.
通过上面的信息,我们能够了解到port为80端口,targetPort为8080,
这里我们需要了解一下istio中ingressgateway生成监听器时绑定的端口机制.
- ingressgateway向istio请求envoy配置信息.
- istio接受到请求后首先判断当前节点的类型,有两种类型一种是代理类型,一种是路由类型.代理类型通常是内部应用,路由通常是网关.所以这里是网关类型.
- istio会获取当前集群中的所有gateway资源(istio中的CRD资源),获取到资源后遍历构造监听端口,生成代理配置发送给ingressgateway.
那么如何构造监听端口的那?
- istio将k8singress转化为gateway资源与virtualservice资源,其中gateway资源中的port源码写死了是80端口.
- istio获取到这个gateway资源后,会获取ingressgateway所关联的svc,这里是上面的svc资源.
- 获取到后会遍历svc中的ports然后将每个port(prots[i].port)与gateway中的port进行比较,如果相等则使用targetPort的值作为监听端口.如果都不相等则会使用gateway中的port (对于k8singress就是使用 80端口,写死的 而对于我们手动创建的gateway资源也是使用port端口但是可以设置任意数),
- 但是(这里一定要注意),无论是使用targetPort的值还是gateway中的port值,istio会在最后进行判断是否大于1024,false则舍弃,true则进行暴露,所以如果使用了gateway中的port值(80)则不会生成监听配置.这里一定要注意.
对于istio操作k8s原理与注意事项分析完毕.