《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.2 映射端口到主机

上一页[19.1.1 Kind概述]下一页19.1.3 配置端口转发

最后更新于3年前

这有帮助吗?

默认情况下,kind集群只映射控制面(control-plane)节点的一个端口(6443)到主机的随机端口,用于从主机访问kube-apiserver。

上图展示了两个kind集群,集群Cluster 1 映射了kube-apiserver的端口到主机的40515端口,集群Cluster 2映射了kube-apiserver的端口到主机的40516端口,这样在主机上可以通过40515和40516端口分别访问这两个集群。

某些场景下,我们会在Kind集群中运行NodePort类型的Service,并希望在主机上直接能够访问。此时可以在启动Kind集群时通过extraPortMappings配置额外需要映射的端口。

接下来,通过一个简单的例子来演示其用法。

集群配置

例如,我们需要访问的服务NodePort 为30000,并且希望把这个端口映射到主机上的30001端口,那么可以准备如下配置:

apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30001
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: tcp # Optional, defaults to tcp
- role: worker

该配置将从control-plane的节点上映射容器端口30000到主机的30001端口。将配置保存在文件中,如kind.config。

接着使用kind命令行工具创建集群:

# kind create cluster --name rainbow --config kind.config

此时可以通过docker ps命令查看到映射的端口:

# docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
CONTAINER ID        NAMES                             PORTS
6c723f417eee        rainbow-worker                    
09c63c3d283c        rainbow-control-plane             127.0.0.1:43890->6443/tcp, 0.0.0.0:30001->30000/tcp

部署服务

在本例中,我们部署一个nginx应用:

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

接着,创建一个NodePort类型的Service:

apiVersion: v1
kind: Service
metadata:
  name: hostname-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30000

访问服务

此时可以在主机上通过映射到主机的30001端口访问服务:

# curl localhost:30001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
...

此外,也可以在主机外,通过主机IP:端口方式访问服务,例如使用浏览器访问:

http://189.139.131.166:30001/

小结

上面的例子中,我们使用extraPortMappings映射了一个端口到主机,也可以同时映射多个端口到主机。同时还可以从kind集群中任意节点上映射端口到主机,对于NodePort类型的服务,无论从哪个结点上映射效果都是相同的。