Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >跨VPC或者跨云供应商搭建K8S集群正确姿势-番外篇

跨VPC或者跨云供应商搭建K8S集群正确姿势-番外篇

作者头像
云爬虫技术研究笔记
发布于 2020-02-19 04:35:27
发布于 2020-02-19 04:35:27
3.3K1
举报

嗨!這个最有深度的『研究笔记』由程序员界最会排版の追星族运营?

2020年

2月13日

跨VPC或者跨云供应商搭建K8S集群正确姿势-番外篇

小编:Lateautumn4lin(逆向小小小学生)

本文灵感主要是来自于张馆长的文章《跨VPC或者跨云供应商搭建K8S集群正确姿势》,因此取名《跨VPC或者跨云供应商搭建K8S集群正确姿势-番外篇》

上周发了几篇关于Kubernetes集群搭建相关的文章,里面有一个部分谈到了Kubernetes集群CNI插件(也就是容器网络接口)的部署,很多读者看到了这个部分之后有问到“如何跨VPC或者跨云供应商打通集群之间的网络访问”,我当时搭建集群和写文章的时候也没有注意这点,只是根据以往的经验单纯地把几台机器搞在一起再加上部署好CNI就想当然的以为Kubernetes集群算是“全网通”了。经过读者的提醒和自己的实践,发现忽略了一个严重的问题,也是大多数人在个人搭建Kubernetes集群常常会碰到的问题,也是就今天需要谈论的问题---“如何跨VPC或者跨云供应商搭建Kubernetes集群,保证集群网络互通”。

为了解决这个问题需要从几个方面思考:

  • 单一VPC和跨VPC/云供应商的网络方面的区别
  • 单一VPC和跨VPC/云供应商的网络环境下Kubernetes集群的区别
  • 跨VPC/云供应商的Kubernetes集群搭建时需要注意的点
  • 采用何种CNI来保证跨VPC/云供应商的Kubernetes集群的网络互通

本文会基于以上几点问题来展开,最后会根据我们思考的点给大家演示下具体的实战,可能有些点说的不太清楚,希望大家可以狠狠的批评!

1. Kubernetes集群搭建相关问题思考

1.1

单一VPC和跨VPC/云供应商的网络方面的区别

首先了解下什么是VPC?

这里直接搬出百度百科的解释,直白地说,首先从服务的角度来看,VPC指的是一种云(Cloud),这与它的字面意思相符。你或许听过公有云(Public Cloud),私有云(Private Cloud),混合云(Hybrid Cloud)。不过,VPC不属于这三种云中任一种。这是一种运行在公有云上,将一部分公有云资源为某个用户隔离出来,给这个用户私有使用的资源的集合。VPC是这么一种云,它由公有云管理,运行在公共资源上,但是保证每个用户之间的资源是隔离,用户在使用的时候不受其他用户的影响,感觉像是在使用自己的私有云一样。它在概念上有点类似于V**(Virtual Private Network),不过V**只是在网络资源上的隔离,VPC更像是V**的超集,VPC是对各种资源上对各个用户的隔离。

而我们这次主要讲不同VPC网络上面的隔离,用一个图来演示下不同VPC之间的关系。

从上面这张图可以看出,每个VPC都有自己独立的IPv4 CIDR和IP地址,在单个VPC中的每个Node节点又会根据网址划分规则获取自己的VPC内网地址,由于Node A1和Node A2是同处一个网段,可以相互通信(原理上是源节点根据发送ARP请求到广播域让目标节点获得ARP请求把MAC地址单播到源节点,获取到MAC地址之后,封装XX等协议包经由物理传输进行通行通信)。而在不同VPC之间,由于网段的不同,比如Node A1(10.4.0.1)和Node B1(10.3.0.1),不能直接通过内网地址通信,需要通信的话一是通过两个Node的公网IP来访问,二是通过VPC的封装转发来通信,大家想要仔细了解可以参考Docker的网络原理。

上面说了这么多都是为了让大家理解VPC具体在网络方面做了什么隔离,那么大家现在应该可以明白单一VPC和跨VPC/云供应商之间的网络区别是什么,在单一VPC集群里,各个节点都是在同一网段下,可以直接进行通信,不需要配置额外的转发,而在跨VPC/云供应商的环境中,各个Node节点是不能够直接通过内网IP进行通信的,不过可以通过公网IP进行通信。

1.2

单一VPC和跨VPC/云供应商的网络环境下Kubernetes集群的区别

上个问题我们理解到不同VPC之间的Node节点是不能直接访问的,那么这点对于我们在搭建Kubernetes集群的时候有什么影响呢?

假设我们现在有1台Master节点、1台Node节点,要搭建双节点的集群,我们从几个特定的场景看看单一VPC和跨VPC/云供应商的网络环境有什么区别。

当在单一VPC中的时候,Master为10.0.0.1,Node为10.0.0.2,当在跨VPC/云供应商的时候,Master为10.0.0.1,Node为10.0.0.2

  • 场景一:Node要加入集群

如图所示,Node加入集群需要通过访问Master节点的ApiServer服务加入,既然要通过访问服务加入,也就是需要Node、Master互通才能做到访问,当然也可以通过Node访问Master节点的公网IP来访问,前提是Kubernetes集群初始化的时候暴露出公网地址。

  • 场景二:Master调度Pod到Node,需要获取Pod具体情况

从图里面可以看出,每个节点都有自己的INTERNAL-IP,而当Master节点调度Pod到Node上的时候,Master节点通过describe和logs等命令获取数据时也是需要Master节点和Node节点互通的,Master和Node节点能否互通是通过查看INTERNAL-IP是否是同一网段的,而INTERNAL-IP是通过Kubectl查询节点上面的物理网卡(例如eth0,enoxxx)的地址,而物理网卡的地址往往都是子网的地址,所以在跨VPC/云供应商的网络环境必然是不可能处于同一网段的。

  • 场景三:Master需要收集Node节点数据 同理场景二,当Master节点需要获取Node节点的数据的时候,需要通过访问Node节点暴露出的端口来获取数据,此时也是需要Master能够与Node节点互通的。

1.3

跨VPC/云供应商的Kubernetes集群搭建时需要注意的点

这个问题是我本次基于跨VPC或者跨云供应商搭建Kubernetes集群时所想到的,也是一个个人搭建Kubernetes集群时注意到的点。

  • 虽然是跨VPC,但是需要保证每个节点都有自己独立的公网IP。
  • 由于使用的是Kubeadm Config的方式来初始化Kubernetes集群,所以需要保证Kubeadm将ApiServer服务暴露在公网,其他具体的Kubeadm Config配置会在之后的实战时具体讲解。
  • 由于Node节点加入集群的时候被登记的INTERNAL-IP是节点内网IP,这样Master节点在和Node节点通信的时候会直接访问Node的内网IP,所以需要做Iptables的NAT转发。

1.4

采用何种CNI来保证跨VPC/云供应商的Kubernetes集群的网络互通

经过询问各位大佬的建议和自己的实际操作,发现主要有以下几种方式:

  • Flannel VXLAN的模式

Flannel网络通信原理可以看看这篇文章:

https://blog.51cto.com/liuzhengwei521/2427495 https://blog.51cto.com/14143894/2462379

Flannel主要有三种模式,UDP、VXLAN、host-gw,而由于host-gw的原理是将每个flannel的子网的下一跳,设置成该子网对应的宿主机的IP地址,也就是在于IP包在封装成帧发送出去的时候,会使用路由表的“下一跳”来设置目的MAC地址,这就要求必须通过二层网络到达目的宿主机,所以host-gw模式必须要求集群宿主机之间是二层连通的,host-gw模式就被我们放弃了。

而UDP是Flannel最开始采用的方案,但是由于IP包多次在内核态和用户态之间做切换,因此效率最慢,作为Kubernetes集群的网络平台显然会拖累整个集群的响应能力,因此也被放弃了,那么只剩最后的VXLAN模式,也是目前官方主推的模式,我们来简单理解下VXLAN模式的原理:

一句话概括,当两层网络抵达不了的时候,通过虚拟设备的封包解包模拟出一层网络,造成“第三层网络”,在网络上实现互通。

  • Calico IPIP的模式 Calico主要有两种模式:BGP和IPIP模式,和Flannel CNI类似,Calico BGP类似于Flannel host-gw模式,是一种基于路由的模式,没有封包和解包过程,完全基于两端宿主机的路由表进行转发,因此效率很高,但是必须要求两层互通,而且也会因为Iptables膨胀导致性能降低,因为宿主机上每个容器需要在本机添加一条路由规则,而不同宿主机之间需要广播自己的网段路由规则。而IPIP和Flannel VXLAN原理一样,就是基于隧道的模式来建立的,但是好一点的是Calico的封装协议IPIP的header更小,所以性能比Fannel VXLAN要好一点点。
  • Canal 这个Canal不是阿里出的MySQL Binlog同步工具,而是华为出的基于Calico和Flannel开发的工具,不过这个工具的文档较少,所以没有具体研究。

2. Kubernetes集群搭建实战

上面讲了很多“不清不楚”的原理,下面可以开始正式的实战了,本次采用三个云服务器作为节点,三个节点均处于不同的VPC网络下面,每个节点都有自己的公网IP,张馆长的博客写明了在搭建好集群之后所有配置,但是没有写明初始化集群的时候如何配置,我在初始化集群的时候发现加入集群之后总是导致新的Flannel Pod无法启动,原因是因为无法和集群的ApiServer通信,因此在初始化的时候需要更改写Config的参数。

2.1

Kubeadm Config初始化集群

首先来看下我的Kubeadm Config配置

主要需要注意的点是三个部分,从上往下看

  • controlPlaneEndpoint 这个配置需要填写公网IP以及对应的开放给公网的端口,如图中的xxxx:6443,如果没有写上这个的话,会默认访问clusterip:443,为了更方便对外网访问以及调试,可以做修改。
  • apiServer 控制apiServer的暴露地址,修改为公网IP是为了能够让Node节点从公网进行访问。
  • networking.podSubnet 划分子网的CIDR,这个是根据我们选择的CNI插件来填写的,默认Flannel的是10.244.0.0/16,默认Calico的是192.168.0.0/16,这个配置可以根据需求自由填写。

2.2

Flannel CNI部署及修改

Flannel CNI插件默认开启的模式就是VXLAN模式,可以参考官方配置文件

可以看到Backend使用的是vxlan模式。

Flannel主要修改在于部署好Flannel CNI插件之后对于每个节点的Annotations上的public-ip参数进行修改,默认的都是使用内网IP,在使用Flannel VXLAN进行通信的时候也是访问不同,因此需要进行修改。

2.3

Iptables相关修改

参考张馆长的文章,Master通过logs和describe命令调用Node上的某一Pod的时候,往往会出现timeout的情况,这是由于Master和Node之间不能直接通信,而Master调用Node是根据Node的网卡地址的IP,这个IP是内网IP,因此需要做Iptables的NAT转发,如图

2.4

Metrics Server相关修改

在部署metrics server的时候会遇到不能获取Node节点数据的情况,原因还是因为Master节点访问不通Node节点,而Master访问的方式是通过Hostname:xxx的方式,而正常解析域名的时候会把Hostname解析成Node的内网IP,这样会访问不通,所以需要增加hostAliases来自定义hosts,让Master解析域名的时候解析到Node节点的公网IP上才能对Node节点上的数据进行收集。

3. 后续

以上就是对于跨VPC或者跨云供应商搭建K8S集群的思考,虽然成功的实现了集群之间的互通,但是方式上显得不那么“友好”,后续会继续研究相关方案,希望大佬们能够提供宝贵的意见。

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云爬虫技术研究笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

评论
登录后参与评论
1 条评论
热度
最新
有没有详细的安装步骤文档啊 太笼统了没有细节
有没有详细的安装步骤文档啊 太笼统了没有细节
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
使用腾讯云容器服务TKE VS 自建k8s 集群
TKE(Tencent Kubernetes Engine) 是腾讯云提供的容器服务PAAS 平台,基于kubernetes, 集成了腾讯云vpc网络,负载均衡,存储等IAAS 资源,提供容器调度、日志、监控、镜像仓库,Helm编排,自动弹性伸缩,微服务治理,DevOps 等功能,为客户提供完整的企业级容器服务。
caryguo
2019/04/11
6.8K10
使用腾讯云容器服务TKE VS 自建k8s 集群
公网k8s部署(无坑小白版)
在部署 Kubernetes 集群时关闭防火墙,通常是为了避免出现网络问题导致的部署失败或集群节点之间无法通信的问题。
用户7706959
2023/04/26
2.3K1
公网k8s部署(无坑小白版)
扁平-K8s网络模型漫谈
K8s定义了一个网络模型,目的是给Pod,service等使用者提供一个简单、一致的网络视图和使用体验,对它们屏蔽宿主机环境的网络拓扑的同时,也屏蔽网络模型实现上的细节。
LanceZhang
2021/12/06
2.3K0
扁平-K8s网络模型漫谈
Kubernetes(k8s)-网络插件(Flannel)
作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/03/10
2400
Kubernetes(k8s)-网络插件(Flannel)
kubernetes(十八)集群网路
OSI(Open System Interconnection)是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。
alexhuiwang
2020/09/23
1.5K0
kubernetes(十八)集群网路
K8S之CNI
之前我们解决了跨主机间容器间通信的问题,但是这也只能说我们铺好了路,村里通路了,但是其实作为 k8s 来说,还有好多其他的问题等待着我们解决。今天我们就通过这些问题来看看 k8s 的 CNI 的设计。CNI 到底究竟是个什么东西,到底是不是和你想的一样那么困难。
LinkinStar
2022/09/01
1.3K0
K8S之CNI
【K8s】Kubernetes 网络之 CNI
在 Kubernetes 中,CNI(Container Network Interface,容器网络接口)是一个标准化的网络模型接口,负责定义容器如何在网络层面进行交互和通信。
行者Sun
2024/11/11
3790
【K8s】Kubernetes 网络之 CNI
腾讯云私有化容器平台之网络
刚开始接触容器集群的人会发现,与在单节点上使用容器相比,容器集群一个很复杂的领域就是网络。Kubernetes 作为容器编排领域的事实标准,对容器集群的网络进行了合理抽象,并开放了容器网络标准 CNI,供各公司根据自身应用场景和底层基础设施选用开源方案或者自行实现一套网络插件。本文主要介绍腾讯云容器平台针对私有化不同场景的一些网络方案实践。
腾讯云原生
2020/02/14
8.7K0
云原生 | Kubernetes 之常用 CNI 网络插件简述与对比
Kubernetes 需要使用网络插件来提供集群内部和集群外部的网络通信,并提供可扩展和高性能的网络架构,其核心概念如下:
全栈工程师修炼指南
2024/08/20
5530
云原生 | Kubernetes 之常用 CNI 网络插件简述与对比
使用kubeadm快速部署一个K8s集群
Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。
鱼找水需要时间
2023/08/03
1K0
使用kubeadm快速部署一个K8s集群
kubernetes集群网络
问题:Pod是K8S最小调度单元,一个Pod由一个容器或多个容器组成,当多个容器时,怎么都用这一个Pod IP?
yuezhimi
2020/09/30
1.5K0
多图汇总梳理VPC与三种K8s网络模型
大家好,我是二哥。今天这期是一篇关于VPC和三种K8s网络模型的汇总性文章。也是春节前最后一篇文章,发完二哥就准备进入过年模式了。提前祝大家虎年虎虎生威,万事如意。
LanceZhang
2022/01/25
5.7K0
多图汇总梳理VPC与三种K8s网络模型
白话 kubernetes 网络组件 Flannel
今天来聊聊 Flannel,Flannel 是 Kubernetes 默认网络组件,再聊 Flannel 时,我们得先明白一个叫 CNI 东东,CNI 是什么?能有什么用?下文会做出解释。
YP小站
2020/06/04
1.4K0
白话 kubernetes 网络组件 Flannel
k8s实践(4)--k8s集群网络详解和flannel
在讨论Kubernetes网络之前,让我们先来看一下Docker网络。Docker采用插件化的网络模式,默认提供bridge、host、none、overlay、maclan和Network plugins这几种网络模式,运行容器时可以通过–network参数设置具体使用那一种模式。
黄规速
2022/04/14
2.7K0
k8s实践(4)--k8s集群网络详解和flannel
运维锅总浅析kubernetes网络插件
本文首先介绍kubernetes的网络模型,然后分别对Flannel 、Calico 、Cilium网络插件的各种模式进行介绍,最后通过表格方式对比三者的异同及应用场景。希望对您选择Kubernetes网络插件有所帮助
锅总
2024/07/29
3520
运维锅总浅析kubernetes网络插件
公网环境搭建 k8s 集群
笔者利用手头几台云服务器搭建 k8s 集群,由于这几台云服务属于不同的云服务厂商,无法搭建局域网环境的 k8s 集群,故笔者搭建的是公网环境的 k8s 集群,在此做个记录, 以下均在 ubuntu 20.04 环境下进行
菜菜cc
2022/11/15
3.5K0
公网环境搭建 k8s 集群
薅了几个云厂商的羊毛后,我该如何利用它们来组建 k3s 集群?
最近一两年各大云服务商都出了各种福利活动,很多小伙伴薅了一波又一波羊毛,比如腾讯云 1C2G 95/年 真香系列,华为云和阿里云也都有类似的活动,薅个两三台就能搭建一个 Kubernetes 集群。但是跨云服务商搭建 Kubernetes 集群并不像我们想象中的那么容易,首先就是原生的 Kubernetes 组件本身对资源的消耗量很大,而云服务器的资源非常有限,经不起这么大家伙的折腾,对此我们可以选择使用轻量级 Kubernetes 发行版:k3s。
米开朗基杨
2020/06/17
2.1K1
Calico 介绍、原理与使用
Calico 是一套开源的网络和网络安全方案,用于容器、虚拟机、宿主机之前的网络连接,可以用在kubernetes、OpenShift、DockerEE、OpenStrack等PaaS或IaaS平台上。
YP小站
2020/06/04
12.3K0
Calico 介绍、原理与使用
【云原生 • Kubernetes】搭建 k8s 集群(Kubeadm 方式)[通俗易懂]
顾名思义该集群中只有一个 master 节点,在这样的集群规划中,如果 master 节点出了任何问题,它所管理的各个 node 节点都会受到影响,缺点是很明显的。
全栈程序员站长
2022/11/04
4.4K0
【云原生 • Kubernetes】搭建 k8s 集群(Kubeadm 方式)[通俗易懂]
Kubernetes网络模型
在Kubernetes中设计了一种网络模型,要求无论容器运行在集群中的哪个节点,所有容器都能通过一个扁平的网络平面进行通信,即在同一IP网络中。需要注意的是:在K8S集群中,IP地址分配是以Pod对象为单位,而非容器,同一Pod内的所有容器共享同一网络名称空间。
mikelLam
2022/10/31
1.2K0
Kubernetes网络模型
相关推荐
使用腾讯云容器服务TKE VS 自建k8s 集群
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档