作者:若禾、昱晟、瑜佳

记者: 各位阿里巴巴云原生的读者朋友们咱们好,欢迎再次来到探求身世之谜系列专访栏目,今日邀请来的仍是咱们的老朋友,『阿里云容器服务 ACK 发行版』,前次的访谈中它为咱们介绍了阿里巴巴开源集群镜像技能 sealer,以及它们是怎么相互配合来到达阿里云 ACK 服务的快速安稳交给。错失的读者不要忘记去回忆一下哦~那么这次做客,它又会为咱们介绍哪位小伙伴呢?

阿里云容器服务 ACK 发行版(简称 ACK Distro) :咱们好,咱们又碰头了!信任经过前次的毛遂自荐,你们对我现已有了大概的了解,这次就不多赘述了。本次采访我将继续为咱们具体讲解我的好伙伴:阿里巴巴的开源 Kubernetes 容器网络解决计划 hybridnet,以及我是怎么凭借它来构建混合云一致网络平面。

记者: 好的,那您请先谈一下 hybridnet 是什么以及项目组成员是出于怎样的设计理念才诞生了 hybridnet。

hybridnet 的定义及其设计理念

ACK Distro: 好的,首要 hybridnet 是阿里巴巴开源的一款面向混合云场景的 Kubernetes 容器网络解决计划。它能够协助用户在物理机和虚拟机的异构环境之上,构建一层 underlay + overlay 的一致网络平面,并供给丰富的管控运维才干。一起为混合云场景下集群布置和运用交给过程中呈现的容器网络布置及运维问题,提出了一种全新的解决思路。

它的根本设计准则是:

  1. 为了确定一致网络模型,下降认知与保护本钱,而且确保安稳的长时间演进
  2. 屏蔽底层异构根底设施,进步交给落地鲁棒性,下降生产交给、PoC 本钱
  3. 在一致模型的束缚下,既能供给 underlay 高功能直通网络计划,来满足网络打通和功能的双重需求,又能支撑在某些功能不敏感的场景下供给 overlay 虚拟网络计划
  4. 尽量下降关于外部环境的依靠,确保数据面的简略
  5. 与 Kubernetes 深度集成,供给双栈、IP 坚持、IP 固定等高阶 IPAM 才干,确保用户上云后运用习气不变

不同于与单一 IaaS 厂商的公有云或专有云底座绑定输出的 terway、aws-cni 等容器网络计划,项目组成员期望 hybridnet 能够解决多云混合云场景下异构底座带来的一致性和适配性难题,在不同的根底网络环境上供给敏捷、通用和安稳的交给才干,而且经过一致视角的模型束缚和运维管控,解决复杂场景下的网络规划、办理及运维等问题。

记者: 那我是不是能够这么理解,hybridnet 力求做到“underlay/overlay 混合布置” 和“underlay/overlay 一致办理运维”。

ACK Distro: 是的没错,hybridnet 也的确做到了。我能够再拓宽描绘下,在一个运用了 hybridnet 的 Kubernetes 集群中,同一个节点上能够一起有 underlay 和 overlay的 Pod,一切 Pod 之间的集群内部访问行为完全一致不需求任何额定感知。这样,用户能够在“纯 overlay 集群”、“纯 underlay 集群”、“underlay 混合集群” 之间进行自由挑选和转化,一起享受 underlay 网络带来的高功能和网络直通才干,以及 overlay 网络的资源无限和高适配性。而且在一致模型的束缚下,underlay 网络和 overlay 网络在办理、运维上也坚持了概念一致。

记者: 除了它的设计理念,您能够用更直观的办法让读者理解 hybridnet 能够做什么吗?

ACK Distro: 当然,我从介绍它的中心模型下手阐释其功能特点吧~为了使 hybridnet 的运用者能够经过初始化不同的中心模型来对根底网络环境进行灵敏多样地描绘,让容器网络以不同的形状运转,项目组成员经过对经典网络中的概念进行笼统,引入了下面三个中心 CRD 模型来对网络资源进行笼统和办理。

hybridnet 的中心模型

Network

在 hybridnet 中,每个 Network 表明一个“调度域“,一个调度域表明一组具有相同网络性质的节点,Network 是环境拓扑信息传入的首要进口。一个特定的 IP 能够在其所属调度域内的各个节点间自由搬迁。

Network 经过 nodeSelector 与节点相关联,关于一些特殊的 Network,比如 overlay 的 Network,nodeSelector 可能为空,这种 Network 的调度域为集群内的一切节点。

Subnet

在 hybridnet 中,Subnet 表明一个调度域内能够分配的 IP 资源,Subnet 是环境网络 IP 资源规划信息传入的首要进口。每个 Subnet 有必要归于一个 Network。Subnet 具有比较灵敏的特点:

  • 支撑 cidr 可分配地址范围的挑选,经过 spec.range.start 和 spec.range.end 能够从一个 cidr 中再精确地划分出一个小的网段

  • 支撑保存离散的 IP 地址不分配,当网段中现已有 IP 地址被运用了的时分,能够经过将现已被运用了的 IP 填写入 spec.range.excludeIPs 的数组字段,hybridnet 将不会再将这些 IP 分配给 Pod

  • 支撑保存指定的 IP 不被运用,当网段中需求保存某些 Pod 的 IP,仅被特定的 Pod 指定运用时,能够经过将这些 IP 填写入 spec.range.reservedPs 的数组字段,hybridnet 将不会再把这些 IP 用于非指定 IP 的分配

IPInstance

IPInstance 目前只用作监控,每个 IPInstance 代表一个实际现已被分配出容器网络的 IP。能够经过 kubectl get IPInstance 看到其对应的 Pod、所属 Subnet、Pod 对应的节点等等信息。

记者:那么 hybridnet 的优势怎么在您身上表现呢?换句话说,您怎样办理 hybridnet 以到达最佳实践呢?

怎么在 ACK Distro 中办理 hybridnet

ACK Distro: 我经过操作上述的 CRD 模型来为咱们进行网络办理操作示例吧~其中,hybridnet 会作为我唯一内置的网络插件布置。(当然啦,经过 sealer 的才干,自定义第三方的网络插件也是可行的,咱们能够参考本系列榜首篇文章。)

默许行为

作为我的固定行为,初始化一定会存在一个 overlay 的 Network,而且此刻默许网络类型是 overlay,经过下面指令能够检查此刻的 Network 和 Subnet 信息:

[root@iZf8zdygpbo4hx57g2wahaZ ~]# kubectl get network
NAME        NETID   SWITCHID
network-0   4       virtual-switch
[root@iZf8zdygpbo4hx57g2wahaZ ~]# kubectl get subnet
NAME                 VERSION   CIDR            START   END   GATEWAY      TOTAL   USED   AVAILABLE   NETID   NETWORK
subnet-0-network-0   4         100.64.0.0/16                 100.64.0.1   65533   2      65531               network-0

咱们能够看到,用默许装备初始化的我会创立一个名叫 network-0 的 Network 和 subnet-0-network-0 的 Subnet,容器网段的 CIDR 为 100.64.0.0/16,此刻新创立的 Pod 都会以 overlay 的方法拉起。

由于我的根底组件自身没有特别的网络诉求,这样最大的好处是,overlay 网络协助我屏蔽了底层根底网络设施,换言之,我能够凭借 hybridnet 以相同的装备在任何网络环境中一键拉起,一起并不影响后续网络扩展的可能性。

从混合云环境的交给经验来看,这种方法能将网络规划(首要是 underlay 网络)延后到“运维”的阶段,能够最小化“交给”阶段的落地本钱,进步布置效率。

增加 underlay 网络

假如存在部分 underlay 网络诉求(比如出于“overlay 功能瓶颈” 或者 “Pod IP 对外直接透出才干”的考虑),underlay Pod 占比较少,特别是您不期望占用根底网络环境中的 IP 资源时,能够挑选在默许行为创立的 overlay Network 之外,额定增加一个 underlay 的 Network 以及对应的 Subnet。(新旧 overlay/underlay Network 在模型上没有任何依靠顺序关系)

在这次示例的实验环境中,节点网段为 192.168.56.0/24(一切节点在一个经典二层网络中),由于节点 IP 只用了 192.168.56.1、192.168.56.2、192.168.56.3、192.168.56.4,咱们考虑将未被运用的 192.168.56.100~192.168.56.150 地址范围留给容器运用,搭建一个最简略的 underlay 网络。这种情况咱们只需求运用如下 yaml:

---
apiVersion: networking.alibaba.com/v1
kind: Network
metadata:
  name: underlay-network1
spec:
  netID: 0
  nodeSelector:
    network: network1
  type: Underlay
---
apiVersion: networking.alibaba.com/v1
kind: Subnet
metadata:
  name: underlay-subnet1
spec:
  network: underlay-network1
  netID: 0
  range:
    version: "4"
    cidr: "192.168.56.0/24"
    gateway: "192.168.56.254"
    start: "192.168.56.100"
    end: "192.168.56.150"

由于 Network 经过 nodeSelector 关联 Node,咱们需求给想要布置 underlay Pod 的节点打上对应 Network nodeSelector 的标签,这儿咱们只期望在节点 izf8zdygpbo4hx57g2wah8z 上有 underlay 类型的 Pod:

kubectl label node izf8zdygpbo4hx57g2wah8z network=network1

此刻默许网络类型依然是 overlay 网络,创立 underlay 的 Pod 只需求简略经过给 Pod 增加 networking.alibaba.com/network-type: Underlay 的 annotation 指定。效果如图:

[root@iZf8zdygpbo4hx57g2wahaZ ~]# kubectl get po -owide -n test
NAME                                 READY   STATUS    RESTARTS   AGE     IP               NODE                      NOMINATED NODE   READINESS GATES
curl-deployment-1-5cfb5dcb8c-65fr7   1/1     Running   0          11m     100.64.0.29      izf8zdygpbo4hx57g2wahbz   <none>           <none>
curl-deployment-1-5cfb5dcb8c-hp626   1/1     Running   0          11m     100.64.0.26      izf8zdygpbo4hx57g2wahbz   <none>           <none>
curl-deployment-1-5cfb5dcb8c-qbr6w   1/1     Running   0          11m     100.64.0.27      izf8zdygpbo4hx57g2wah7z   <none>           <none>
curl-deployment-1-5cfb5dcb8c-zclv2   1/1     Running   0          11m     100.64.0.31      izf8zdygpbo4hx57g2wahbz   <none>           <none>
curl-deployment-1-5cfb5dcb8c-zfqkp   1/1     Running   0          11m     100.64.0.28      izf8zdygpbo4hx57g2wah7z   <none>           <none>
curl-ss-0                            1/1     Running   0          6m24s   192.168.56.140   izf8zdygpbo4hx57g2wah8z   <none>           <none>
curl-ss-1                            1/1     Running   0          6m5s    192.168.56.141   izf8zdygpbo4hx57g2wah8z   <none>           <none>
curl-ss-2                            1/1     Running   0          6m1s    192.168.56.142   izf8zdygpbo4hx57g2wah8z   <none>           <none>

修正默许网络类型为 underlay

假如您 underlay 的网络诉求占绝大多数,期望默许创立出来的便是 overlay 的 Pod,也能够修正默许网络类型为 underlay,修正完之后,默许会以 underlay 的网络创立 Pod,而且依然能够经过给 Pod 增加 annotation 的方法指定 Pod 以 overlay 的网络被创立。现已创立的 overlay Pod 不会受到影响。

修正默许网络类型需求别离 kubectl edit deploy hybridnet-webhook -n kube-system 和 kubectl edit deploy hybridnet-manager -n kube-system,修正容器启动的 DEFAULT_NETWORK_TYPE 环境变量为 Underlay:

spec:
  containers:
    - name: hybridnet-[manager|webhook]           
      command:
        - /hybridnet/hybridnet-[manager|webhook]
      env:
        - name: DEFAULT_NETWORK_TYPE
          # "Overlay" or "Underlay", 
          # default "Underlay" if environment variable not configured. 
          value: Underlay

这样修正完之后,Pod 将会默许以 underlay 的方法被创立,新的 underlay Pod 与原有 overlay Pod 的网络连通性不受影响(简略来说,相当于 underlay Pod 会有一个与其他 overlay Pod 通讯的 overlay 的身份)。****

增加/删去网络资源

就如同上面示例中展现的,增加 Network/Subnet 的网络资源只需求运用对应 CR 的 yaml 即可,一旦 Network/Subnet 被运用,hybridnet 会以为环境中现已完结根底网络装备,而且运用对应 CR 进行网络资源分配。

出于安全角度考虑,删去 Network/Subnet 的操作是有根本束缚的。只有当 Subnet 中没有 IP 在被运用时,Subnet 自身才干被删去;同理,只用先删去 Network 中的一切 Subnet,Network 自身才干被删去。

ACK Distro:总而言之,凭借 hybridnet ,我能够使阿里云容器服务 ACK 在异构环境之上,构建一层 underlay + overlay 的一致网络平面,进步管控运维才干,为广大的开发者带来更好的容器服务体验。

记者: 好的,十分感谢您这次的仔细讲解,第二弹深度访谈到这儿又要跟咱们说再会了,等待下次与读者朋友们的相遇。

ACK Distro: 咱们下次再会!

相关链接​

[1] hybridnet 开源库房地址

​https://github.com/alibaba/hybridnet​​

[2] hybridnet 社区文档

​https://github.com/alibaba/hybridnet/wiki​​

[3]ACK Distro 官网

​https://www.aliyun.com/product/aliware/ackdistro​​

[4] ACK Distro 官方 GitHub​[​]

​​https://github.com/AliyunContainerService/ackdistro​​

往期推荐

​​1、让创新触手可及,阿里云容器服务 ACK 发行版敞开免费下载​​

​​2、与阿里云容器服务 ACK 发行版的深度对话榜首弹:怎么凭借 sealer 实现快速构建 & 布置​​


了解更多相关信息,请扫描下方二维码或查找微信号(AlibabaCloud888)增加云原生小帮手!获取更多相关资讯!

与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面
​ 发布云原生技能最新资讯、汇集云原生技能最全内容,定期举办云原生活动、直播,阿里产品及用户最佳实践发布。与你并肩探究云原生技能点滴,共享你需求的云原生内容。

关注【阿里巴巴云原生】大众号,获取更多云原生实时资讯!