26

在 kubernetes部署中,我指定一个端口,如下所示:

 containers:
 - name: nginx
   image: nginx:latest
   ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

现在在服务中,我可以像这样引用该端口(允许我只在服务中指定外部端口):

spec:
  type: ClusterIP
  ports:
  - name: nginx-port
    port: 80
    targetPort: nginx-port
    protocol: TCP

现在的问题是,我可以使用以下语法在其他地方引用服务和端口nginx-service.default.svc.cluster.local:nginx-port吗?你知道我可以使用这个特殊的名称来引用服务,但我发现自己像这样对端口号进行硬编码nginx-service.default.svc.cluster.local:80

4

4 回答 4

12

通常,您通过其编号来引用目标端口。但是您可以为每个 pod 的端口指定一个特定的名称,并在您的服务规范中引用该名称。

这将使您的服务更清晰。这里有一个小例子:

apiVersion: v1
kind: Pod
metadata:
  name: named-port-pod
  labels:
    app: named-port-pod
spec:
  containers:
    - name: echoserver
      image: gcr.io/google_containers/echoserver:1.4
      ports:
      - name: pod-custom-port
        containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: named-port-svc
spec:
  ports:
    - port: 80
      targetPort: pod-custom-port
  selector:
    app: named-port-pod
于 2020-12-12T22:55:49.017 回答
11

不可以。您不能使用端口名称代替端口号。ServicePort 中的名称字段有不同的用途。

ServiceSpec 中的所有端口都必须具有唯一的名称。此名称映射到 EndpointPort 对象中的“名称”字段。

对于每个服务,都会生成一个 Endpoint 对象。该端点的每个端口都对应一个服务端口。ServicePort 和 EndpointPort 中的名称字段都用于此匹配。

于 2018-02-20T16:26:41.227 回答
8

Kubernetes DNS 服务使用以下格式为所有命名的服务端口提供SRV 记录

_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example

在您的情况下,您应该能够通过查询以下域来访问它

_nginx-port._tcp.nginx-service.default.svc.cluster.local

例子

nslookup -type=SRV _nginx-port._tcp.nginx-service.default.svc.cluster.local

结果:

_nginx-port._tcp.nginx-service.default.svc.cluster.local   service = 0 100 80 nginx-service.default.svc.cluster.local.

在上面的输出中,nginx-service.default.svc.cluster.local是目标域,80是您应该连接的目标端口,即nginx-service.default.svc.cluster.local:80

于 2021-04-22T13:37:39.163 回答
4

kube-dns是一种 DNS 服务,它使用与所有常规 DNS 服务器相同的协议。从这个意义上说,DNS 并非旨在解析“端口名称”,而是域名(映射到 IP 地址)。

几个人所做的是拥有一个反向代理,它将 ProxyPass 流量从一个端口传递到另一个端口(假设我们正在谈论 HTTP/HTTPS 流量)https://serverfault.com/questions/85078/how-to-forward-dns -alias-to-hostnameport或使用 iptables 规则https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway-with-iptables。但是,这些假设您首先将流量转发到特定端口(例如,80)

正如您在评论中所写,使用环境变量将是适合您情况的选项。

于 2018-02-20T14:48:20.270 回答