如何将 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?