targetport和containerport端口号不同
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了targetport和containerport端口号不同相关的知识,希望对你有一定的参考价值。
端口号就是端口号,是一个字符串,containerport是目的端口,targetport是源端口,两个端口号相同的话,目的端口号小于源端口号。 参考技术A targetport是容器外部访问容器的端口号,而containerport是容器内部的端口号,它们是不同的端口号。 参考技术B targetport和containerport端口号不同targetPort是pod上的端口,从port/nodePort上来的数据,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。
与制作容器时暴露的端口一致(使用DockerFile中的EXPOSE),例如官方的nginx(参考DockerFile)暴露80端口。 参考技术C targetport是容器外部访问容器的端口号,containerport是容器内部使用的端口号。 参考技术D Targetport和Containerport的端口号可以不同,因为Targetport是用来来进行容器主机之间外部通信的,而Containerport是容器内部服务之间进行内部通信的。
如何将 Kubernetes 服务 TargetPort 定义为字符串?
【中文标题】如何将 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
【讨论】:
以上是关于targetport和containerport端口号不同的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes Service定义中targetPort和port的区别
如何将 Kubernetes 服务 TargetPort 定义为字符串?
k8s 中 port nodePort targetPort概念的区分
如果我只使用没有 hostPort 的 containerPort,AWS eb 的 docker 设置将不起作用。(多容器 Docker)