欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spinnaker第九节—CloudDriver代码详解

程序员文章站 2024-03-26 13:12:41
...

CloudDriver遵循NetflixSpinnaker家族标准的代码目录结构:

Clouddriver-web是主入口和公共controller,clouddriver-core是抽象和默认实现,clouddriver-XXX是云厂商自定义实现。

 

clouddriver-web:

关于这个入口子项目,我们只需要搞清楚一点,clouddriver是如何将各家云厂商的子项目进行拆分管理的。

核心代码:

com.netflix.spinnaker.clouddriver. Main中
@ComponentScan([
  'com.netflix.spinnaker.config',
  'com.netflix.spinnaker.clouddriver.config'
])

 这是clouddriver-web的目录结构:

Spinnaker第九节—CloudDriver代码详解

这是clouddriver-core的代码结构:

Spinnaker第九节—CloudDriver代码详解

这是clouddriver-aws的代码结构:

Spinnaker第九节—CloudDriver代码详解 

好,我们可以看得到启动加载com.netflix.spinnaker.clouddriver.config

会扫描clouddriver-web和clouddriver-core的配置,这两个子项目是必须启用的,还会通过com.netflix.spinnaker.config去扫描像clouddriver-aws这种云厂商自定义的子项目,它们并不是必须的。

我们再来看下clouddriver中对于云平台的管理是如此配置的:

aws:
  enabled: ${AWS_ENABLED:false}
  # proxy:
  #  proxyHost: 10.0.0.54
  #  proxyPort: 8888
  #  proxyUsername: foo
  #  proxyPassword: foo
  #  proxyDomain: foo
  #  proxyWorkstation: foo
  #  protocol: HTTP
  defaults:
    iamRole: FooRole
    unknownInstanceTypeBlockDevice:
      deviceName: /dev/sdb
      size: 40
    instanceClassBlockDevices:
    - instanceClass: m3
      blockDevices:
      - deviceName: /dev/sdb
        virtualName: ephemeral0
      - deviceName: /dev/sdc
        virtualName: ephemeral1
  defaultRegions:
    - name: us-east-1
  defaultKeyPairTemplate: '{{name}}-keypair'
kubernetes:
  enabled: false
  v2:
    applyAppLabels: true
tencent:
  enabled: true
  accounts:
    - name: my-tencent-account
      project: my-tencent-project
      secretId: ${TENCENTCLOUD_SECRET_ID}
      secretKey: ${TENCENTCLOUD_SECRET_KEY}
      regions: ["ap-guangzhou","ap-shanghai"]
alicloud:
  enabled: true
  accounts:
  - name: my-ali-account
    accessKeyId: ${ALICLOUD_SECRET_ID}
    accessSecretKey: ${ALICLOUD_SECRET_KEY}
    permissions: {}
    regions:
    - cn-beijing
- cn-hangzhou

 

我们从yml配置里面发现两件事:

1 各自云厂商的配置千差万别,分别自治,并没有统一的配置标准

2 每家云厂商根节点下都有一个boolean的enabled属性,用于标识相关配置是否生效。

配置开关是如何生效的?

再看来aws子项目的配置文件:

com.netflix.spinnaker.config.AwsConfiguration
@Configuration
@ConditionalOnProperty('aws.enabled')
@ComponentScan(["com.netflix.spinnaker.clouddriver.aws"])
@EnableConfigurationProperties(AwsConfigurationProperties)
@Import([
  BastionConfig,
  AmazonCredentialsInitializer,
  AwsComponents
])

OK,到此就可以解释清楚了,以yml配置中aws.enabled为开关,扫描注入注入自己子项目包下的内容。其它云厂商也都是按照这种规则来实现的。

clouddriver-tencent

现在我们来解剖一只麻雀,来看看腾讯云子项目的目录结构,简单介绍下每个包的功能,目录结构如下:

Spinnaker第九节—CloudDriver代码详解

 

Config:yml的配置映射,将yml封装为配置对象

Security:读取yml中云平台鉴权相关配置,构造对象,存入内存Map

Cache:定义存入缓存中的数据格式以及key的定义规则,提供了序列化和反序列化的静态方法

Client:构建了4个client,AutoScaling、CVM、CLB、VPC,分别对接腾讯云server端的弹性伸缩、实例、负载均衡、VPC网络,与腾讯云做交互时需要用到。

Exception:封装了一个自定义RuntimeException

Helth:废弃的package,可以删掉

Controllers:腾讯云非标准化的API请求服务,镜像相关的有2个controller,弹性相关的有1个controller

Name:意义不大,可以不关心

Model:简单,是spinnaker中对SDK对象的封装,特别是LB单独处理,逻辑比较复杂

Deploy:下面有5个package

    Description:具体操作的model,例如resize、disable、enable,必带region、认证等

    Ops:对AS、LB、CVM等增删改的原子操作

    Validation:对description的校验

    Convertes:人如其名,做转换用的工具类,将json和map转化为description和ops需要的对象

    Handlers:专门用来处理deploy的

Provider:下面有3个package

    Config:简单,为provider织入agent

    Agent:核心方法loadData,通过client获取云平台资源转成model模式,这个地方决定了存入到redis缓存中内容的格式,十分重要的代码。

    View:从cache中获取资源数据,spinnaker大部分的查询都是通过这部分代码从缓存中拿数据的,与上面agent一样,也是十分重要的代码。

 

 

 

相关标签: Spinnaker