Cloud Native应用交付

  • 首页
  • 关于本站
  • 个人介绍
  • Downloads
  • Repo
    • Github
    • Container
  • F5
    • F5 Python SDK
    • F5-container
    • F5-LBaaS
  • 社交
    • 联系我
    • 微信/微博
    • 公众号
    • 打赏赞助
行至水穷处 坐看云起时
Cloud Native Application Services: cnadn.net
  1. 首页
  2. ServiceMesh
  3. 正文

Istio里Gateway的port定义与实际ingressgateway的listener端口关系及规则

2020年07月9日 15130点热度 0人点赞 6条评论

istio 1.6.3

Gateway资源中定义的port和协议定义了在ingressgateway(envoy)中的listener port及协议处理。

但是,Gateway中的port可以填写为 ingressgateway 对应svc中的定义的port或者targetPort,最终在envoy里配置的是targetPort。

例如,Gateway中定义port为443:

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  namespace: istio-bookinfo
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 8080  
      name: http
      protocol: HTTP
    hosts:
    - "*"
  - port:
      number: 443 #####用于envoy中listener所关联的route的名称里
      name: https #####用于envoy中listener所关联的route的名称里
      protocol: HTTPS #####用于envoy中listener所关联的route的名称里
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - "*"

而实际envoy中产生的配置是8443:

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@k8s-master-v1-16 networking]# istioctl proxy-config listener istio-ingressgateway-7b869dcfb5-lfqz9.istio-system --port 8443 -o json
[
    {
        "name": "0.0.0.0_8443",
        "address": {
            "socketAddress": {
                "address": "0.0.0.0",
                "portValue": 8443 《《《《《8443!!
            }
        },
        "filterChains": [
            {
                "filters": [
                    {
                        "name": "envoy.http_connection_manager",
                        "typedConfig": {
                            "@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager",
                            "statPrefix": "outbound_0.0.0.0_8443",
                            "rds": {
                                "configSource": {
                                    "ads": {}
                                },
###route name用的是443####
                                "routeConfigName": "https.443.https.bookinfo-gateway.istio-bookinfo"
                            },

这是因为在ingressgateway的svc中定义了 svc 443 对应targetPort 8443

YAML
1
2
3
4
5
  - name: https
    nodePort: 30975
    port: 443
    protocol: TCP
    targetPort: 8443

如果在gateway中如果定义port为8443,效果也是在envoy中产生8443的listener。

但需要特别注意,在只有一个gateway定义时候,写svc的por或者写对应的targetport都所谓,而如果是多个gateway定义,且定义的都是相同的协议,那么gateway中的端口就必须写一致,否则listener只会关联后创建的gateway所产生的routeConfigName,而后创建的这个route里不会包含先创建的virtualservice逻辑。

例如,在istio-bookinfo namespace里的gateway里配置 HTTP:8080   (ingressgateway的svc 80对应到pod的8080)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@k8s-master-v1-16 httpbin]# kubectl get gateways.networking.istio.io -n istio-bookinfo  -o yaml
apiVersion: v1
items:
 
  spec:
    selector:
      istio: ingressgateway
    servers:
    - hosts:
      - '*'
      port:
        name: http
        number: 8080
        protocol: HTTP
    - hosts:
      - istiobookinfo.lab.f5se.io
      port:
        name: https
        number: 443
        protocol: HTTPS

而httpbin namespace里的gateway配置 HTTP:80

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@k8s-master-v1-16 httpbin]# kubectl get gateways.networking.istio.io -n httpbin -o yaml
apiVersion: v1
items:
 
  spec:
    selector:
      istio: ingressgateway
    servers:
    - hosts:
      - httpbin.lab.f5se.io
      port:
        name: http-httpbin
        number: 80
        protocol: HTTP

这导致envoy listener最终实际关联的是后创建的http.80 这个route(原来的http.8080覆盖了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@k8s-master-v1-16 ~]# istioctl proxy-config listener istio-ingressgateway-7b869dcfb5-gh2vr.istio-system --port 8080 -o json
[
    {
        "name": "0.0.0.0_8080",
        "address": {
            "socketAddress": {
                "address": "0.0.0.0",
                "portValue": 8080
            }
        },
        "filterChains": [
            {
                "filters": [
                    {
                        "name": "envoy.http_connection_manager",
                        "typedConfig": {
                            "@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager",
                            "statPrefix": "outbound_0.0.0.0_8080",
                            "rds": {
                                "configSource": {
                                    "ads": {}
                                },
                                "routeConfigName": "http.80"

所以,在这种最终是共用listener 端口的gateway配置里,端口号以及协议名需要相同(最好就都直接用envoy实际监听的端口号),但port的命名必须不同(port name相同的话,envoy日志会显示冲突的配置)。

1
2
2020-07-10T09:56:26.192152Z warning envoy config [external/envoy/source/common/config/grpc_subscription_impl.cc:101] gRPC config for type.googleapis.com/envoy.api.v2.Listener rejected:
Error adding/updating listener(s) 0.0.0.0_8080: duplicate listener 0.0.0.0_8080 found

 

相同协议相同端口的gateway,无论是否在同一个namespace中,在envoy只能共用一个listener,因此也会共用一个route,这个route里再做7层区分。 如果此时不小心在不同的namespace下配置了相同的virtualservice,将会导致envoy在同一个route中产生两个相同的match条件(而关联的cluster是不同namespace后缀的,从而导致访问异常)

 

相关文章

  • 应用交付老兵眼中的Envoy, 云原生时代下的思考
  • Istio 熔断策略及envoy配置
  • Istio超时与延迟注入策略的envoy配置
  • F5 BIG-IP链接Istio 增强入口服务能力
  • istio sidecar envoy 权重比例策略配置
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: envoy ingressgateway port istio
最后更新:2020年10月1日

纳米

linjing.io

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • long904

    ok

    2020年07月12日
    回复
  • kan

    谢谢博主

    2020年07月12日
    回复
  • bo

    来了来了

    2020年07月12日
    回复
  • xnnn

    谢谢分享

    2020年07月16日
    回复
  • shileizcc

    感谢分享

    2020年09月25日
    回复
  • FLex

    一直在疑惑 Istio gateway 资源中的这个 port 到底有什么意义。 因为当你添加多个 gateway 时并绑定多个 不相同的 http服务端口时你会发现这些配置并没有生效。

    2021年07月26日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

    页面AI聊天助手

    纳米

    linjing.io

    ☁️迈向Cloud Native ADC ☁️

    认证获得:
    TOGAF: ID 152743
    Kubernetes: CKA #664
    Microsoft: MCSE MCDBA
    Cisco: CCNP
    Juniper: JNCIS
    F5:
    F5 Certified Solution Expert, Security
    F5 Certified Technology Specialist, LTM/GTM/APM/ASM
    F5 Certified BIG-IP Administrator
  • 点击查看本博技术要素列表
  • 归档
    分类
    • AI
    • Automation
    • Avi Networks
    • Cisco ACI
    • CISCO资源
    • F5 with ELK
    • F5-Tech tips
    • F5技术
    • Juniper
    • Linux
    • NGINX
    • SDN
    • ServiceMesh
    • WEB编程
    • WINDOWS相关
    • 业界文章
    • 交换机技术
    • 化云为雨/Openstack
    • 协议原理
    • 容器/k8s
    • 我的工作
    • 我的生活
    • 网站技术
    • 路由器技术
    • 项目案例
    标签聚合
    neutron network DNS istio k8s nginx irule openstack flannel gtm F5 bigip api docker envoy
    最近评论
    汤姆 发布于 8 个月前(09月10日) 嗨,楼主,里面的json怎么下载啊,怎么收费啊?
    汤姆 发布于 8 个月前(09月09日) 大佬,kib的页面可以分享下吗?谢谢
    zhangsha 发布于 1 年前(05月12日) 资料发给我下,谢谢纳米同志!!!!lyx895@qq.com
    李成才 发布于 1 年前(01月02日) 麻烦了,谢谢大佬
    纳米 发布于 1 年前(01月02日) 你好。是的,因为以前下载系统插件在一次升级后将所有的下载生成信息全弄丢了。所以不少文件无法下载。DN...
    浏览次数
    • Downloads - 183,754 views
    • 联系我 - 118,966 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 116,433 views
    • Github - 103,637 views
    • F5常见log日志解释 - 79,766 views
    • 从传统ADC迈向CLOUD NATIVE ADC - 下载 - 74,618 views
    • Sniffer Pro 4 70 530抓包软件 中文版+视频教程 - 74,320 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 67,770 views
    • 关于本站 - 60,884 views
    • 这篇文档您是否感兴趣 - 55,491 views
    链接表
    • F5SE创新
    • Jimmy Song‘s Blog
    • SDNlab
    • Service Mesh社区
    • 三斗室
    • 个人profile
    • 云原生社区

    COPYRIGHT © 2023 Cloud Native 应用交付. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    京ICP备14048088号-1

    京公网安备 11010502041506号