在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
一样。
答案 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;
}