Kubernetes 无法转发 externalName 服务
Kubernetes can't port-forward externalName service
我创建了类型为外部名称的服务:
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
关闭 K8s docs 添加新端点:
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
namespace: dev
subsets:
- addresses:
- ip: 172.217.20.206
ports:
- port: 80
protocol: TCP
并尝试将其转发到我的本地主机:
kubectl port-forward -n dev svc/my-service 8080:80
并得到错误:
error: cannot attach to *v1.Service: invalid service 'my-service':
Service is defined without a selector
AFAIU,我按照关闭文档执行了所有步骤,我错过了什么?或者 K8s 一般不提供端口转发 externalName 的能力?
kubectl port-forward
实际上仅将本地连接转发到单个特定的 pod。虽然看起来你可以 port-forward 做其他事情,但这些只是选择一个 pod 的方法。如果你 运行 kubectl port-forward service/foo 12345:80
,它实际上会查看那个 Service 选择的 pods,将服务的端口 80 重新映射到相应的 pod 端口,并转发到那个特定的 pod。
在您的情况下,这意味着您不能 port-forward 到 ExternalName 服务,因为它后面没有 pod,并且 kubectl port-forward
实际上只是转发到 pods .
这还有其他一些含义(或证明)。启动一个正常的 Deployment 运行ning 一些具有 3 个副本的服务,在它前面有一个正常的服务。 Port-forward 部署或服务,运行 负载测试;您会看到只有一个 pod 接收所有流量。删除该特定 pod,port-forward 将关闭。
如果您想要连接到 ExternalName 服务,或以其他方式执行服务所做的任何更有趣的事情,您需要使连接源自集群内部。您可以 kubectl run
一个临时 pod 作为示例:
kubectl run curl-test --rm --image=curlimages/curl --generator=run-pod/v1 -- \
http://my-service.dev.svc.cluster.local
我创建了类型为外部名称的服务:
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
关闭 K8s docs 添加新端点:
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
namespace: dev
subsets:
- addresses:
- ip: 172.217.20.206
ports:
- port: 80
protocol: TCP
并尝试将其转发到我的本地主机:
kubectl port-forward -n dev svc/my-service 8080:80
并得到错误:
error: cannot attach to *v1.Service: invalid service 'my-service': Service is defined without a selector
AFAIU,我按照关闭文档执行了所有步骤,我错过了什么?或者 K8s 一般不提供端口转发 externalName 的能力?
kubectl port-forward
实际上仅将本地连接转发到单个特定的 pod。虽然看起来你可以 port-forward 做其他事情,但这些只是选择一个 pod 的方法。如果你 运行 kubectl port-forward service/foo 12345:80
,它实际上会查看那个 Service 选择的 pods,将服务的端口 80 重新映射到相应的 pod 端口,并转发到那个特定的 pod。
在您的情况下,这意味着您不能 port-forward 到 ExternalName 服务,因为它后面没有 pod,并且 kubectl port-forward
实际上只是转发到 pods .
这还有其他一些含义(或证明)。启动一个正常的 Deployment 运行ning 一些具有 3 个副本的服务,在它前面有一个正常的服务。 Port-forward 部署或服务,运行 负载测试;您会看到只有一个 pod 接收所有流量。删除该特定 pod,port-forward 将关闭。
如果您想要连接到 ExternalName 服务,或以其他方式执行服务所做的任何更有趣的事情,您需要使连接源自集群内部。您可以 kubectl run
一个临时 pod 作为示例:
kubectl run curl-test --rm --image=curlimages/curl --generator=run-pod/v1 -- \
http://my-service.dev.svc.cluster.local