如何使用Kubernetes端口名称?

soo*_*sap 7 kubernetes kubernetes-service

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

 containers:
 - name: nginx
   image: nginx:latest
   ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
Run Code Online (Sandbox Code Playgroud)

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

spec:
  type: ClusterIP
  ports:
  - name: nginx-port
    port: 80
    targetPort: nginx-port
    protocol: TCP
Run Code Online (Sandbox Code Playgroud)

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

小智 20

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

_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example
Run Code Online (Sandbox Code Playgroud)

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

_nginx-port._tcp.nginx-service.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

例子

nslookup -type=SRV _nginx-port._tcp.nginx-service.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

结果:

_nginx-port._tcp.nginx-service.default.svc.cluster.local   service = 0 100 80 nginx-service.default.svc.cluster.local.
Run Code Online (Sandbox Code Playgroud)

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


aer*_*ite 8

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

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

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

  • 它在任何地方都有记录吗?您能提供链接吗?谢谢 :) (2认同)

Max*_*lov 7

通常,您通过编号引用目标端口。但是您可以为每个 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
Run Code Online (Sandbox Code Playgroud)


Jav*_*ron 5

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)

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