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

 

 

 

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