利用saltstack管理边缘计算节点

利用saltstack管理边缘计算节点

需求背景

  1. 公司业务场景中需要在客户机房部署边缘计算节点用于边缘计算,在边缘处理计算密集型运算
  2. 边缘节点通过公网访问云端服务,云端不可访问边缘计算节点
  3. 要求可以在云端控制边缘计算节点,方便日常主机运维
  4. 边缘计算节点与云端需要存在认证和准入

由于云端不能三层直连边缘计算节点,需要采用master-slave架构的服务, 通过边缘计算节点部署agent监听云端消息,刚好saltstack满足以上要求

什么是saltstack

SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理),它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理。号称世界上最快的消息队列ZeroMQ使得SaltStack能快速在成千上万台机器上进行各种操作。

SaltStack架构

image-20210802152511858

  1. Master:控制中心,salt命令运行和资源状态管理
  2. Minion : 需要管理的客户端机器,会主动去连接Mater端,并从Master端得到资源状态
  3. 信息,同步资源管理信息
  4. States:配置管理的指令集
  5. Modules:在命令行中和配置文件中使用的指令模块,可以在命令行中运行
  6. Grains:minion端的变量,静态的
  7. Pillar:minion端的变量,动态的比较私密的变量,可以通过配置文件实现同步minions定义
  8. highstate:为minion端下发永久添加状态,从sls配置文件读取.即同步状态配置
  9. 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 为例

  1. 安装salt-minion agent服务

    sudo apt install salt-minion
    
  2. 配置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
    
  3. 进入云端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 使用

  1. 基本使用
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
posted @ 2021-08-02 16:13  万物皆虚,万事皆允  阅读(143)  评论(0编辑  收藏  举报