• Istio 流量管理 virtualservice


    现在有ns1命名空间,现在创建两个pod,两个svc

    1. [root@node1 istio]# cat pod1.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: pod1
    6. namespace: ns1
    7. labels:
    8. run: pod1
    9. spec:
    10. containers:
    11. - name: pod1
    12. image: nginx
    13. [root@node1 istio]# cat pod2.yaml
    14. apiVersion: v1
    15. kind: Pod
    16. metadata:
    17. name: pod2
    18. namespace: ns1
    19. labels:
    20. run: pod2
    21. spec:
    22. containers:
    23. - name: pod2
    24. image: nginx
    1. [root@node1 istio]# kubectl get pod -n ns1 -o wide
    2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    3. pod1 2/2 Running 2 23h 10.233.96.31 node2 <none> <none>
    4. pod2 2/2 Running 2 23h 10.233.96.39 node2 <none> <none>
    5. [root@node1 istio]# kubectl get svc -n ns1
    6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    7. sv1 ClusterIP 10.233.41.55 <none> 80/TCP 23h
    8. sv2 ClusterIP 10.233.40.142 <none> 80/TCP 23h
    9. [root@node1 istio]# kubectl get ep -n ns1
    10. NAME ENDPOINTS AGE
    11. sv1 10.233.96.31:80 23h
    12. sv2 10.233.96.39:80 23h

    修改其主页内容

    1. [root@node1 istio]# kubectl exec -it pod1 bash -n ns1
    2. root@pod1:/# echo "pod1" > /usr/share/nginx/html/index.html
    3. [root@node1 istio]# kubectl exec -it pod2 bash -n ns1
    4. root@pod2:/# echo "pod2" > /usr/share/nginx/html/index.html

    暴露服务

    1. [root@node1 istio]# kubectl expose --name=svc1 pod pod1 --port=80 -n ns1
    2. [root@node1 istio]# kubectl expose --name=svc2 pod pod2 --port=80 -n ns1

    这种访问是没有经过网格的, 这直接走的k8s的网络

    1. [root@node1 istio]# curl 10.233.41.55
    2. pod1
    3. [root@node1 istio]# curl 10.233.40.142
    4. pod2

    创建网关


    现在需要访问网关,要转发给gateway,也就是收到请求要先往ns1的命名空间转发,至于转发给谁先别管了。所以要在命名空间创建gateway,gateway就是要往哪个命名空间转发流量。

    创建gw是和istio-ingress-gw控制器通信的,selector定义了和哪个控制器通信。

    1. [root@node1 istio]# kubectl get pod -n istio-system -l istio=ingressgateway
    2. NAME READY STATUS RESTARTS AGE
    3. istio-ingressgateway-559d4ffc58-zsjf9 1/1 Running 3 22d

    这就是入口控制器, 现在得写规则,告诉控制器,凡是访问某个域名的时候,什么端口,什么协议。

    1. [root@node1 istio]# cat mygateway.yaml
    2. apiVersion: networking.istio.io/v1alpha3
    3. kind: Gateway
    4. metadata:
    5. name: my-gateway
    6. namespace: ns1
    7. spec:
    8. selector:
    9. istio: ingressgateway
    10. servers:
    11. - port:
    12. number: 80
    13. name: http
    14. protocol: HTTP
    15. hosts:
    16. - "aa.rhce.cc"

    virtualService的基本使用


    现在流量到达gw之后还不知道如何去做转发,所以现在还需要去建立virtual service,这样的话就将流量具体的定义在哪个svc上面了。

    对于我们的gateway来说,它所接受的主机不一定是aa.rhce.cc,可能是bb.rhce.cc还可能是cc.rhce.cc,它能够定义的这些主机很多,我们这里只定义了一个aa.rhce.cc。访问这些主机流量都会被引入到ns1命名空间来。下面我们创建了vs,只导流路由访问主机a.rhce.cc的流量,其他的路由时不会去引用的。

    1. hosts:
    2. - "aa.rhce.cc"
    3. - "bb.rhce.cc"
    4. - "cc.rhce.cc"

    vs一端连着gw,使用gw定义的规则,也就是使用哪个gateway,之后是要将收到的请求转发到哪里去。

    1. [root@node1 istio]# cat vs.yaml
    2. apiVersion: networking.istio.io/v1alpha3
    3. kind: VirtualService
    4. metadata:
    5. name: my-vs
    6. namespace: ns1
    7. spec:
    8. hosts:
    9. - "aa.rhec.cc"
    10. gateways:
    11. - my-gateway
    12. http:
    13. - route:
    14. - destination:
    15. host: sv1
    16. port:
    17. number: 80
    18. [root@node1 ~]# kubectl get vs -n ns1
    19. NAME GATEWAYS HOSTS AGE
    20. my-vs ["my-gateway"] ["aa.rhec.cc"] 8m29s
    21. [root@node1 ~]# kubectl get gw -n ns1
    22. NAME AGE
    23. my-gateway 3h57m

    如果你想让网格里面的主机访问网格里面的应用,那么可以直接写服务名。

    1. [root@node1 istio]# cat vs.yaml
    2. apiVersion: networking.istio.io/v1alpha3
    3. kind: VirtualService
    4. metadata:
    5. name: my-vs
    6. namespace: ns1
    7. spec:
    8. hosts:
    9. - "aa.rhec.cc"
    10. - vs1
    11. gateways:
    12. - my-gateway
    13. http:
    14. - route:
    15. - destination:
    16. host: sv1
    17. port:
    18. number: 80

    这样访问就走了istio的流量,也就是网格内部的主机访问sv1的时候将通过vs进行流量转发到sv1上面

    1. [root@node1 ~]# kubectl exec -it pod2 bash -n ns1
    2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
    3. Defaulting container name to pod2.
    4. Use 'kubectl describe pod/pod2 -n ns1' to see all of the containers in this pod.
    5. root@pod2:/# curl sv1
    6. pod1

    在网关里面也可以写上通配符,这就是泛域名,在gw和vs都可以配置

    1. hosts:
    2. - "*.rhce.cc"
    1. hosts:
    2. - "*"

    转发到端口


    如果你去访问控制器地址+8888端口是不行的,因为没有监听在这个端口,开放的端口有80 443等端口。

    1. [root@node1 httpbin]# kubectl get svc -n istio-system
    2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    3. istio-ingressgateway LoadBalancer 10.233.14.224 <pending> 15021:30406/TCP,80:30542/TCP,443:31241/TCP,31400:31309/TCP,15443:30692/TCP 22d

    开启8888端口 

    1. - name: http2
    2. nodePort: 30542
    3. port: 80
    4. protocol: TCP
    5. targetPort: 8080
    6. - name: http3
    7. nodePort: 30543
    8. port: 8888
    9. protocol: TCP
    10. targetPort: 8080
    11. [root@node1 httpbin]# kubectl get svc -n istio-system
    12. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    13. istio-ingressgateway LoadBalancer 10.233.14.224 <pending> 15021:30406/TCP,80:30542/TCP,8888:30543/TCP,443:31241/TCP,31400:31309/TCP,15443:30692/TCP 22d

    此时你还要需修改gateway,虽然端口有了,但是网关接受还是不接受呢?因为网关心里面需要定义来自哪个端口的才能被接受。

    1. apiVersion: networking.istio.io/v1alpha3
    2. kind: Gateway
    3. metadata:
    4. name: my-gateway
    5. namespace: ns1
    6. spec:
    7. selector:
    8. istio: ingressgateway
    9. servers:
    10. - port:
    11. number: 80
    12. name: http1
    13. protocol: HTTP
    14. hosts:
    15. - "*"
    16. - port:
    17. number: 8888
    18. name: http2
    19. protocol: HTTP
    20. hosts:
    21. - "*"

    vs端口也得修改

    1. apiVersion: networking.istio.io/v1alpha3
    2. kind: VirtualService
    3. metadata:
    4. name: my-vs
    5. namespace: ns1
    6. spec:
    7. hosts:
    8. - "*"
    9. gateways:
    10. - my-gateway
    11. http:
    12. - name: aaa
    13. match:
    14. port: 8888
    15. - route:
    16. - destination:
    17. host: sv1
    18. port:
    19. number: 80

     

     

     访问目录


    在访问的时候,含有/demo1 /demo2的时候往svc1转发,其他的往svc2去转发。(这里匹配规则是从上往下去匹配)

    完整的访问路径叫做url,去除主机名后续的部分叫做uri。

    如果换个顺序,也即是访问/demo1的时候访问svc1,访问/demo2的时候访问svc2,没有满足条件之外的访问方式,它就不知道该如何转发了。

     

     

     

    带有权重的virtualService


    上面这些你可以发现其实是可以往多个服务里面去转发的,如果要往多个svc里面去转发,那么需要设置权重往svc1去转发多少,往svc2去转发多少。

  • 相关阅读:
    第61章 Jquery JSON Table EntityFrameworkCore自动生成数据库
    美妙的美人鱼 mermaid 程序猿的画图神器
    独角兽资深架构师用7大部分13章节,彻底讲透SpringBoot生态体系
    当PBlaze6 6920 Raid阵列遇到FC SAN
    《HelloGitHub》第 80 期
    494.目标和·深度优先搜索·背包问题
    Node学习五(1) —— 查询和读写文件(path模块,路径处理)
    关于numpy库的一些函数使用的记录
    【开源】SpringBoot框架开发创意工坊双创管理系统
    分享一个网上搜不到的「Redis」实现「聊天回合制」的方案
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/126299261