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

kubernetes,nodeport,targetport,port,区别,意义 · 浏览次数 : 0

小编点评

## 理解nodePort端口 nodePort 是一个 Kubernetes 中用于服务对外提供服务的端口。它可以设置为 NodePort 类型,这允许外部用户通过浏览器访问服务。 **nodePort 的用途:** * 暴露服务到集群内部客户。 * 暴露服务到集群外客户。 **NodePort 的设置:** * `type: NodePort` 指定服务将暴露在 NodePort端口上。 * `ports` 指定暴露服务的端口。 * `targetPort` 指定服务应该监听的目标端口。 * `selector` 指定服务要暴露的服务。 **nodePort 的例子:** ```yaml apiVersion: v1 kind: Service metadata: labels: name: app1 spec: type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 30062 selector: name: app1 ``` **nodePort 和 port 的区别:** | 特征 | nodePort | port | |---|---|---| | 暴露端口 | 任意端口 | 指定端口 | | 监听端口 | NodePort端口 | 同一个端口 | | 选择服务 | 服务内部所有端口 | 指定服务端口 |

正文

原文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:

apiVersion: v1  
kind: Service  
metadata:  
  labels:  
    name: app1  
  name: app1  
  namespace: default  
spec:  
  type: NodePort  
  ports:  
  - port: 8080  
    targetPort: 8080  
    nodePort: 30062
  selector:  
    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的区别和意义(转)相似的内容:

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

原文https://blog.csdn.net/u013760355/article/details/70162242 https://blog.csdn.net/xinghun_4/article/details/50492041 1. nodePort 外部机器可访问的端口。 比如一个Web应用

[转帖]重定向Kubernetes pod中的tcpdump输出

https://www.cnblogs.com/charlieroro/p/17109943.html 最新发现一个比较有意思的库ksniff,它是一个kubectl 插件,使用tcpdump来远程捕获Kubernetes集群中的pod流量并保存到文件或输出到wireshark中,发布网络问题定位。

[转帖]轻松快速地调整Kubernetes的CPU和内存

在Kubernetes中分配和管理CPU和内存资源可能很棘手,但也很容易。本文,我将向你展示什么是Kubernetes资源和限制以及如何管理它们。 本文的目标是简单–如何帮助你快速调整项目中的Kubernetes资源信息,主要通过三种方式: 1. 为容器和 Pod 分配CPU和内存资源 2. Res

[转帖]kubernetes 资源管理概述

https://cizixs.com/2018/06/25/kubernetes-resource-management/ kubernetes 资源简介 什么是资源? 在 kubernetes 中,有两个基础但是非常重要的概念:node 和 pod。node 翻译成节点,是对集群资源的抽象;pod

[转帖]Traefik中诡异的502和504问题

https://zhuanlan.zhihu.com/p/156138704 我们都知道在 Kubernetes 集群中通常会使用 Ingress 方案来统一代理集群内部的流量,而常用的 Ingress 方案为 traefik 和 nginx,和传统的 Nginx 作为企业内部的反向代理以及负载设备

[转帖]kubernetes限制pod的cpu和内存

http://www.5ityx.com/cate100/45070.html kubernetes限制pod的cpu和内存 1、在创建容器的配置文件中指定 spec: containers: - image: gcr.io/google_containers/serve_hostname imag

[转帖]kubelet 原理解析四:probeManager

https://segmentfault.com/a/1190000022163835 概述 在Kubernetes 中,系统和应用程序的健康检查任务是由 kubelet 来完成的,本文主要讨论kubelet中 probemanager 相关的实现原理。 如果你对k8s的各种probe如何使用还不了

[转帖][问题已处理]-kubernetes中2次不同的oom处理

https://dandelioncloud.cn/article/details/1598699030236577793 起因: 同事反馈 服务挂了,kuboard上查看是服务挂掉了,liveness port 异常,通过查看pod状态,发现服务被重启了。 1 pod里的java进程因为k8s主机

[转帖]关于SRE方法论的一些笔记

写在前面 阿里系列有一本《云原生操作系统Kubernetes》中作者在前言里讲到Google开源的Kubernetes和《SRE Google运维解密》这本书是剑法和气功的关系换句话讲Kubernetes是术,SRE Google运维解密是道作为云原生基础设施的Kubernetes小伙伴么应该多少有

[转帖]k8spacket 和 Grafana 对 kubernetes 的 TCP 数据包流量可视化

https://devpress.csdn.net/k8s/62ff4fe47e66823466193b95.html 你知道你不看的时候你的k8s集群在做什么吗?谁与他建立 TCP 通信?他调用了谁,例如,来自第三方库? 使用k8spacket和Grafana,您可以可视化集群中的 TCP 流量。