摘要:有没有方法绕开CCE的限制,自由的调用K8s的API呢?有还便宜,2.4元/集群/天。

申明:所有的一切都是为了使得华为云可以更好,而不是为了diss它。

通过华为云购买多个K8s集群,又想使用原生K8s接口调用这些集群,有什么好的方式?目前使用CCE服务的API依然是最好的选择。但同时CCE的API又存在诸多限制,如API限流,部分原生接口未开放等。那有没有方法绕开CCE的限制,自由的调用K8s的API呢?本文就是给出一个绕开“防线”的思路。欢迎交流指正~

一、使用场景+遇到的困难

使用场景:我有多个K8s集群。我的“管理模块”(即主系统,是一个批处理系统)跑在一个独立的VPC中,与干活的K8s隔离。然后会调用K8s的接口,投递Job任务到对应的K8s集群中开始干活。如下图:

当前遇到的困难:限流+部分API未暴露。所以希望能有一条上图黄色的通道。

1.1 给每个K8s集群,买个EIP呗?

显然,可行性没问题。但是这个方案并不好:

(1) EIP需要额外付费,价格也不便宜。

(2) EIP是互联网地址,明明我所有程序都在华为云,为什么报文要走互联网绕一圈。

(3) K8s集群并不想对互联网外部暴露,徒增安全风险。

那看看其他方式吧

1.2 华为云VPC打通服务 VPC-endpoint

我们知道跨vpc(特别是跨租户的vpc),可通过华为云的 vpc-endpoint 服务完成连接通道的打通。

参考:https://support.huaweicloud.com/productdesc-vpcep/zh-cn_topic_0131645196.html

既然EIP不合适,那我们就走全部华为云内网的 vpc-endpoint 方案吧。

二、跨VPC打通通道

定下整体方案是就是利用 vpc-endpoint 来打通绕开CCE API-Server的限制。

以下就是操作过程:

2.1 VPCEP直接连3台K8s-Master。(失败)

每个CCE集群,都会有一个内网访问的IP地址。其Master的IP可以在界面看到。

那咱直接让 vpc-endpoint 对接这个IP不就完了么?

如下图:

想法虽然好,可是事实是残酷的。

(1) CCE给出的这个内网IP地址是一个vip(虚IP),本身是用来保证可靠性的。当某台master挂了,会自动漂移到其他2台Master上面。

(2) 经过确认:Vpc-endpoint使用的是vxlan隧道,走的是点对点协议。 也就是vpcep会最终绑定到Master节点的实际IP地址。当vip发生漂移时,vpcep就会失效(不支持自动检测漂移,需要重新绑定到新的节点)。

所以也就没办法通过vpcep直接连3台Master了。

三、通过ELB中转一次连K8s-Master

vpcep服务当前只能对接 (1)ELB实例 or (2)具体的ECS 这2种后端。

而这里咱们有3台Master节点,显然第(2)种就不合适。所以咱就走(1)elb实例吧。

接下来==》那咱重点分析 “k8s集群怎么对接elb”吧。

3.1 使用CCE提供的:Service绑定elb功能。(失败)

K8s自带了一个访问api-server的 service。

所有集群里面的容器,都可以通过这个地址,访问Master。

那我们通过elb去连接这个svc,不就可以了么?

根据CCE的文档,操作起来:

https://support.huaweicloud.com/usermanual-cce/cce_01_0014.html

给SVC设置一个:annotation,带上elb实例id。走起~

嗯?报错了。。

k8s里面的controller报错说:连elb的svc必须要有selector。

也就使用elb直接连那个“无selector”的 “kubernetes” service,CCE的controller会报错,此路走不通。。。

唐老师注:说明controller实现时,考虑的兼容性不够强。当已经有 endpoints 了,应没必要强制要求有 selector了(因为k8s的selector的目的就是为了找到目标地址,咱这里目标都已经提前知道了)

3.2 使用ELB去连3台K8s-Master地址。(失败)

既然CCE的Service实现带了约束,导致Master无法直接对接elb。 那咱就直接从elb角度,直接去连3台master吧(cce的controller,也是调用elb的api来关联的)。

如下图:

可是,事实还是失败告终。

原因:当前华为云的elb只能连 ECS 的主网卡,而咱们的3台CCE Master节点的网卡,都是从网卡。如下图:

ELB实例不支持连从网卡(如下图)。。。

据说华为云的下一代elb(v3)支持连从网卡。于是当前,此路不通~

四、再找个Nginx中转一次吧

Elb不能直接连master节点,而elb连Service又必须得带selector。那就只能额外部署一个proxy容器,使用selector先到这个proxy容器,再转到Master。

4.1 通过Configmap挂载Nginx配置文件。(失败)

启动 Nginx 得有个 conf 配置。 咱们通过 configmap 将nginx.conf配置文件挂载到Nginx容器里面。

嗯?怎么报错了。华为云的WAF将CCE的这个创建Configmap的API拦截了。。。

所以自动化启动Nginx(通过CCE的API-server)是行不通了。

4.2 从K8s内部创建Configmap并挂载。(成功)

走CCE云服务API接口失败,那就走K8s内部的原生接口吧。

# kubectl create configmap nginx --from-file=nginx.conf

其中 nginx.conf 的内容如下:

user  nginx;
worker_processes 1; error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; events {
worker_connections 1024;
} stream { log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"'; access_log /opt/software/nginx/logs/tcp-access.log proxy ;
open_log_file_cache off; upstream kubeapi {
server kubernetes.default:443;
} server {
listen 443;
proxy_connect_timeout 8s;
proxy_timeout 24h;
proxy_pass kubeapi;
}
}

创建configmap完成。

4.3 启动Nginx容器,然后vpcep连接该容器。(失败)

配置文件好了,那我们启动Nginx吧(记得挂载上面那个configmap哦)。

我的configmap挂载地址是:

/etc/nginx/configmap

容器启动命令:

mv nginx.conf nginx.conf.bak; cp configmap/nginx.conf nginx.conf; mkdir -p /opt/software/nginx/logs; nginx &

启动Deployment的同时,创建类型为 Loadbalancer 类型的 Service(使得ELB连通到Nginx容器)。

可以看到elb实例已经创建出来。

4.4 开始创建 vpc-endpoint。

(1)先在目的vpc(即K8s集群对应的vpc网络)创建 vpc-endpoint-service。选择连咱们的elb实例。

重点:权限设置里面,记得允许别人连接。(如果有跨租户调用K8s接口)

(2)然后在客户端的vpc(即管理逻辑模块所在vpc)创建 vpc-endpoint。

通过名字,找到步骤(1)的endpoint-service,并绑定成功:

重点:这里这个 vpc-endpoint 需要 1毛钱/小时。一天2块4,标题说的花点钱就是在这里了。

(3)创建好的vpc-endpoint如下:

咱们直接从客户端访问这个 vpcep(直接代表了那个Nginx容器)吧。

额,不通呀。。。

4.5 终于大功告成

经过定位:是 Nginx容器绑定ELB的时候,CCE没有自动创建elb的backend导致的(应该是小bug,我的集群版本也比较旧,才1.11的)。

后面通过:扩容pod数量,再次触发一次刷新elb后端backend行为:可以看到有backed了

这个时候,通过 vpcep 终于可以访问到目标CCE集群的API了。

(上面401,是因为没有带token。 带了“Authorization: Bearer iam-token”是OK的)

打通的完整流程图如下:

到此,我们就可以随意跨租户、跨VPC、跨集群 来访问K8s的API了,不用经过CCE的Api-server了。

(相当于我们自己造了一个 “伪CCE-API-Server”)

五、总结

通过精心挖掘的通道,花费2.4元/集群/天,即可绕开华为云CCE服务的API-Server的“防线”,“畅通”地调用你购买的K8s接口。

关键在于,为了获得“自由调用K8s接口”这个目的,是否值得这一路上的各种坎坷?至少从这些困难点来看,华为云还存在很大的可改进空间。如:

(1) API-Server限制可否放开一点?

(2) ELB能否直接对接K8s-Master?

(3) VPC-endpoint能否直接对接K8s集群?

(4) VPC-endpoint,无法提供报文日志,用户无法自己排查问题。

(5) 能否有更简洁的管理多K8s集群的“伪API-server”功能。

但是,正是因为有人去发现问题,才能有变得更好的可能,不是么? 感谢各位,Thanks~

点击关注,第一时间了解华为云新鲜技术~

如何花“一点点小钱”突破华为云CCE服务的“防线”的更多相关文章

  1. 【20191118会议】针对华为云CCE 问题总结

    针对华为云CCE问题总结 如何购买CCE集群 可以分为测试环境和生产环境,针对使用范围进行购买集群. 测试环境 可以进行公用 生产环境建议使用单独集群 尤其针对部门大 耦合性不高 ,生产环境 建议使用 ...

  2. 【华为云技术分享】智能诊断和优化,华为云DAS服务云DBA平台让您无忧运维

    摘要:随着时代的发展,传统的“人工”运维方式,已经逐渐跟不上企业业务发展的需要.如何更好的保证数据库系统的稳定性.安全性.完整性和高性能,实现运维工具化.产品化.自助化.自动化,是当前数据管理和运维面 ...

  3. 云图说丨初识华为云微服务引擎CSE

    摘要:微服务引擎(Cloud Service Engine,CSE),是用于微服务应用的云中间件,为用户提供注册发现.服务治理.配置管理等高性能和高韧性的企业级云服务能力 本文分享自华为云社区< ...

  4. 华为云备案服务全面升级,EI助力带来极速体验

    华为云备案"电子化核验"正式发布,备案更轻松.更快捷.自2019年9月12日起,华为云用户申请办理ICP备案可以通过华为云APP进行"ICP备案主体真实身份信息采集&qu ...

  5. 如何在 Flutter 中集成华为云函数服务

    介绍 云函数是一项 Serverless 计算服务,提供 FaaS(Function as a Service)能力,可以帮助开发者大幅简化应用开发与运维相关事务,降低应用功能的实现门槛,快速构建业务 ...

  6. 华为云Istio服务网格,让应用治理智能化、可视化

  7. 大海航行靠舵手 华为云靠什么征服K8S?

    Kubernetes 是Google开源的容器集群管理系统或者称为分布式操作系统.它构建在Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于 ...

  8. 华为云亮相QCon2020深圳站,带你体会大厂的云原生玩法与秘诀

    摘要:在QCon全球软件开发大会上,华为云开发者生态总监张全文作为"云原生应用开发实践"专题出品人,携手华为云四位资深技术专家带来精彩分享. 作为当下技术领域最火热的技术趋势之一, ...

  9. #PHP# 华为云 API 方式发送短信

    使用给华为云 消息 服务 API 方式发送短信 代码来自华为云,已通过测试 <?php /** * 华为云发送短信示例代码 * 本段代码需要使用自己的配置信息才能正常运行,出配置信息外,不需要改 ...

  10. 华为云EI人脸识别接口初探

    0. 准备工作 开户及申请开通人脸识别服务,可以参考https://education.huaweicloud.com:8443/courses/course-v1:HuaweiX+CBUCNXE01 ...

随机推荐

  1. Python如何在日志中隐藏明文密码

    Python如何在日志中隐藏明文密码 前言 在项目开发中,有的时候会遇到一些安全需求,用以提升程序整体的安全性,提高外来非法攻击的门槛,而在日志中隐藏明文密码打印便是最典型的安全需求之一. 在Pyth ...

  2. 一个vuepress配置问题,引发的js递归算法思考

    前言 这两天在尝试用语雀+ vuepress + github 搭建个人博客. 小破站地址 :王天的 web 进阶之路 语雀作为编辑器,发布文档推送 github,再自动打包部署,大概流程如下. 问题 ...

  3. [最优化DP]决策单调性

    决策单调性的概念&证明工具: 决策单调性,是在最优化dp中的可能出现的一种性质,利用它我们可以降低转移的复杂度. 首先dp中会有转移,每个状态都由若干个状态转移而来,最优化dp比较特殊,只能由 ...

  4. Stride游戏引擎试毒

    想找别的引擎用, 主要还是因为unity和国内盗版用户的互相伤害, 就算用免费的个人版也要不停的验证. stride引擎, 原名xenko, 再原名paradox... 一开始是日本厂商开发的引擎, ...

  5. CF1789D Serval and Shift-Shift-Shift 题解

    题目链接 题目分析 首先,看到题目中的左移右移之后再异或,我们自然可以想到在移动的过程中字符串的一段前缀和后缀不会改变,考虑通过这个性质逐位还原. 因为异或 0 不会改变原本的值,所以我们可以找到整个 ...

  6. JavaScript:对象的三个属性

    每一个对象都有与之相关的原型(prototype).类(class)和可扩展性(extension attribute). 原型 prototype 对象的原型属性是用来继承属性的.通过对象直接量创建 ...

  7. Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战

    一.前言 在现代软件开发中,事务处理是必不可少的一部分.当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况.在SpringBoot框架中,我们可以使用声明式 ...

  8. 模拟ASP.NET Core MVC设计与实现

    前几天有人在我的<ASP.NET Core框架揭秘>读者群跟我留言说:"我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你 ...

  9. 一款.NET开源的小巧、智能、免费的Windows内存清理工具 - WinMemoryCleaner

    前言 我们在使用Windows系统的时候经常会遇到一些程序不会释放已分配的内存,从而导致电脑变得缓慢.今天给大家推荐一款.NET开源的小巧.智能.免费的Windows内存清理工具:WinMemoryC ...

  10. 【Android】【外包杯】后台管理系统 | 进度day01

    外包杯官方提示:平台不要太大,只是一些小东西包括支付宝和微信小程序打开,无需安装口香糖,餐巾纸有一块屏幕,不需要很大,只需要满足顾客可以看到传播的内容打开橱窗不要有锋利边角,不要求一体,提高场景利用率 ...