KubeVela篇13:跨地域的多集群管理方案

原创 吴就业 170 0 2023-10-13

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/e66e102cae9d4cbfa462977d0f7fbf91

作者:吴就业
链接:https://wujiuye.com/article/e66e102cae9d4cbfa462977d0f7fbf91
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

随着公司全球化战略的布局,业务呈点状分布在亚太、美东、欧洲等多个地域,云原生kubevela在跨地域多集群管控方面也遇到网络上的互通问题。

多地域多集群分布

在公司网络规划上只允许一个区域的一个VPC跟另一个区域的一个VPC打通,同区域不同机房的网络都可以打通的网络架构基础上,由于一个区域可能有多个业务,业务的k8s分布在不同云厂商或机房,要让kubevela管理分布在各个地域机房的K8s集群,需要引入代理。

跨地域管理多集群

kubevela作为管控集群,需要管控分布在全球多个机房的k8s集群。考虑到成本计算的问题,以及业务的加入退出问题,我们在每个区域部署一个代理集群,在代理集群上部署四层代理Nginx,通过四层代理将kubevela发起的kubenetates api请求转发给目标k8s集群。

跨地域多集群管理

kubevela访问业务集群,是访问api-server,(client-go)通过kubeconfig new一个clinet去访问k8s的api。因此是需要使用https协议的,并且client会从kubeconfig里面获取集群的域名和ssl证书发起请求,kubeconfig是我们给kubevela添加业务集群的时候传给kubevela的。

kubevela所在的集群的vpc和代理集群的vpc会通过terraform申请打通,打通后,Nginx使用NodePort暴露服务,kubevela可以直接使用代理集群的Node的ip加上特定端口号去访问被nginx代理的服务,这个ip可以通过k8s的api拿到。

nginx代理业务k8s集群(业务k8s集群的kubeconfig的server域名),配置将NodeIp:NodePort的请求转发给业务k8s集群。但kubeconfig签名的证书是kubeconfig的server字段的域名,因此不能直接通过代理集群的NodeIP访问。

另外如果kubeconfig中的server域名出现大写,由于域名有大写字母不合法,可以转成小写。证书签的是根域,域名子域部分将大写改成小写不影响证书。 Nginx的配置:

 business-a.conf: |
      server {
        listen            8000;
        // 业务集群的k8s集群的kubeconfig的server字段
        proxy_pass        xxxxxx.us-east-1.eks.amazonaws.com:443;
      }

Service:

apiVersion: v1
kind: Service
metadata:
  name: cross-region-nginx-proxy-svc
  namespace: vela-system
spec:
  type: NodePort
  ports:
  - name: business-a
    nodePort: 30000  
    port: 8000
    protocol: TCP
    targetPort: 8000
  selector:
    app: nginx

Kubevela的pod并不能直接解析业务集群的kubeconfig的server域名,但pod可以通过hostAliases绑定域名解析,将指定的一个域名解析到一个ip。我们通过给kubevela的cluster-gateway Pod添加hostAliases,将原server解析到代理集群的NodeIp。并在给kubevela添加业务集群的时候,将kubeconfig中sever的端口号换成NodePort。这样kubevela就可以用kubeconfig去访问业务集群了。

spec:
  template:
    spec:
      hostAliases:
      - ip: "172.16.8.8"
        hostnames:
        - "xxxxxx.us-east-1.eks.amazonaws.com" 

参考文献:

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

云原生项目用于验证负载感知调度的go-web-demo

我们在做云原生调度技术调研的时候,为了做实验获取一些数据,需要编写一个demo,支持动态模拟cup使用率和内存使用,所以用go开发了这么一个web程序。

KubeVela完结篇:我为Terraform Controller贡献了3个PR

KubeVela于2020年年底开源,距离现在还未满三年时间,是一个非常年轻的产物。KubeVela是非常创新的产物,如OAM模型的抽象设计。所以也并未成熟,除了官方文档,找不到更多资料,在使用过程中,我们也遇到各种大大小小的问题。

KubeVela篇14:如何实现存量业务的基础设施导入Kubevela+Terraform

由于我们的使用场景是将基础设施资源定义成KubeVela的组件,一个terraform “module”对应的就是一个kubevela的组件,对应terraform-controller的一个Configuration资源。因此导入的最小粒度是组件,即一个terraform “module”。

KubeVela篇12:自定义工作流步骤以及踩坑经验

官方提供的工作流步骤有限,另外,对于自研的PaaS平台,我们需要借助工作流步骤实现一些例如存量项目基础设施导入、项目环境初始化、平台组件共享基础设施需要解决的差异对比审核、基础设施漂移等。

KubeVela篇11:可持续测试应用部署之Mock基础设施

我们基于KubeVela开发的云原生应用交付平台,提供如初始化基础设施导入、中间件部署共用基础设施等相关能力的测试,需要依赖基础设施。虽然terraform是面向公司内部的混合云平台,但是测试都要跨部门配置效率太低了,而且这种模式无法支持持续测试。

KubeVela篇10:KubeVela 私有云Terraform Provider Addon插件开发指南

如何Debug Terraform Controller;如何让Configuration可以指向私有仓库;为云资源编写ComponentDefinition;验证流程是否跑通。