在kubernetes集群上使用traefik ingress暴露grpc服务器

im9ewurl  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(1)|浏览(106)

我正在尝试通过我的kubernetes集群(k3 s集群)中的域从外部访问gRPC服务(thanos sidecar)。我使用Traefik作为入口控制器。
任何线索,我可能是错误的配置将不胜感激。我真的不清楚问题出在哪里,是在亚马逊的NLB(我需要一些特定的grpc还是我可以只使用TCP和端口80/443?))、Traefik入口或服务本身。
我未能从traefik日志或服务配置错误中找到任何错误。

环境

gRPC服务作为Prometheus部署的sidecar容器部署在集群中。这是使用kube-prometheus-stack掌舵图部署的。

$ kubectl describe pod prometheus-monitoring-prometheus-0 -n monitoring
Name:             prometheus-monitoring-prometheus-0
Namespace:        monitoring
Priority:         0
Service Account:  monitoring-prometheus
Node:             k3s-node-1/12.345.678.910
Start Time:       Wed, 26 Jul 2023 18:35:38 +0000
Labels:           app.kubernetes.io/instance=monitoring-prometheus
                  app.kubernetes.io/managed-by=prometheus-operator
                  app.kubernetes.io/name=prometheus
                  ...
                  prometheus=monitoring-prometheus
                  statefulset.kubernetes.io/pod-name=prometheus-monitoring-prometheus-0
Annotations:      kubectl.kubernetes.io/default-container: prometheus
Status:           Running
IP:               10.42.0.200
IPs:
  IP:           10.42.0.200
Controlled By:  StatefulSet/prometheus-monitoring-prometheus
...
Containers:
  ...
  thanos-sidecar:
    Container ID:  containerd://bdc1bbfe53bf1ea260c47a44ab26110432388fe5592e037c83da5c6b6c5f696f
    Image:         http://quay.io/thanos/thanos:v0.31.0 
    Image ID:      quay.io/thanos/thanos@sha256:e7d337d6ac24233f0f9314ec9830291789e16e2b480b9d353be02d05ce7f2a7e
    Ports:         10902/TCP, 10901/TCP
    Host Ports:    0/TCP, 0/TCP
    Args:
      sidecar
      --prometheus.url=http://127.0.0.1:9090/
      --prometheus.http-client={"tls_config": {"insecure_skip_verify":true}}
      --grpc-address=:10901
      --http-address=:10902
      --objstore.config=$(OBJSTORE_CONFIG)
      --tsdb.path=/prometheus
      --log.level=info
      --log.format=logfmt
    State:          Running
      Started:      Wed, 26 Jul 2023 18:35:41 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      OBJSTORE_CONFIG:  <set to the key 'objstore.yml' in secret 'my-s3-bucket'>  Optional: false
    Mounts:
      /prometheus from prometheus-monitoring-prometheus-db (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-slz8t (ro)
...

字符串
然后,使用服务专门公开Sidecar容器

$ kubectl describe svc monitoring-thanos-discovery -n monitoring
Name:              monitoring-thanos-discovery
Namespace:         monitoring
Labels:            app=monitoring-thanos-discovery
                   app.kubernetes.io/instance=monitoring
                   app.kubernetes.io/managed-by=Helm
                   app.kubernetes.io/part-of=monitoring
                   app.kubernetes.io/version=47.2.0
                   chart=kube-prometheus-stack-47.2.0
                   heritage=Helm
                   release=monitoring
Annotations:       meta.helm.sh/release-name: monitoring
                   meta.helm.sh/release-namespace: monitoring
                   traefik.ingress.kubernetes.io/service.serversscheme: h2c
Selector:          app.kubernetes.io/name=prometheus,prometheus=monitoring-prometheus
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              grpc  10901/TCP
TargetPort:        grpc/TCP
Endpoints:         10.42.0.200:10901
Port:              http  10902/TCP
TargetPort:        http/TCP
Endpoints:         10.42.0.200:10902
Session Affinity:  None
Events:            <none>


我正在使用Ingress(默认)为我的域创建TLS证书,并使用IngressRoute(traefik特定)通过 * 我认为 * 支持HTTP 2的端点公开服务。
thanos-ingress-dummy.yaml

# We use this resource to get a certificate for the given domain (To use with ingressroute)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: thanos-discovery-ingress-dummy
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  rules:
    - host: "thanos-gateway.monitoring.domain.com"
      http:
        paths:
          - path: /cert-placeholder
            pathType: Prefix
            backend:
              service:
                name: monitoring-thanos-discovery
                port:
                  name: grpc
  tls:
    - hosts:
        - "thanos-gateway.monitoring.domain.com"
      secretName: thanos-sidecar-grpc-tls


thanos-ingressroute.yaml

# We use IngressRoute to allow our grpc server to be reachable. (Supports grpc over http2)
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: thanos-discovery-ingress
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`thanos-gateway.monitoring.domain.com`)
      kind: Rule
      services:
        - name: monitoring-thanos-discovery
          port: grpc
  tls:
    secretName: thanos-sidecar-grpc-tls


这是一张现在应该是什么样子的照片。
x1c 0d1x的数据

问题

无法通过指定域从群集外部访问gRPC服务。
在集群内部的容器中,我能够使用grpcurl与服务器进行通信,而monitoring-thanos-discovery服务使用内部集群DNS。

$ kubectl exec -it debian-debug -- bash
root@debian-debug:/# grpcurl -plaintext monitoring-thanos-discovery.monitoring.svc.cluster.local:10901 grpc.health.v1.Health.Check
{
  "status": "SERVING"
}


当我从集群外部对入口(thanos-gateway.monitoring.domain.com)中指定的域进行相同的尝试时,我得到以下结果。

$ grpcurl --plaintext thanos-gateway.monitoring.domain.com:443 list
Failed to list services: server does not support the reflection API


当我对端点执行curl请求时,我可以验证Traefik正在处理该请求,但会给出内部服务器错误响应。针对http端点的 curl 导致404,这是预期的,因为我在入口中只指定了websecure。我以前也在ingress中指定了web,grpc和curl的响应与443端口相同。

$ curl https://thanos-gateway.monitoring.domain.com
Internal Server Error

$ curl http://thanos-gateway.monitoring.domain.com
404 page not found

ghg1uchk

ghg1uchk1#

要回答我自己的问题,这个问题有两个方面。
1.当唯一可用的端点使用TLS时,使用--plaintext调用grpcurl会导致以下响应。也就是说,当您将路由配置为使用TLS时,命令中应不包含--plaintext
无法列出服务:服务器不支持反射API

  1. IngressRoute配置需要进行一些改进。
    我偶然发现了一个unrelated stackoverflow question,它引导我找到了设置配置的正确方法。我不确定是哪一部分的更改使它工作,但我相信在这里添加命名空间、方案和passHostHeader就能做到这一点。
    我改变了什么
  • 我不需要“假”入口(thanos-ingress-dummy.yaml),因为我已经有了 *. domain.com的通配符证书
  • 我将域更改为thanos-grpc.domain.com,以使用现有的tls证书(否则,创建假入口的旧方法可能仍然有效,但我尚未检查)

新的thanos入口路线。yaml

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: thanos
  namespace: monitoring
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`thanos-grpc.domain.com`)
      kind: Rule
      services:
        - name: monitoring-thanos-discovery
          namespace: monitoring
          port: 10901
          scheme: h2c
          passHostHeader: true
  tls:
    secretName: my-domain-wildcard-tls

字符串
这是我现在调用已配置域时得到的响应。

$ grpcurl thanos-grpc.domain.com:443 list

grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection
thanos.Exemplars
thanos.Metadata
thanos.Rules
thanos.Store
thanos.Targets
thanos.info.Info


请注意,我不再使用--plaintext标志。
如果我使用--plaintext,我会得到相同的旧响应 * 无法列出服务:服务器不支持反射API*。

相关问题