摘要:有没有办法绕开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.c...
既然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.c...
给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~
点击关注,第一工夫理解华为云陈腐技术~