首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过Istio网关获得原始TCP流量

无法通过Istio网关获得原始TCP流量
EN

Stack Overflow用户
提问于 2022-01-28 12:52:53
回答 1查看 885关注 0票数 0

我可以通过Istio路由HTTP流量(例如,Elasticsearch和各种仪表板),但我无法通过原始TCP流量。下面我有两个例子(postgres和红熊猫)。我在内部使用postgres和kafka客户端访问底层服务(mypostgres.default.svc.cluster.localthree-node-cluster-0.three-node-cluster.redpanda-system.svc.cluster.local)没有问题。

我的网关:

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - 'mydomain.cloud'
    tls:
      httpsRedirect: true
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
      - 'mydomain.cloud'
    tls:
      mode: SIMPLE
      credentialName: letsencrypt-staging-tls
  - port:
      number: 9092
      name: redpanda
      protocol: TCP
    hosts:
    - 'mydomain.cloud'
  - port:
      number: 5432
      name: postgres
      protocol: TCP
    hosts:
    - 'mydomain.cloud'

Postgres规范:

代码语言:javascript
复制
apiVersion: kubegres.reactive-tech.io/v1
kind: Kubegres
metadata:
  name: mypostgres
  namespace: postgres

spec:

   replicas: 3
   image: postgres:13.2

   database:
      size: 50Gi
      storageClassName: postgres

   env:
      - name: POSTGRES_PASSWORD
        valueFrom:
           secretKeyRef:
              name: postgressecret
              key: superUserPassword

      - name: POSTGRES_REPLICATION_PASSWORD
        valueFrom:
           secretKeyRef:
              name: postgressecret
              key: replicationUserPassword

虚拟服务:

代码语言:javascript
复制
spec:
  hosts:
  - "*"
  gateways:
  - istio-system/gateway
  tcp:
  - match:
    - port: 5432
    route:
    - destination:
        host: mypostgres.default.svc.cluster.local
        port:
          number: 5432

目的规则

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: postgres-destination-rule
  namespace: default
spec:
  host: mypostgres.default.svc.cluster.local
  trafficPolicy:
    tls:
      mode: DISABLE

红熊猫

代码语言:javascript
复制
apiVersion: redpanda.vectorized.io/v1alpha1
kind: Cluster
metadata:
  name: three-node-cluster
spec:
  image: "vectorized/redpanda"
  version: "latest"
  replicas: 2
  resources:
    requests:
      cpu: 1
      memory: 2Gi
    limits:
      cpu: 1
      memory: 2Gi
  configuration:
    rpcServer:
      port: 33145
    kafkaApi:
    - port: 9092
    pandaproxyApi:
    - port: 8082
    adminApi:
    - port: 9644
    developerMode: true
  storage:
    storageClassName: redpanda

虚拟服务

代码语言:javascript
复制
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: redpanda-vts
  namespace: redpanda-system
spec:
  hosts:
  - "*"
  gateways:
  - istio-system/gateway
  tcp:
  - match:
    - port: 9092
    route:
    - destination:
        host: three-node-cluster-0.three-node-cluster.redpanda-system.svc.cluster.local
        port:
          number: 9092

目的地规则:

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: redpanda-destination-rule
  namespace: redpanda-system
spec:
  host: three-node-cluster-0.three-node-cluster.redpanda-system.svc.cluster.local
  trafficPolicy:
    tls:
      mode: DISABLE

有什么想法吗?我试过玩弄主机名,使用星号而不是域名,但没有效果。获得TLS将是另一天的斗争,但现在我只想让一些交通通过。

例如,下面的工作是在集群内部的RedPanda中使用标准kafka-python客户端

代码语言:javascript
复制
from kafka.admin import KafkaAdminClient, NewTopic

nodes = {'bootstrap.servers':'three-node-cluster-0.three-node-cluster.redpanda-system.svc.cluster.local, three-node-cluster-1.three-node-cluster.redpanda-system.svc.cluster.local'}

admin_client = KafkaAdminClient(
    bootstrap_servers=nodes['bootstrap.servers'],
    client_id='test'
)

topic_list = []
topic_list.append(NewTopic(name="test-topic", num_partitions=1, replication_factor=1))
admin_client.create_topics(new_topics=topic_list, validate_only=False)

同样,我希望能够通过Istio从外部K8s执行以下操作:

代码语言:javascript
复制
from kafka.admin import KafkaAdminClient, NewTopic

nodes = {'bootstrap.servers':'mydomain.cloud/kafka'}

admin_client = KafkaAdminClient(
    bootstrap_servers=nodes['bootstrap.servers'],
    client_id='test'
)

topic_list = []
topic_list.append(NewTopic(name="test-topic", num_partitions=1, replication_factor=1))
admin_client.create_topics(new_topics=topic_list, validate_only=False)
EN

回答 1

Stack Overflow用户

发布于 2022-02-09 17:34:03

基于有关Istio协议选择的文档

Istio支持代理任何TCP流量。这包括HTTP、HTTPS、gRPC以及原始的TCP协议。为了提供额外的功能,例如路由和丰富的度量,必须确定协议。这可以自动或显式指定。

对你的问题的答案应该在这个片段

协议可以在服务定义中手动指定。 这可以通过两种方式配置:

  • 端口的名称:name: <protocol>[-<suffix>]
  • 在Kubernetes 1.18+中,appProtocol字段:appProtocol: <protocol>

注意,在某些情况下,网关的行为不同,因为网关可以终止TLS,协议可以协商。

看看yaml示例:

下面是通过https定义appProtocol端口和按名称定义http端口的服务示例:

代码语言:javascript
复制
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - number: 3306
    name: database
    appProtocol: https <-change here 'https' to 'tcp'
  - number: 80
    name: http-web

在您的情况下,尝试替换appProtocol: https并将appProtocol: tcp放在您的Service中

请记住,服务器第一协议(如MySQL )与自动协议选择不兼容。有关详细信息,请参阅服务器第一协议

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70894080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档