CloudDriver遵循NetflixSpinnaker家族标准的代码目录结构:
Clouddriver-web是主入口和公共controller,clouddriver-core是抽象和默认实现,clouddriver-XXX是云厂商自定义实现。
关于这个入口子项目,我们只需要搞清楚一点,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为开关,扫描注入注入自己子项目包下的内容。其它云厂商也都是按照这种规则来实现的。
现在我们来解剖一只麻雀,来看看腾讯云子项目的目录结构,简单介绍下每个包的功能,目录结构如下:
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一样,也是十分重要的代码。