关于k8s:如何花一点点小钱突破华为云CCE服务的防线

81次阅读

共计 4039 个字符,预计需要花费 11 分钟才能阅读完成。

摘要:有没有办法绕开 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~

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0