UCloud产品体验报告

ucloud体验一周,惊喜与惊吓不断

1. 不说产品

1.1. UHost

让我印象最深的就是定价,所谓的按量,就是按小时收费,对于包月收费分为两种:到月末以及包月,据说是7天之内随意退,已使用部分按照已使用小时按月平均收费,也就是说,如果你使用七天内,千万别开按量,直接按月。

另一个亮点算是备注吧,可以写点extra信息,UHost标签系统单一,只支持一个Tag,并且叫做业务组,只有值,无键。

UCloud的网络定制化很弱,能建立VPC,子网,但是三层无法添加路由,也就是说,你如果在一个VPC中划分多子网,并且部署了VPN等网关设备和办公室或者其他IDC打通,那么想要路由特定流量,就需要在所有UHost中配置路由!!是所有!!如果你想要VPC以外的地方通过VPN访问内网ULB,可是ULB配置不了回包路由啊,咋整???

解:牺牲源IP穿透,在VPN等网关设备添加SNAT,进行地址伪装;或者DNAT。

另外,UCloud的SDN网络貌似MTU值较小,只有13901454(更正)??如果使用了类IPsec的携带额外封包,需要将MSS调小(之前以为1360够了,那是针对MTU为默认的,现在需要调整到1314以下,方可使用,不然会因为数据包无法分段,导致通信受阻)

硬件隔离组?类似于部署级,是个好东西,用于防止多个虚拟机跑到一台物理机上,增加了可用性。IsolationGroup最多添加7台实例,猜测是为了满足大多数理论而定的值,比如zkkafkaetcd等,但是对于无状态应用本身,需要在实例外分配app,尽可能使相同应用在一个硬件隔离组中。现在只是同组横向隔离,如果再整个组间隔离就更好了。在我们k8s的使用场景下,就只能按照NodeLabel创建硬件隔离组了,然后使用应用反亲和进行调度了(或者可以将硬件隔离组作为节点label,参与节点亲和性调度)。UK8s本身并没有考虑到硬件隔离组。

再说说防火墙?丫的就是安全组,而他们非要称之为外网防火墙,搞笑的是,他们API的参数还是叫SecurityGroup,哈哈哈。这个就比较坑了,UCloud产品脑袋绝对有坑,原因有3:

  1. 每个实例必须且只能绑定一个防火墙

  2. 想要放开所谓的"全部",就得将全部TCP全部UDPICMPGRE规则都添加上,一共四条;产品怎么想的?增加操作复杂度,从而减少因为放开全部导致的安全事故?;放开"全部"有那么难吗?

  3. 菜单栏叫基本协议,里面是2中提到的4种,我想着既然有基本协议,就应该有非基本协议吧?找了半天,然而,失望了,并没有。那么遇到非基本协议咋整?解:抱歉我们的产品已经满足了大多数用户的需求,你们这种小众需求,我们无法支持

不过至少有一点是可以的:

他们同一个外网防火墙可以跨VPC复用,并且所有在外网防火墙内的UHost均可畅通无阻。最新了解:ucloud的外网防火墙仅仅针对EIP有效,内网无效!!!震惊!!!所以Ucloud的VPC内部无任何访问限制~~

这也是我为啥妥协的原因,在不需要接入非同一VPC机器作为k8s节点的情况下,是能满足需求的。

啥玩意儿?为啥?你在说啥?

笔者使用calico插件,使用CrossSubnet模式,对于同一子网,走路由;跨子网,走ipip隧道,而ipip协议不包含它防火墙所定义的基本协议中,自然就无法放行了。sao!

再说说UHost本身吧, 两种特性:网络增强高磁盘IO型,前者高包转发率,后者无限制SSD本地磁盘。网络增强型必须CPU>4高IO型必须外挂本地数据盘。

UHost不支持metadata,不支持cloudinit。本地磁盘类型系统盘,默认镜像系统盘大小,只能增加,不能减少,本地盘扩缩容需要重启实例,名曰改配,费时。

API接口简陋,文档非同步最新,比如隔离组参数,API文档中都没有。

SDK基本没啥人用,比如Go的ucloud-go-sdk才36个star,估计还都是自己人点的,sdk的风格基本抄的aws,所以用起来还算顺手,不过描述与行为不符,缺乏单元测试。

问题来了,既然不支持metadata,当你在UHost中迷路,想知道自己是谁怎么办呢?又没有与生俱来的metadata,也没有哪里注入了UHost相关的信息?

解:唯一办法,开只读权限secret,先获取本实例私有IP,然后调用APi,DescribeInstance,翻页遍历,条件: PrivateIp == IP,他们的查询实例信息,并不支持Filter参数,所以只能将数据Load到本地,然后比对过滤。(使用goroutine,分别取,只要有一个满足即退出,用race这种方式,应该能优化不少时间,当然是在实例很多的情况下)

别问我怎么知道的,我也想尽了各种办法,只有这一条路可走,最终用go写了个metadataq的工具,用于模拟metadata信息查询,每次查询得2秒以上,具体还得依赖于地区,网络等(ucloud全球api只有一个入口!!!)后来跟k8s小组的人聊,他们也是这么获取UHostID等metadata的,然后再申请各种k8s需要的资源,比如UDisk,比如ULB,真心苦了这帮开发了。

UHost就说这么多吧,像前端UI的坑啊,API和UI信息不一致的坑啊,像高磁盘IO实例UI限制必须挂载本地数据盘然而创建完可删的逻辑错误啊,再比如删除本地磁盘并没有删除/etc/fstab相关条目导致实例无法启动的白痴型BUG啊,再再比如控制台登录没法复制的体验问题啊,再再再比如做镜像必须关机,镜像与快照无关等等等问题,我就不一一吐槽了。

1.2. ULB

用过最难用的负载均衡之一,看其配置,能勾起当初与大拿详聊LVS-DR模式的回忆。

首先UCloud的ULB使用的使他们基于DPDK自研的类LVS-DR模式的负载均衡。

这措辞,一点没问题,DPDK是工具包,类LVS-DR,只是参照,最终还是自己研发的。

反正别管那么多,你当LVS-DR模式看待就行了,原理机制一模一样,哈哈哈。

DR模式包流转过程:包进LVS,修改其MAC地址为RS节点MAC,然后重新丢回进行二层转发,到达RS节点后,由于lo绑定了VIP与LVS入口IP一样,包合法,in,处理,封包出去,源地址为VIP,目标地址为客户端IP,直接发送给客户端。

如果用LVS-DR模式做四层负载均衡,会有什么特点呢?(不考虑性能,性能自然是杠杠的,不过大多数场景无益)

  • LVS本身不涉及端口,不代理,只做mac修改包转发,也就意味着监听端口与RS监听端口必须一致;如果不一致,需要在RS节点使用iptables处理,在PREROUTING链进行端口转发,不过不易于维护。

  • RS本身可以通过ULB访问自己哟,无需使用俩代理做跳板(算个特点)

  • 除了ULB控制台点点点,RS节点需要额外添加网卡信息,如果RS节点作为多ULB后端,需要绑定多个别名回环口网卡

  • 存在本地限制,凡是后端RS节点访问ULB,会直接本地处理,一旦该RS对应的服务出现异常,那么另外N-1个RS也无法提供给该RS服务

ULB看样子更专注外网,外网支持HTTP/TCP/UDP,而TCP既支持类DR的包转发模式,也支持代理模式(Haproxy实现);而可怜的内网,只支持包转发模式。

1.3. UK8s

简单说说吧,毕竟还是聊得挺愉快的

算是公测新产品吧,貌似做k8s的团队没多少人,据观察,按条罗列吧

  1. 所有k8s组件使用hyperkube混合工具启动

  2. master独立,只包含etcd、k8s三大组件以及uk8s-controller(ucloud cloud controller),不包括节点组件kubelet以及kube-proxy,不作为master节点

  3. 网络这块,他们本身就是SDN,自研cni,做到UHostIP与PodIP同网段也不算太难,看样子应该没有支持NetworkPolicy

  4. 存储这块,跟aliyun类似,使用flexvolume,调用自研工具跟UDisk联动

  5. LoadBalancer模式与ULB联动,3,4,5的控制部分都在uk8s-controller中

  6. 提供kubectl的控制台,用于命令行操作

  7. Uk8s管理界面比较简单,就是将各种资源分tag罗列

  8. Docker这块应用不知是否做定制,配置这块关闭iptables,禁用默认bridge,使用overlay2等,这会导致DIND模式无法访问网络

  9. 部分参数无效,但无妨

  10. 版本很新,已经v1.13.1+不过关键特性,并没有跟云支持的很好,比如VolumeSchedule

  11. 没有考虑硬件隔离组

总体感觉:干净。

这既是优点也是缺点,它不涉及太多资源,只是帮你起了一套k8s集群,剩下的都是你的舞台;不过啥都没,依赖于使用者对k8s的应用能力。

2. 说问题

2.1. 通过ULB无法访问kubernetes-dashboard

解:访问路径:ULB--lvs-->traefik-->ipip-tunnel-->kubernetes-dashboard对应的Pod

经过抓包,最终定位到问题出现在ipip-tunnel上。如果ip包过大,就无法经由ipip-tunnel。

经查看,Ucloud的MTU调整过,全网统一为1454,而calico网卡的mtu默认为1500,ipip-tunnel的mtu为1440。1440 + 20 > 1454,导致响应包回不来(部分包能回来,要么是小包,比如ping包才56,要么是携带P标志)。

最终解决方法参考calico配置mtu数据,ucloud为1454,那么calico网卡也设置为1454,ipip设置为1434即可完美解决,对应的配置为:

# cni配置文件
{
...
"mtu": 1454,
...
}
# IPIP TUNNEL配置
## 设置calico/node的环境变量
FELIX_IPINIPMTU=1434

ucloud这该死的mtu~~,折腾人