云社区 博客 博客详情
云社区 博客 博客详情

如何花点钱突破华为云CCE服务的“防线”

tsjsdbd 发表于 2020-10-13 20:18:20 10-13 20:18
tsjsdbd 发表于 2020-10-13 20:18:20 2020/10/13
1
1

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

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

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

 

1      使用场景+遇到的困难

使用场景:我有多个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 方案吧。

 

2      VPC打通通道。

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

以下就是操作过程:

 

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

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

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

如下图:

 

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

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

 

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

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

 

3      通过ELB中转一次连K8s-Master

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

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

 

接下来==》那咱重点分析 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报错说:连elbsvc必须要有selector

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

 

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

 

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

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

如下图:

 

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

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

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

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

4      再找个Nginx中转一次吧

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

 

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

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

嗯?怎么报错了。华为云的WAFCCE的这个创建ConfigmapAPI拦截了。。。

 

所以自动化启动Nginx(通过CCEAPI-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毛钱/小时。一天24,标题说的花点钱就是在这里了。

 

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

 

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

额,不通呀。。。

 

4.5      终于大功告成

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

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

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

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

 

打通的完整流程图如下:

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

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

 

5      总结

通过精心挖掘的通道,花费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~

 


登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
评论文章 //点赞 收藏 1
点赞
分享文章到微博
分享文章到朋友圈

评论 (1)


技术火炬手

1楼2020-10-14 18:17:58
唐老师,你好!云声是华为云的建议反馈平台:https://bbs.huaweicloud.com/suggestion
如有建议可以在这个地方提交!
0/1000
评论

登录后可评论,请 登录注册

评论

您还没有写博客的权限!

温馨提示

您确认删除评论吗?

确定
取消
温馨提示

您确认删除评论吗?

删除操作无法恢复,请谨慎操作。

确定
取消
温馨提示

您确认删除博客吗?

确定
取消

确认删除

您确认删除博客吗?

确认删除

您确认删除评论吗?

温馨提示

登录超时或用户已下线,请重新登录!!!

确定
取消