《Kubernetes设计与实现》
  • Introduction
  • 内容简介
  • 前言
  • [第二章:Kubernetes基础]
    • 2.3 Kubernetes API
  • [第三章:工作负载管理]
    • [3.1 Pod]
      • 3.1.1 Pod概述
      • 3.1.1 Pod初体验
    • [3.2 ReplicationController]
      • 3.2.1 ReplicationController概述
      • 3.2.2 ReplicationController初体验
    • [3.3 ReplicaSet]
      • 3.3.1 ReplicaSet概述
      • 3.3.2 ReplicaSet初体验
    • [3.4 Deployment]
      • 3.4.1 Deployment概述
      • 3.4.2 Deployment初体验
    • [3.5 DaemonSet]
      • 3.5.1 DaemonSet概述
      • 3.5.2 DaemonSet初体验
  • [第四章:服务]
    • [4.1 Service]
      • 4.1.1 Service概述
      • 4.1.1 Service上手体验
  • [第六章:配置管理]
    • [6.1 Secret--机密信息管理]
      • 6.1.1 Secret概述
  • [第七章:集群认证]
    • [7.1 证书]
      • 7.1.1 证书基础
      • 7.1.2 证书签发流程
  • [第九章:准入控制器]
    • [9.1 准入控制器概述]
      • 9.1.1 概述
      • [9.1.2 内置默认启动的插件]
        • 9.1.2.1 NamespaceLifecycle
        • 9.1.2.15 MutatingAdmissionWebhook
  • [第十章:ResourceQuota]
    • 10.1 ResourceQuota概述
  • [第十六章:API设计约定]
    • 16.1 字段可选性设计约定
    • 16.2 condition设计约定
    • 16.3 event设计约定
  • [第十九章:Kubernetes生态]
    • [19.1 Kind]
      • [19.1.1 Kind概述]
      • 19.1.2 映射端口到主机
      • 19.1.3 配置端口转发
由 GitBook 提供支持
在本页
  • 创建集群
  • 部署服务
  • 配置端口转发
  • 小结
  • 参考链接:

这有帮助吗?

  1. [第十九章:Kubernetes生态]
  2. [19.1 Kind]

19.1.3 配置端口转发

集群中的Service(服务)默认为ClusterIP类型,该类型的Service只能在集群内部访问。有时需要对Service进行调试,在不改变Service配置的情况下,还可以借助kubectl提供的端口转发能力。

下面我们在一个kind集群中部署一个ClusterIP类型的nginx服务,然后借助kubectl的端口转发能力实现从主机上访问。

创建集群

首先使用常规的kind create cluster命令创建一个名字为rainbow的集群:

# kind create cluster --name rainbow

部署服务

接着在集群中分别部署一个nginx的Deployment和Service,配置如下所示。

Deployment的配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80

Service的配置:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: ClusterIP 
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

该服务的端口为80,类型为ClusterIP,此时是无法在主机上直接访问的。

配置端口转发

接着使用kubectl port-forward命令启动端口转发:

# kubectl port-forward --namespace default svc/nginx --address 0.0.0.0 3001:80
Forwarding from 0.0.0.0:3001 -> 80

其参数解释如下:

  • --namespace:指定Service所在的namespace(默认为default);

  • svc/nginx:指定Service的类型和名字,也可以使用全称service/nginx;

  • --address:指定绑定主机的IP;

  • 3001:80:指定监听主机上的3001端口,并将消息转发到服务的80口上;

该命令执行后不会自动退出,显示以上信息就表示成功地在本机和服务的容器之间建立了一条链接,命令终止执行时,该链接会自动中断。

此时访问本机的3001端口即可访问服务。例如访问localhost IP:

# curl localhost:3001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
</html>
...

如果本机配置了外部IP,还可以通过浏览器访问,比如http://x.x.x.x:3001.

小结

kubectl的port-forward本质上是在本地主机和集群中的Pod之间建立一个用于流量转发的连接,在上面的例子中,我们也可以直接指定Pod建立连接,比如:

# kubectport-forward pod/nginx-7848d4b86f-c7fbr --address 0.0.0.0 8888:80

上面的例子中可以指定Service建立连接,是因为kubectl会根据Service查找到后端的Pod,并最终与Pod建立建立连接。类似的,除了Service,还可以指定Deployment,比如:

# kubectl port-forward deployment/nginx 8888:80

更多的例子,有兴趣的读者可以查看命令的帮助手册:kubectl port-forward --help。

参考链接:

上一页19.1.2 映射端口到主机

最后更新于3年前

这有帮助吗?

port-forward官方文档:

port-forward实现原理(英文):

port-forward实现原理(译文):

https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/
https://prefetch.net/blog/2018/02/03/how-the-kubectl-port-forward-command-works/
https://vflong.github.io/sre/k8s/2020/03/15/how-the-kubectl-port-forward-command-works.html