Как определить целевой порт службы Kubernetes в виде строки?

#kubernetes #prometheus-operator #ocelot #thanos

Вопрос:

Таносу требуется целевой порт, определенный в качестве строки в Службе, чтобы ServiceMonitor мог взаимодействовать с ним.

Однако простое определение целевого порта в виде строки вызывает проблемы. Я считаю, что в Развертывании необходимо нечто большее. Я думаю, что целевой порт » веб » должен быть определен в развертывании.

Может ли кто-нибудь помочь с тем, как должно выглядеть развертывание?

 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"
 

Ответ №1:

Простой пример определения целевого порта как строки заключается в том, чтобы сначала определить его в развертывании, прежде чем вы сможете ссылаться на него как на строку в целевом порту в службе. Ниже приведен простой пример, показывающий, как сопоставить «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
 

Ответ №2:

Вы можете задать для targetPort целочисленное значение или имя.

Если вы ссылаетесь на него по имени, это имя должно быть определено в модуле (- ах) в spec > containers[n] > ports[n] > name

Если вы ссылаетесь на целое число, то вообще нет необходимости определять порты в блоках, хотя разумно все же сделать это для ясности.

Ответ №3:

Предоставляя соответствующее имя порта в развертывании, все, по-видимому, работает правильно:

 ports:
- name: web
  containerPort: 80