最近編寫kubernetes的saltstack狀態配置文件,在github上找到一個開源的salt文件,根據自己的需要,完成修改之后。執行部署測試
大致目錄結構如下:
|————k8s
| |____node.sls
| |____master.sls
| |____etcd.sls
| |____modules
| | |____kubelet.sls
| | |____docker.sls
| | |____quagga.sls
| | |____kube-proxy.sls
| | |____api-server.sls
| | |____scheduler.sls
| | |____cfssl.sls
| | |____controller-manager.sls
| | |____etcd.sls
|____top.sls
top.sls的內容如下:
base:
'k8s-role:master':
- match: grain
- k8s.master
'k8s-role:node':
- match: grain
- k8s.node
'etcd-role:node':
- match: grain
- k8s.etcd
minion端/etc/salt/grains配置如下:
k8s-role:
- master
在執行salt "*" state.highstate時,部署正常執行,然而在執行salt "*" state.sls k8s時,卻拋出如下異常:
yanwei-ubuntu:
Data failed to compile:
----------
No matching sls found for 'k8s' in env 'base'
ERROR: Minions returned with non-zero exit code
但是由於我們線上salt文件過多,而且平時都是通過state.sls的方式來實現服務配置與部署,直接執行state.highstate的話,風險太大。
到此時才開始正視state.sls與state.highstate的區別,並嘗試把上面的配置修改為同時支持兩種方式的發布。
在網上查找state.sls與state.highstate的區別大致如下:
- state.highstate會讀取所有環境(包括base環境)的top.sls文件,並且執行top.sls文件內容里面定義的sls文件,不在top.sls文件里面記錄的sls則不會被執行;
- state.sls默認讀取base環境,但是它並不會讀取top.sls文件。你可以指定state.sls執行哪個sls文件,只要這個sls文件在base環境下存在;
- state.sls也可以指定讀取哪個環境:state.sls salt_env='prod' xxx.sls,這個xxx.sls可以不在top.sls中記錄。
- state.sls執行的xxx.sls會被下發到minion端,而state.highstate則不會
其實這些都不是重點,我認為重點在於state.sls執行指定模塊的前提是,該模塊存在init.sls文件。
既然如此,我們要讓上面的狀態配置文件同時支持state.sls和state.highstate的話,首先需要在k8s模塊中添加init.sls文件,因為並不是每一個節點都會執行k8s中所有模塊,所以還需要在init.sls中實現一些條件判斷。
- 修改top.sls文件如下:
base:
node_type:kubernetes:
- match: grain
- k8s
- 添加init.sls文件,內容如下:
{% set k8s_master = salt['grains.get']('k8s_role:k8s_master',False) %}
{% set k8s_node = salt['grains.get']('k8s_role:k8s_node',False) %}
{% set k8s_etcd = salt['grains.get']('k8s_role:k8s_etcd',False) %}
include:
- k8s.modules.docker
{% if k8s_master %}
- k8s.master
{% endif %}
{% if k8s_node %}
- k8s.node
{% endif %}
{% if k8s_etcd %}
- k8s.etcd
{% endif %}
- 修改minion端
/etc/salt/grains,內容如下:
node_type:
- kubernetes
k8s_role:
- k8s_node: True
- k8s_master: True
至此,該狀態配置文件可同時支持state.sls和state.highstate兩種方式。
