kubectl暴露命令可用于为应用程序创建服务,并分配IP地址以从Internet访问它。
据我了解,要访问Kubernetes集群中的任何应用程序,应该创建一个服务资源,并且该服务资源应具有可从外部网络访问的IP地址。
但是在端口转发的情况下,kubectl如何在没有可从外部访问的IP地址的情况下创建与应用程序的连接?
答案 0 :(得分:22)
kubectl port-forward
将到本地端口的连接转发到Pod上的端口。与kubectl proxy
相比,kubectl port-forward
更为通用,因为它可以转发TCP流量,而kubectl proxy
仅可以转发HTTP流量。
kubectl port-forward
对于测试/调试非常有用,因此您可以在本地访问服务而不暴露它。
下面是pod
的名称,它将把端口6379
转发到localhost:6379
。
kubectl port-forward redis-master-765d459796-258hz 6379:6379
与
相同kubectl port-forward pods/redis-master-765d459796-258hz 6379:6379
或
kubectl port-forward deployment/redis-master 6379:6379
或
kubectl port-forward rs/redis-master 6379:6379
或
kubectl port-forward svc/redis-master 6379:6379
Here也是一些小型端口转发示例,用于在不公开数据库服务(群集)的情况下进行访问。
答案 1 :(得分:17)
kubectl port-forward
进行特定的Kubernetes API request。这意味着运行它的系统需要访问API服务器,并且所有流量都将通过单个HTTP连接进行隧道传输。
具有此功能对于调试确实很有用(如果一个特定的Pod正在起作用,则可以直接连接到它;在微服务环境中,您可以与本来不会公开的后端服务进行对话),但这不是替代方法设置服务对象。当我使用kubectl port-forward
时,它的速度明显比通过服务连接到Pod慢,而且我发现看到命令在几分钟后就停止了。同样,这些对于调试不是什么大问题,但是对于我的生产系统来说,它们并不是我想要的。
答案 2 :(得分:5)
port-forward命令,将一个(或多个)本地端口转发到Pod。
该命令非常有用,例如在蓝色/绿色部署中,您需要对行为异常的Pod进行故障排除。
进一步讲,您甚至可以对Jenkins的CI / CD管道内部使用多个条件的声明式管道,对可能会更容易出错的Pod进行一些初步测试。
用法示例:
在本地侦听端口8888,转发到Pod中的5000
kubectl port-forward pod/mypod 8888:5000
在所有地址上监听端口8888,并转发到Pod中的5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
在本地随机端口上侦听,然后转发到Pod中的5000
kubectl port-forward pod/mypod :5000
在本地主机上的端口8888上侦听并选择IP,然后转发到Pod中的5000
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
在本地侦听端口5000和6000,向/从容器中的端口5000和6000转发数据
kubectl port-forward pod/mypod 5000 6000
在本地侦听端口5000和6000,在部署选择的Pod中向/从端口5000和6000转发数据/
kubectl port-forward deployment/mydeployment 5000 6000
在本地侦听端口5000和6000,在服务选择的Pod中向/从端口5000和6000转发数据
kubectl port-forward service/myservice 5000 6000
答案 3 :(得分:2)
要访问集群内的某些内容,有几个不同的选项可供使用,
以上两种方法都需要编写配置文件,如果您想在不编写配置文件的情况下访问 pod,则需要第三个选项。
举个例子:
const stan = nats.connect('ticketing', 'abc', {
url: 'http://localhost:5000',
});
我们的目标是在 stan 和 Kubernetes 集群内的 pod 之间建立连接。
首先我们需要 pod 名称,您可以通过命令 kubectl get pods
获取名称kubectl get pods
我假设我的 pod 名称是 nats-depl-855d477f4d-xgbd7,并且可以通过集群 IP 服务访问
apiVersion: v1
kind: Service
metadata:
name: nats-srv
spec:
selector:
app: nats
ports:
- name: client
protocol: TCP
port: 4222
targetPort: 4222
现在建立连接运行以下命令:
kubectl port-forward nats-depl-855d477f4d-xgbd7 5000:4222
5000:是我本地机器的端口
4222 : 是我想要访问的 pod 的端口
答案 4 :(得分:0)
如果要转发到localhost中的其他端口。试试这个
kubectl port-forward <pod-name> <locahost-port>:<pod-port>
kubectl port-forward sample-pod-sadasds-sxawdd 8090:6379
上面的命令从pod 6379转发到localhost 8090