专栏首页大魏分享(微信公众号:david-share)深度理解:Openshift端口方式全解析

深度理解:Openshift端口方式全解析

一、几种网络端口模式

Openshift/Docker中,我们会遇到(听到)的几种网络端口模式有:

  1. Hostport
  2. Nodeport
  3. Hostnetwork
  4. router

它们有什么区别,适用于什么场景?我们先看看它们的作用。

二、什么是hostport?

hostport它指的是:在一个宿主机上运行的一个容器,为了外部能够访问这个容器,将容器的端口与宿主机进行端口映射。而为了避免宿主机上的端口占用,在容器和宿主机做端口映射的时候,通常映射一个比较大的端口号(小端口被系统服务占用)。

我们看一个实验:

在宿主机上启动一个apache的容器,将容器的端口80,映射成宿主机的端口10080.

然后,我们查看这个容器的网络模式,可以看到,该容器使用的是hostport的模式,占用宿主机的端口号是10080.

我们查看容器的IP,地址为:172.17.0.2

接下来,我们验证apache服务。

首先,图形化登录宿主机,访问宿主机的80端口(确保宿主机的httpd服务是停止的),无法访问:

接下里,访问宿主机的10080端口,可以访问apache网页,说明此时访问的服务,是容器中的:

接下来,我们通过外部访问宿主机的域名加10080端口号,可以成功:

接下来,我们再做一个验证,在宿主机上,直接访问容器的IP和80端口,可以通:

截至到目前,我们对hostnetwork应该有一个比较清晰的了解了。它将容器与宿主机的端口做映射,是为了从外部可以访问到容器。而如果容器不需要被外部访问,则不需要做hostport。

三、什么是nodeport?

nodeport与hostport最重要的一个区别是,hostport是针对一个单宿主机的一个容器的;而nodeport是针对于K8S集群而言的。

在Openshift中,我们知道每个pod有一个IP,通常网段是10.开头的;同时OCP中还有service ip。而nodeport指的是:将service ip和端口,映射到OCP集群所有node的node ip和指定的端口号(通常是大端口:30000-32767)。

为什么将service ip和OCP中所有node做映射?

因为service ip在OCP中是跨node的。

我们看一个service的yaml配置文件,这是一个mysql的service:

这个配置的含义是,采用nodeport的方式,将mysql server的IP和node ip映射,serivce的源端口是3306,映射到node的端口是30306(大端口)。

这样配置完毕以后,外部要访问pod,访问的是nodeip:30306。然后访问请求通过iptables的NAT将nodeip和端口转化为:service ip和3306端口,最终请求通过service负载均衡到pod。

nodeport的缺点很明显:宿主机端口浪费和安全隐患,并且数据转发次数较多多。

四、什么是hostnetwork

在hostnetwork模式下,pod的IP和端口会直接绑定到宿主机的IP和端口。应用访问的时候,访问宿主机的IP和端口号后,这个请求直接转到pod和相同的端口(不经过iptables和SVC)。也就是说,这种情况下,pod的IP就是宿主机的IP,pod暴露哪个端口,宿主机就对外暴露哪个端口。

我们看一下pod的dc:

上面的配置文件中,打开了hostnetwork模式.。pod部署以后,pod的IP直接就是宿主机的IP。

例如,在Openshift中,router就是hostnetwork模式。下图中node.example.com是node,IP是192.168.137.102,pod的IP也是这个:

我们查看pod暴露的端口,有三个:80、443、1936:

再查看pod和node端口关系,port的端口和node的端口也是一致的。

hostnetwork相比于nodeport,好处在于转发路径短。缺点是占用node的实际端口,无法在用一个节点同时运行相同端口的两个pod。同时,hostnetwork无法跨node。

五、什么是router

在Openshift中,有router的概念。router的作用是对外暴露service的FQDN。

那么,router的本质是什么?

router本质上,一个router是以hostnetwork方式运行在一个node上的容器化hproxy,它的pod ip就是所在node的ip,对外暴露的端口就是:80、443、1936。

客户端访问某一个应用,如在浏览器中输入http://productpage-istio-system.apps.example.com,首先外部DNS将这个域名解析成router所在node的IP,即:192.168.137.102。

然后,请求到达router所在的node以后,会查询到对应的route信息,查到route对应的service的名称:httpd。此时,通过查询etcd,获取到service和相关的信息。将请求通过service负载均衡发给后端的pod。

实验展示如下:

查看route名称:

下图显示的是路由信息:

域名productpage-istio-system.apps.example.com转化为svc,名称为productpge,端口是http:

下图为svc的配置,展示svc的端口以及后端pod的端口以及pod的名,productpge

下图显示的是pod的dc,其中显示pod的名称和端口:

也就是说,productpge这个pod,对外暴露的是9080端口给service,名称为productpge,端口为9080。然后,route将service productpge暴露为productpage-istio-system.apps.example.com,并且端口转为80、443、1936,而外部的DNS将productpage-istio-system.apps.example.com可以解析成router所在的node的IP。

所以说,router就是一个以hostnetwork方式运行在node上的容器化haproxy,它占用了node的80、443、1936端口。所以,这也是为什么一个node上只能运行一个router的原因所在。

六、结论

1. 在OCP中,对于http/https类的应用,对往外通过router暴露的FQDN访问即可。

2. 在OCP中,对于非http/https类的应用,如mysql,存在两种情况:

2.1. 不需要对外提供服务,那么前端应用通过内部service ip访问mysql即可,无需对外暴露;

2.2.需要被外部访问,则需要对外暴露端口,存在两种情况:

(1)应用单副本,无需在多个node上运行,优先使用hostnetwork方式

(2)应用多副本,在多个node上运行,使用nodeport的方式。

整体而言,hostnetwork的方式转发路径短,性能比nodeport好。

文章分享自微信公众号:
大魏分享

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

原始发表时间:2018-04-10
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Kubernetes vs Openshift, 谁的网络更安全?

    前言 本文仅代表作者魏新宇的个人观点;在书写过程中,笔者与同事郭跃军进行了技术讨论,大有裨益,在此表示感谢! ? 一、K8S vs OCP, 网络端口访问方式...

    魏新宇
  • 上酒桌,今儿咱保证把容器SDN的这事一把唠清楚!

    容器的SDN 很多人都说2017将是容器年,大卫也这么认为。但在很长一点时间里,容器与虚拟化都是相互依存,相互补充的问题。 之前笔者发表过一篇文章,放开眼界,看...

    魏新宇
  • Openshift-F5集成(南北流量走F5)

    魏新宇
  • openshift 3.10多节点集群安装(基于Ansible和Centos7.4)

    由于我是在自己笔记本上建了两台虚机,资源有限,这里就拿双节点模拟一下集群,其中master节点也是计算节点、infra节点,运行etcd和nfs。node节点运...

    胡了了
  • OpenShift企业测试环境应用部署实战

    2-1-1 创建OpenShift useroot服务账户       

    东风微鸣
  • 干货巨献:Openshift3.9的网络管理大全.加长篇---Openshift3.9学习系列第二篇

    OpenShift的OVS网络组件有三种模式:ovs-subnet、ovs-multitenant、ovs-networkpolicy。

    魏新宇
  • Openshift网络架构详解与规划设计

    前言: 本文仅代表作者个人观点,用户生产上的Openshift网络规划,还要需要咨询红帽架构师或实施专家。本文仅作为参考,并且不对个案的结果负责。 本文的网络介...

    魏新宇
  • 理解OpenShift(2):网络之 DNS(域名服务)

    在Linux 系统上,当一个应用通过域名连接远端主机时,DNS 解析会通过系统调用来进行,比如 getaddrinfo()。和任何Linux 操作系统一样,Po...

    SammyLiu
  • 003.OpenShift网络

    默认情况下,Docker网络使用仅使用主机虚机网桥bridge,主机内的所有容器都连接至该网桥。连接到此桥的所有容器都可以彼此通信,但不能与不同主机上的容器通信...

    木二
  • 如何将Openshift对接CloudForms云管平台?

    Openshift对接云管平台的目的 Openshift是红帽一款优秀的PaaS解决方案。目前国内的行业客户,如金融、电信、制造等,在云平台的构建上,逐渐从Ia...

    魏新宇
  • 在容器中部署MySQL和Hadoop集群(内含视频)

    前言 之前,笔者发表的《非开发人员看Devops--从一张图谈起》的文章,在不到24小时内,阅读量已经达到1100,说明大家对DevOps和OpenShift此...

    魏新宇
  • 理解OpenShift(1):网络之 Router 和 Route

    顾名思义,Router 是路由器,Route 是路由器中配置的路由。OpenShift 中的这两个概念是为了解决从集群外部(就是从除了集群节点以外的其它地方)访...

    SammyLiu
  • 002.OpenShift安装与部署

    Red Hat OpenShift容器平台是由Red Hat作为RPM包和容器映像两种类型存在。RPM包使用订阅管理器从标准Red Hat存储库(即Yum存储库...

    木二
  • openshift pod对外访问网络解析

    openshift封装了k8s,在网络上结合ovs实现了多租户隔离,对外提供服务时报文需要经过ovs的tun0接口。下面就如何通过tun0访问pod(172.3...

    charlieroro
  • Kubernetes 疑难问题排查 - 10s 延迟

    首次通过单点登录系统(下称CAS)访问需求系统, 会等10s才能进入到需求系统的页面.

    东风微鸣
  • Openshift3.9高可用部署考虑点1

    一个典型的OCP高可用架构是:master至少应为三个,且为奇数个(上面有etcd);

    魏新宇
  • 企业级PaaS平台OpenShift

    本文摘自于山金孝,潘晓华,刘世民撰写的《OpenShift云原生架构:原理与实践》一书,经出版方授权发布。

    Satoh_AI
  • Calico在Openshift上的工作原理与配置步骤:第一篇

    由于篇幅和时间有限,本文还会有第二篇。 一、Openshift支持的各种SDN CNI Openshift Container Platform(简称OCP),...

    魏新宇
  • 基于K8S的容器云平台如何部署微服务?

    K8S是第一个将“一切以服务为中心,一切围绕服务运转”作为指导思想的创新型产品,它的功能和架构设计自始至终都遵循了这一指导思想,构建在K8S上的系统不仅可以独立...

    小小科

扫码关注腾讯云开发者

领取腾讯云代金券