port
port是k8s集群内部访问
service的端口,即通过clusterIP: port可以访问到某个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 svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 18d
kubia-nodeport NodePort 10.254.181.177 <none> 80:30000/TCP,443:32767/TCP 36s
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
我可以从浏览器访问 http://10.228.62.129:30000/
当你访问 10.254.181.177:80
或http://10.228.62.129:30000/
时,代理(就是我们的CLUSTER-IP类型的服务kubia-nodeport)会转发至pod中,那么实际上通过 podIp:targetPort访问。
containerPort就是8080
参考
K8S配置中的port、targetPort、nodePort和containerPort区别
【Kubernetes学习笔记】-服务访问之 Node IP &Cluster IP&port& TargetPort & Endpoint &nodePort 辨析