Kubernetes中的nodePort,targetPort,port的区别和意义(转)

原文https://blog.csdn.net/u013760355/article/details/70162242

https://blog.csdn.net/xinghun_4/article/details/50492041

1. nodePort

 外部机器可访问的端口。 
比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他机器就可以通过浏览器访问scheme://node:30001访问到该服务,例如http://node:30001。 
 例如MySQL数据库可能不需要被外界访问,只需被内部服务访问,那么不必设置NodePort

2. targetPort

 容器的端口(最根本的端口入口),与制作容器时暴露的端口一致(DockerFile中EXPOSE),例如docker.io官方的nginx暴露的是80端口。 
 docker.io官方的nginx容器的DockerFile参考https://github.com/nginxinc/docker-nginx

3. port

 kubernetes中的服务之间访问的端口,尽管mysql容器暴露了3306端口(参考https://github.com/docker-library/mysql/的DockerFile),但是集群内其他容器需要通过33306端口访问该服务,外部机器不能访问mysql服务,因为他没有配置NodePort类型

服务中的3个端口设置

这几个port的概念很容易混淆,比如创建如下service:

[plain] view plain copy

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. name: app1
  6. name: app1
  7. namespace: default
  8. spec:
  9. type: NodePort
  10. ports:
  11. - <strong>port: 8080
  12. targetPort: 8080
  13. nodePort: 30062</strong>
  14. selector:
  15. name: app1

port

The port that the service is exposed on the service’s cluster ip (virsual ip). Port is the service port which is accessed by others with cluster ip.

即,这里的port表示:service暴露在cluster ip上的端口,<cluster ip>:port 是提供给集群内部客户访问service的入口。

nodePort

On top of having a cluster-internal IP, expose the service on a port on each node of the cluster (the same port on each node). You'll be able to contact the service on any<nodeIP>:nodePortaddress. So nodePort is alse the service port which can be accessed by the node ip by others with external ip.

首先,nodePort是kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是LoadBalancer),所以,<nodeIP>:nodePort 是提供给集群外部客户访问service的入口。

targetPort

The port on the pod that the service should proxy traffic to.

targetPort很好理解,targetPort是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。

port、nodePort总结

总的来说,port和nodePort都是service的端口,前者暴露给集群内客户访问服务,后者暴露给集群外客户访问服务。从这两个端口到来的数据都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod上的容器内。

When a client connects to the VIP the iptables rule kicks in, and redirects the packets to the serviceproxy's own port (random port). The service proxy chooses a backend, and starts proxying traffic from the client to the backend. This means that service owers can choose any port they want without risk of collision.The same basic flow executes when traffic comes in through a nodePort or through a LoadBalancer, though in those cases the client IP does get altered.

kube-proxy与iptables

当service有了port和nodePort之后,就可以对内/外提供服务。那么其具体是通过什么原理来实现的呢?奥妙就在kube-proxy在本地node上创建的iptables规则。

Kube-Proxy 通过配置 DNAT 规则(从容器出来的访问,从本地主机出来的访问两方面),将到这个服务地址的访问映射到本地的kube-proxy端口(随机端口)。然后 Kube-Proxy 会监听在本地的对应端口,将到这个端口的访问给代理到远端真实的 pod 地址上去。

kube-proxy会在nat表里生成4个chain,分别如上所示(主要是从容器出来的访问,从本地主机出来的访问两方面)。

创建service以后,kube-proxy会自动在集群里的node上创建以下两条规则:
KUBE-PORTALS-CONTAINER
KUBE-PORTALS-HOST
如果是NodePort方式,还会额外生成两条:
KUBE-NODEPORT-CONTAINER
KUBE-NODEPORT-HOST

KUBE-PORTALS-CONTAINER

主要将由网络接口到来的通过服务集群入口<cluster ip>:port的请求重定向到本地kube-proxy端口(随机端口)的映射,即来自本地容器的服务访问请求

注:我认为,这种情况的网络包不可能来自外部网络,因为cluster ip是个virtual ip,外部网络中不存在这样的路由将该数据包发送到本机;所以该请求只能来自本地容器,从本地容器出来的访问,服务访问请求是通过本地容器虚拟网卡输入到本地网络接口的。

KUBE-NODEPORT-CONTAINER

主要将由网络接口到来的通过服务集群外部入口<node ip>:nodePort的请求重定向到本地kube-proxy端口(随机端口)的映射;即来自k8s集群外部网络的服务访问请求,可以来自本机容器,也可以来自其他node的容器,还可以来自其他node的进程

KUBE-PORTALS-HOST

主要将该node本地进程通过服务集群入口<cluster ip>:port的请求重定向到本地kube-proxy端口(随机端口)的映射。

KUBE-NODEPORT-HOST

主要将该node本地进程通过服务集群外部入口<node ip>:nodePort的请求重定向到本地kube-proxy端口(随机端口)的映射。

kube-proxy反向代理

不管是通过集群内部服务入口<cluster ip>:port还是通过集群外部服务入口<node ip>:nodePort的请求都将重定向到本地kube-proxy端口(随机端口)的映射,然后将到这个kube-proxy端口的访问给代理到远端真实的 pod 地址上去。

Kubernetes中的nodePort,targetPort,port的区别和意义(转)相关推荐

  1. Kubernetes中的nodePort,targetPort,port的区别和意义

    1. nodePort 外部机器可访问的端口. 比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他机器就可以通过浏览器访问sc ...

  2. Kubernetes 学习总结(25)—— Kubernetes 中的 pod 与容器的区别和联系

    前言 容器本可以成为轻量级虚拟机的替代品.但是由于 Docker/OCI 的标准化,最广泛使用的容器形式是每个容器只有一个进程服务.这种方法有很多优点--增加隔离性.简化水平扩展.更高的可重用性等.但 ...

  3. k8s四种port解析:nodePort、port、targetPort、containerPort

    1. nodePort nodePort提供了集群外部客户端访问service的一种方式,:nodePort提供了集群外部客户端访问service的端口,即nodeIP:nodePort提供了外部流量 ...

  4. kubenetes中port、targetPort、nodePort、containerPort的区别与联系

    kubenetes中port.targetPort.nodePort.containerPort的区别与联系 首先给出一张kubenetes结构图: containerPort containerPo ...

  5. 从部署 httpd 入手,理清 k8s 配置中的 containerPort、port、nodePort、targetPort

    注:文中各种内网.公网 IP 仅为示例,不保证所有 IP 都可以访问,且你的环境中 IP 可能不同. 背景 在上一篇文章 自己搭建一个k8s环境 中,我们一顿操作猛如虎,搭建出了由 1 个 maste ...

  6. 【nodePort、port、targetPort、containerPort的区别】

    nodePort.port.targetPort.containerPort nodePort:nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外 ...

  7. kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

    在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础: 1. 已安装.配置kubernetes 2. 集群中有tomcat与mysql容器镜像 3. 有docker基础 具 ...

  8. 关于 Kubernetes中Service的一些笔记

    写在前面 学习K8s,整理记忆 博文内容涉及:K8s中通过Servie的实现的服务创建,服务发现,服务发布 以及Load balancer负载,Ingress7层路由负载等的实际Demo 陈平安说,& ...

  9. 一文搞懂 Kubernetes 中数据包的生命周期

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 即使是对于具备一定虚拟网络和路由知识的人来说,Kubernetes 集群的网络也是个颇为麻烦的事情.本文尝试帮助读 ...

最新文章

  1. 话里话外:按单制造(MTO II)企业的资源瓶颈是怎么形成的?
  2. 程序员修炼之路:你该知道的 7 个必经阶段
  3. jdbcType与javaType的对应关系
  4. python调用shell用什么类_python脚本中调用shell命令
  5. js迭代器实现斐波那契数列
  6. 如何在Windows下强制git使用LF而不是CR + LF?
  7. win7 Pro 英文版添加中文语言包
  8. Web前端知识点总结(持续更新中...)
  9. delphi oracle 分页,使用原生ADO对数据进行分页显示delphi数据库操作下载
  10. 微信网页授权登录demo
  11. 1042 Shuffling Machine (20 point(s)) - C语言 PAT 甲级
  12. 高级硬件工程师是怎样炼成的
  13. nodeJs处理json
  14. I2C之知(一)--I2C的简介和特性
  15. 互联网晚报 | 10月17日 星期日 | 锤子论坛宣布下线;《长津湖》跻身中国影史票房前四;华为云专属月·行业深耕专项行动开启...
  16. 数组every方法使用
  17. FB和FF MIC的用途
  18. 岁月不饶人,爸妈老了
  19. protege 5.0 教程
  20. Java的List去重

热门文章

  1. js记录访问网页的ip_亚马逊新手记录之避免店铺关联
  2. 开源 画图_[软件使用05] 快速使用 Deeptools 对 ChIP-seq 数据画图!
  3. 【Spring第二篇】IOC:控制反转
  4. Winform 初识记录
  5. js将一维数组分割成每三个一组的算法
  6. Vue使用wangEditor 封装成独立组件实现富文本编辑器
  7. 201509-2-日期计算
  8. python-九九乘法打印
  9. 数字后端基本概念介绍<IO Cluster>
  10. 基于FPGA----VGA显示跳动的小白框设计