如何利用Kubernetes端口名称?

时间:2018-02-20 13:51:08

标签: kubernetes kubernetes-service

在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 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

import Page.Cats.Main -- You can now call functions defined in that module like this: -- Page.Cats.Main.add 1 2 是一种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)

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

答案 3 :(得分:0)

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

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

typedef struct
{
    size_t size;
    int arr[];
}int_array_t;

int_array_t *alloc(size_t nelem)
{
    int_array_t *arr = malloc(sizeof(*arr) + nelem * sizoef(arr -> arr[0]));

    if(arr)
    {
        arr -> size = nelem;
    }
    return arr;
}