背景:

当K8s的Service类型为ClusterIP,不是NodePort,就只能集群内部访问,想在外部访问可以执行kubectl port-forward,将一个或多个本地端口转发到 Pod或者Service

在这里插入图片描述

作用:

做转发,将本地端口转发到pod。官方文档中的描述:

Forward one or more local ports to a pod.

Use resource type/name such as deployment/mydeployment to select a pod. Resource type defaults to ‘pod’ if omitted.


语法:

kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]

参数:

参数项默认值用法
addresslocalhost要侦听的地址,用逗号分隔,仅接收IP地址或localhost为值,使用localhost,kubelct将尝试在127.0.0.1 和 ::1 上绑定,如果这两个地址都不能绑定,则转发失败
pod-running-timeout1m0s等待至少一个 Pod 运行的时间长度(如 5 秒、2 米或 3 小时,大于零)

举例:

  • 在本地侦听端口 9527,转发到 Pod 中的 9527
# [LOCAL_PORT:]REMOTE_PORT
kubectl port-forward pod/mypod 9527:9527 -n namespace
  • 侦听所有地址上的端口 8888,转发到 Pod 中的 5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000 -n namespace
  • 侦听本地主机和选定 IP 上的端口 8888,转发到 Pod 中的 5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000 -n namespace
  • 在本地侦听端口 5000 和 6000,将数据转发到 Pod 中的端口 5000 和 6000
kubectl port-forward pod/mypod 5000 6000 -n namespace
  • 在本地侦听端口 5000 和 6000,将数据转发到部署选择的容器中的端口 5000 和 6000
kubectl port-forward deployment/mydeployment 5000 6000 -n namespace
  • 在本地侦听随机端口,转发到 Pod 中的 5000 端口
kubectl port-forward pod/mypod :5000 -n namespace

补充:

Service就是对提供同一服务的多个pod的聚合,并提供同一的入口地址,因此上面指令中的pod/yourPodName可换成service/youServiceName

kubectl port-forward --address 0.0.0.0 service/yourServiceName 8888:5000 -n namespace

以上写法也是合理的,反正即使转发给service,最后干活儿的也是pod

在这里插入图片描述


可能遇到的坑:

(1)转发后外部连接报错No route to host

在这里插入图片描述

原因:本地端口没开

firewall-cmd --list-ports

firewall-cmd --add-port 6379/tcp --permanent

firewall-cmd --reload
(2) 没做转发,开了本地端口,但本地端口连不通

在这里插入图片描述

原因:没做转发时,这个端口只是开了,并未被监听,此时telnet自然连不上。简单说就是端口开了,但端口下没应用或者服务。

# 查看某个端口是否被监听
netstat -ano 

netstat -ano|grep -i 6379

官方文档:

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#port-forward

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐