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

总的来说,portnodePort 都是 service 的端口,前者暴露给 k8s 集群内部服务访问,后者暴露给 k8s 集群外部流量访问。从上两个端口过来的数据都需要经过反向代理 kube-proxy,流入后端 pod 的 targetPort 上,最后到达 pod 内的容器。

Published under  on .

Last updated on .

pipihua

我是皮皮花,一个前后端通吃的前端攻城狮,如果感觉不错欢迎点击小心心♥(ˆ◡ˆԅ) star on GitHub!