如何使用 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
在 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