Kubernetes配置中的port、targetPort、nodePort和containerPort端口功能解读

port

port是k8s集群内部访问service的端口,即通过clusterIP: port可以访问到某个k8s集群中的service,也就是某个部署的应用。

仅限于集群节点内互相访问,外部无法访问。

nodePort

nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外部访问到某个service,相当于给外网暴露端口可以在外网访问。

targetPort

targetPort是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

targetPort和containerPort必须一致。

containerPort

containerPort是pod内部容器的端口,targetPort映射到containerPort。

图解

实例讲解

kubia是一个镜像的nodejs镜像,启动后,默认监听8080端口,通过http请求该端口,可以返回一个信息。

kubia是什么?参见《docker 入门 2 启动一个kubia镜像》

假设我的集群有3个节点,集群内的IP分别是172.33.1.55、172.33.1.56、172.33.1.57,假设其中某个Node的对外IP是10.228.62.129。

然后我创建了一个CLUSTER-IP类型的服务:

[root]$ kubectl get svcNAME TYPECLUSTER-IPEXTERNAL-IP PORT(S)AGEkubernetes ClusterIP 10.254.0.1<none>443/TCP18dkubia-nodeport NodePort 10.254.181.177 <none>80:30000/TCP,443:32767/TCP 36s

1

2

3

4

PORT(S) 列显示集群 IP 内部端口 (80, 443) 和节点端口 (30000, 32767)

此时可以有2种方式访问:

cluster-ip:80 ,80对应port, 集群内部可以通过 10.254.181.177:80访问

nodeIP:30000 , 30000对应nodePort, nodeIP对应node节点的外部IP,假设是10.228.62.129

我可以从浏览器访问 :30000/

    当你访问 10.254.181.177:80或:30000/时,代理(就是我们的CLUSTER-IP类型的服务kubia-nodeport)会转发至pod中,那么实际上通过 podIp:targetPort访问。

containerPort就是8080

补充:

k8s架构图