如何将 Kubernetes 服务 TargetPort 定义为字符串?

Posted

技术标签:

【中文标题】如何将 Kubernetes 服务 TargetPort 定义为字符串?【英文标题】:How Do You Define a Kubernetes Service TargetPort as a String? 【发布时间】:2021-10-27 04:54:18 【问题描述】:

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

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

任何人都可以帮助解决部署的外观吗?

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】:

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

如果您通过名称引用它,则必须在 spec > containers[n] > ports[n] > name 的 pod 中定义该名称

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

【讨论】:

【参考方案2】:

将 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

【讨论】:

【参考方案3】:

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

ports:
- name: web
  containerPort: 80

【讨论】:

以上是关于如何将 Kubernetes 服务 TargetPort 定义为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将抓取目标添加到使用 Kubernetes-Helm 安装的 Prometheus 服务器?

如何将 kubectl 命令用于在 Rancher 中使用 docker 运行的 kubernetes?

如何使用外部服务器配置 Kubernetes?

如何使多个DNS指向Kubernetes中的一个服务

Kubernetes Nginx-Ingress oauth_proxy如何将信息/令牌传递给服务

如何在 Kitura 服务器中获取 Kubernetes 外部 IP