利用saltstack管理边缘计算节点
需求背景
- 公司业务场景中需要在客户机房部署边缘计算节点用于边缘计算,在边缘处理计算密集型运算
- 边缘节点通过公网访问云端服务,云端不可访问边缘计算节点
- 要求可以在云端控制边缘计算节点,方便日常主机运维
- 边缘计算节点与云端需要存在认证和准入
由于云端不能三层直连边缘计算节点,需要采用master-slave架构的服务, 通过边缘计算节点部署agent监听云端消息,刚好saltstack满足以上要求
什么是saltstack
SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理),它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理。号称世界上最快的消息队列ZeroMQ使得SaltStack能快速在成千上万台机器上进行各种操作。
SaltStack架构
- Master:控制中心,salt命令运行和资源状态管理
- Minion : 需要管理的客户端机器,会主动去连接Mater端,并从Master端得到资源状态
- 信息,同步资源管理信息
- States:配置管理的指令集
- Modules:在命令行中和配置文件中使用的指令模块,可以在命令行中运行
- Grains:minion端的变量,静态的
- Pillar:minion端的变量,动态的比较私密的变量,可以通过配置文件实现同步minions定义
- highstate:为minion端下发永久添加状态,从sls配置文件读取.即同步状态配置
- salt_schedule:会自动保持客户端配置
边缘节点接入方案
云端服务部署
云端服务采用kubernetes方式部署,并使用SLB将服务端口开放到云端,使用pvc持久化master节点与minion的认证密钥信息, 部署yaml 如下:
---
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: salt-master
name: salt-master
namespace: saltstack
spec:
replicas: 1
selector:
matchLabels:
app: salt-master
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: salt-master
spec:
hostname: salt-master
containers:
- image: saltstack/salt:3000.7
name: salt
env:
- name: SALT_SHARED_SECRET
value: MY_PASSWORD
resources:
limits:
cpu: 1000m
memory: 1.5Gi
requests:
cpu: 200m
memory: 256Mi
volumeMounts:
- mountPath: /etc/salt/pki/master
name: saltstack-pki
volumes:
- persistentVolumeClaim:
claimName: saltstack-pki-pvc
name: saltstack-pki
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: salt-master
name: salt-master
namespace: saltstack
spec:
ports:
- port: 4505
protocol: TCP
targetPort: 4505
name: publish-port
- port: 4506
protocol: TCP
targetPort: 4506
name: ret-port
selector:
app: salt-master
type: LoadBalancer
status:
loadBalancer: {}
---
apiVersion: v1
kind: PersistentVolume
metadata:
labels:
alicloud-pvname: saltstack-pki-pv
name: saltstack-pki-pv
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
flexVolume:
driver: alicloud/nas
options:
path: /k8s/saltstack-pki
server: xxxxxxxxxxxxxxx.com
vers: "4.0"
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: saltstack-pki-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
selector:
matchLabels:
alicloud-pvname: saltstack-pki-pv
volumeMode: Filesystem
volumeName: saltstack-pki-pv
边缘节点接入
saltstack支持大部分linux 系统,以下以ubuntu18.04 为例
-
安装salt-minion agent服务
sudo apt install salt-minion
-
配置salt-minion配置文件连接云端master节点,并启动minion服务
sed -i '/#master: salt/a master: <master_ip>' /etc/salt/minion # 替换<master_ip>为实际master ip或域名 # 由于走公网网络链接不稳定,添加断线重连 sed -i '/# master_type: str/a master_type: failover' /etc/salt/minion sed -i '/# master_alive_interval: 30/a master_alive_interval: 30' /etc/salt/minion systemctl enable salt-minion --now
-
进入云端master节点容器,准入minion节点
# 1. 列出需要准入的边缘节点 # salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: ubuntu-18 Rejected Keys: # 2. 同意边缘节点认证 # salt-key -a ubuntu-18 The following keys are going to be accepted: Unaccepted Keys: ubuntu-18 Proceed? [n/Y] y Key for minion ubuntu-18 accepted. # 3. 测试节点是否在线 # salt '*' test.ping ubuntu-18: True # 4. 执行远程管理命令 # salt '*' cmd.run 'ip route show' ubuntu-18: default via 192.168.30.2 dev ens33 proto static 192.168.30.0/24 dev ens33 proto kernel scope link src 192.168.30.30
saltsatck 使用
- 基本使用
salt '*' test.ping
salt '*' cmd.run 'ls -l /etc'
salt '*' disk.usage
salt '*' pkg.install cowsay
salt '*' network.interfaces
salt 'minion1' disk.usage
salt 'minion*' disk.usage
salt -G 'os:Ubuntu' test.ping
salt -E 'minion[0-9]' test.ping
salt -L 'minion1,minion2' test.ping
salt -C 'G@os:Ubuntu and minion* or S@192.168.50.*' test.ping