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生成监听器时绑定的端口机制.

  1. ingressgateway向istio请求envoy配置信息.
  2. istio接受到请求后首先判断当前节点的类型,有两种类型一种是代理类型,一种是路由类型.代理类型通常是内部应用,路由通常是网关.所以这里是网关类型.
  3. istio会获取当前集群中的所有gateway资源(istio中的CRD资源),获取到资源后遍历构造监听端口,生成代理配置发送给ingressgateway.

那么如何构造监听端口的那?

  1. istio将k8singress转化为gateway资源与virtualservice资源,其中gateway资源中的port源码写死了是80端口.
  2. istio获取到这个gateway资源后,会获取ingressgateway所关联的svc,这里是上面的svc资源.
  3. 获取到后会遍历svc中的ports然后将每个port(prots[i].port)与gateway中的port进行比较,如果相等则使用targetPort的值作为监听端口.如果都不相等则会使用gateway中的port (对于k8singress就是使用 80端口,写死的 而对于我们手动创建的gateway资源也是使用port端口但是可以设置任意数),
  4. 但是(这里一定要注意),无论是使用targetPort的值还是gateway中的port值,istio会在最后进行判断是否大于1024,false则舍弃,true则进行暴露,所以如果使用了gateway中的port值(80)则不会生成监听配置.这里一定要注意.

对于istio操作k8s原理与注意事项分析完毕.

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐