如何利用服务网格ASM让集群中监听localhost的应用能够被其它Pod访问

简介: 作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。本文介绍如何在应

作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。

本文介绍如何在应用监听localhost的情况下,如何通过配置Sidecar资源让监听localhost的应用可以被集群中其它Pod通过Service访问。

问题现象

当部署在集群中的应用监听localhost时,即使通过Service暴露应用的服务端口,该服务也无法被集群中的其他Pod访问。

比如,使用gunicorn部署flask应用,在代码中、gunicorn.conf.py 文件使用了如下配置:

workers = 10
worker_class = "gevent"
bind = "localhost:8000"

为应用创建Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test
  name: test
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
        - image: 'xxxxxxxxxxtest:v2'
          imagePullPolicy: IfNotPresent
          name: test
          ports:
            - containerPort: 8000
              name: http
              protocol: TCP

对应在Kubernetes集群中为应用创建Service:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: test
  name: test
  namespace: default
spec:
  ports:
    - name: http
      port: 8000
      protocol: TCP
      targetPort: 8000
  selector:
    app: test

此时,在集群中的其他Pod中访问test应用,发现访问是不通的

$ curl test:8000/calculate
upstream connect error or disconnect/reset before headers. reset reason: connection failure, transport failure reason: delayed connect error: 111

下面是一些不同语言的应用监听localhost的例子:

  • Golang:  net.Listen("tcp", "localhost:8080")
  • Node.js:  http.createServer().listen(8080, "localhost");
  • Python:  socket.socket().bind(("localhost", 8083))

问题原因

当集群中应用监听localhost网络地址时,由于localhost是本地地址,集群中的其它Pod对其访问不通是正常现象,需要根据是否需要对外暴露应用来修改Service或通过Sidecar资源修改服务网格Sidecar代理配置。

解决方案

如果不希望对外暴露应用服务,则应该在选中该应用的Service端口声明中移除对应的端口声明。

如果希望对外暴露应用服务,可以选择以下两种方式:

1、修改应用监听的网络地址

如果希望应用提供的服务对外暴露,则最好修改应用代码,将应用监听的网络地址从localhost改为 0.0.0.0

2、使用服务网格暴露监听localhost的服务

如果不希望修改应用代码,同时需要将监听localhost的应用暴露给集群中其它Pod,可以选择基于服务网格ASM的Sidecar资源对Sidecar代理进行配置。

  1. 登录 ASM控制台
  2. 在左侧导航栏,选择 服务网格 > 网格管理
  3. 网格管理 页面,找到待配置的实例,单击实例的名称或在 操作 列中单击 管理
  4. 在网格详情页面左侧导航栏选择 流量管理中心 > Sidecar资源 ,然后在右侧页面单击 使用YAML创建
  5. 在YAML输入框中输入以下YAML,根据应用属性对大括号中的字段进行替换
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: localhost-access
  namespace: {namespace}
spec:
  ingress:
    - defaultEndpoint: '127.0.0.1:{container_port}'
      port:
        name: tcp
        number: {port}
        protocol: TCP
  workloadSelector:
    labels:
      {key}: {value}

其中,{namespace}需要替换为应用部署所在的命名空间,{container_port}需要替换为应用监听localhost的容器端口,port需要替换为应用的Service端口,{key} : {value}需要替换为选中应用Pod的标签。如何使得集群中监听localhost的应用能够被其它Pod访问

为应用注入Sidecar代理、并创建Sidecar资源后,再次尝试从应用外部访问,发现可以调通了!

相关文章
|
1月前
|
Kubernetes Cloud Native JavaScript
为使用WebSocket构建的双向通信应用带来基于服务网格的全链路灰度
介绍如何使用为基于WebSocket的云原生应用构建全链路灰度方案。
|
4月前
|
Prometheus Kubernetes 监控
打造无缝灾备新境界:运用服务网格ASM,将集群外服务无缝融入集群内服务,铸就高可用性坚盾!
【8月更文挑战第2天】随着微服务架构的应用,服务的高可用性变得至关重要。服务网格如阿里巴巴的ASM提供流量管理、服务发现等功能,支撑高可靠服务系统。本文介绍如何利用ASM实现集群外服务作为集群内服务的灾备方案,确保服务连续性。先决条件包括已部署ASM的Kubernetes集群环境及内外部的关键服务副本。通过定义服务条目、配置虚拟服务和目的地规则,可实现自动或手动故障转移。借助ASM的流量管理能力,确保服务高可用性和业务连续性。
54 10
|
4月前
|
Kubernetes 安全 数据安全/隐私保护
利用服务网格实现全链路mTLS(二):通过出口网关访问外部mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,简化服务治理,包括流量管理、服务间通信安全及网格可观测性。ASM出口网关统一管理网格内的出口流量,实现全链路加密通信与精细访问控制。本文介绍如何配置ASM出口网关以管理出口流量并发起mTLS通信,涉及配置ServiceEntry、创建出口网关、设置虚拟服务及目标规则等步骤,最终实现安全可控的mTLS服务访问。
159 3
|
4月前
|
Perl
如何利用服务网格ASM使用集群外服务做集群内服务的灾备
本文档指导您如何配置阿里云服务网格(ASM)以实现在多集群环境下,服务间的优先访问及故障转移策略。
116 2
|
4月前
|
SQL Java
访问者模式问题之在ASM中,实现一个访问者来删除指定的类属性,如何解决
访问者模式问题之在ASM中,实现一个访问者来删除指定的类属性,如何解决
|
5月前
|
Kubernetes Dubbo Cloud Native
如何将Dubbo应用接入服务网格
介绍使用传统Dubbo微服务体系的客户要如何将自己的服务接入到服务网格这一新一代云原生基础设施。
|
5月前
|
Cloud Native 测试技术 开发者
阿里云服务网格ASM多集群实践(二):高效按需的应用多环境部署与全链路灰度发布
介绍服务网格ASM提出的一种多集群部署下的多环境部署与全链路灰度发布解决方案。
|
7月前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
459 1
|
人工智能 Kubernetes TensorFlow
轻松搭建基于服务网格的 AI 应用,然后开始玩
轻松搭建基于服务网格的 AI 应用,然后开始玩
65286 31
|
7月前
|
负载均衡 安全 网络协议
如何通过计算巢在ACK集群上使用Istio服务网格
本文主要介绍怎么通过计算巢部署Isito服务网格,并介绍了使用示例。