Spinnaker第九节—CloudDriver代码详解

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的目录结构:

这是clouddriver-core的代码结构:

这是clouddriver-aws的代码结构:

 

好,我们可以看得到启动加载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

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

 

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一样,也是十分重要的代码。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章