我正在尝试通过我的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
型
1条答案
按热度按时间ghg1uchk1#
要回答我自己的问题,这个问题有两个方面。
1.当唯一可用的端点使用TLS时,使用
--plaintext
调用grpcurl会导致以下响应。也就是说,当您将路由配置为使用TLS时,命令中应不包含--plaintext
。无法列出服务:服务器不支持反射API
我偶然发现了一个unrelated stackoverflow question,它引导我找到了设置配置的正确方法。我不确定是哪一部分的更改使它工作,但我相信在这里添加命名空间、方案和passHostHeader就能做到这一点。
我改变了什么
新的thanos入口路线。yaml
字符串
这是我现在调用已配置域时得到的响应。
型
请注意,我不再使用
--plaintext
标志。如果我使用--plaintext,我会得到相同的旧响应 * 无法列出服务:服务器不支持反射API*。