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