k8s修改外部访问端口
Service 的 ports 字段解惑
- port: service 暴露在 cluster ip 上的端口,通过
<cluster ip>:port
访问服务,通过此端口集群内的服务可以相互访问,简单来说就是pod
和 pod 的端口访问。 - targetPort: Pod 的外部访问端口,port 和 nodePort 的数据通过这个端口进入到 Pod 内部,Pod 里面的 containers 的端口映射到这个端口,提供服务(需要与制作容器时暴露的端口一致,与 DockerFile 中的
EXPOSE
对应),简单来说就是容器
的端口 - nodePort: Node 节点的端口,
<nodeIP>:nodePort
是提供给集群外部客户访问 service 的入口,简单来说就是宿主机
的端口
Deployment 的 ports 字段解惑
- containerPort: 这里 containerPort 是容器内部的 port
-
hostPort: 相当于 docker 的-p 参数,映射容器端口到宿主机的端口
但这样做有个缺点,因为 Pod 重新调度的时候该 Pod 被调度到的宿主机可能会变动,这样就变化了,用户必须自己维护一个 Pod 与所在宿主机的对应关系。 使用了 hostPort 的容器只能调度到端口不冲突的 Node 上,除非有必要(比如运行一些系统级的 daemon 服务),不建议使用端口映射功能。如果需要对外暴露服务,建议使用 NodePort Service。
示例
如果想把 nginx 容器的 80 端口映射到宿主机上的 1000 端口,则只要修改 service.yml 文件如下
spec:
type: NodePort
ports:
port: 80
targetPort: 80
nodePort: 1000
注意
修改完 Service 的配置别忘了要重启下才能生效
- kubectl replace --force -f service.yml
总结
总结了 Service,因为 Service 的端口服务会覆盖 Deployment 的端口映射,对外端口服务推荐使用 Service
总的来说,port
和 nodePort
都是 service 的端口,前者暴露给 k8s 集群内部服务访问,后者暴露给 k8s 集群外部流量访问。从上两个端口过来的数据都需要经过反向代理 kube-proxy
,流入后端 pod 的 targetPort
上,最后到达 pod 内的容器。