如何使用 Kubernetes 端口名称?

How to make use of Kubernetes port names?

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

 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.

kube-dns 是一种 DNS 服务,它使用与所有常规 DNS 服务器相同的协议。从这个意义上说,DNS 的设计目的不是解析 "port names",而是解析域名(映射到 IP 地址)。

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

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

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

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

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

通常,您通过编号来指代目标端口。但是您可以为每个 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

Kubernetes DNS 服务为使用以下格式

的所有命名服务端口提供SRV records
_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