Kubernetes 无法端口转发 externalName 服务

Ale*_*nko 10 portforwarding amazon-web-services kubernetes kubectl

我使用外部名称类型创建服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: dev
spec:
  externalName: google.com
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  sessionAffinity: None
  type: ExternalName
Run Code Online (Sandbox Code Playgroud)

通过K8s 文档添加新端点:

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
  namespace: dev
subsets:
- addresses:
  - ip: 172.217.20.206
  ports:
  - port: 80
    protocol: TCP
Run Code Online (Sandbox Code Playgroud)

并尝试将其转发到我的本地主机:

kubectl port-forward -n dev svc/my-service 8080:80
Run Code Online (Sandbox Code Playgroud)

并得到错误:

错误:无法附加到 *v1.Service:服务“my-service”无效:服务是在没有选择器的情况下定义的

AFAIU,我按照文档完成了所有步骤,我错过了什么?或者K8s一般不提供端口转发externalName的能力?

Dav*_*aze 17

kubectl port-forward实际上仅将本地连接转发到单个特定的 pod。虽然看起来您可以移植到其他东西,但这些只是选择 Pod 的方法。如果您运行kubectl port-forward service/foo 12345:80,它实际上会查看该服务选择的 Pod,将服务的端口 80 重新映射到相应的 Pod 端口,然后转发到该特定的 Pod。

就您而言,这意味着您无法端口转发到ExternalName服务,因为它后面没有pod,并且kubectl port-forward实际上仅转发到pod。

这还有其他一些含义(或演示)。启动一个正常的部署,运行一些具有 3 个副本的服务,前面有一个正常的服务。端口转发到部署或服务,并运行负载测试;您将看到只有一个 Pod 接收所有流量。删除该特定 pod,端口转发将关闭。

如果您想要连接到ExternalName 服务,或者以其他方式执行服务执行的任何更有趣的事情,您需要使连接源自集群内部。您可以使用kubectl run临时 pod 作为示例:

kubectl run curl-test --rm --image=curlimages/curl --generator=run-pod/v1 -- \
  http://my-service.dev.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,是的,我也决定使用相同的方法,egkubectl --namespace dev run psql-tunel -it --image=alpine/socat --tty --rm --expose=true --port=5432 tcp-listen :5432,fork,reuseaddr tcp-connect:my-db0:5432 (14认同)