首页 > 解决方案 > 如何将 Kubernetes 服务 TargetPort 定义为字符串?

问题描述

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"

标签: kubernetesprometheus-operatorocelotthanos

解决方案


将 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

推荐阅读