0

Thanos 需要在 Service 中将 targetPort 定义为字符串,以便 ServiceMonitor 与之通信。

但是,仅将 targetPort 定义为字符串会导致问题。我相信部署中还需要更多东西。我认为必须在部署中定义 targetPort 'web'。

任何人都可以协助部署的外观吗?

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: my-app
    tenant: a
    servicemonitor: my-servicemonitor
    monitor: "true"
spec:
  type: ClusterIP
  ports:
    - name: web
      port: 80
      protocol: TCP
      targetPort: web
  selector:
    app: my-app
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: my-app
    tenant: a
  name: my-monitor
spec:
  endpoints:
    - port: web
      path: /metrics
  namespaceSelector:
    matchNames:
      - my-namespace
  selector:
    matchLabels:
      servicemonitor: my-servicemonitor
      monitor: "true"
4

3 回答 3

1

将 targetPort 定义为字符串的一个简单示例是首先在 Deployment 中定义它,然后才能在服务的 targetPort 中将其引用为字符串。下面是一个简单的示例,展示了如何从服务 targetPort 规范中的部署映射“http”(端口名称)。

部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  selector:
    matchLabels:
      app: hello
      tier: backend
      track: stable
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        tier: backend
        track: stable
    spec:
      containers:
        - name: hello
          image: "gcr.io/google-samples/hello-go-gke:1.0"
          ports:
            - name: http
              containerPort: 80

服务:

apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector:
    app: hello
    tier: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: http
于 2021-08-27T09:25:58.857 回答
0

您可以将 targetPort 设置为整数值或名称。

如果您按名称引用它,则该名称必须在 pod(s) 中定义spec > containers[n] > ports[n] > name

如果您使用整数引用,则根本不需要在 pod 中定义端口,尽管为了清楚起见仍然这样做是合理的。

于 2021-08-27T09:13:24.320 回答
0

通过在部署中提供匹配的端口名称,事情似乎可以正常工作:

ports:
- name: web
  containerPort: 80
于 2021-08-27T09:27:09.623 回答