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各种port关系

Kubernetes Service定义中targetPort和port的区别

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

k8s 中 port nodePort targetPort概念的区分

docker网络访问

如果我只使用没有 hostPort 的 containerPort,AWS eb 的 docker 设置将不起作用。(多容器 Docker)