默认情况下,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
类型的服务,无论从哪个结点上映射效果都是相同的。