# fogcloud 生产部署文档

本示例教程介绍了如何在阿里云上部署 fogcloud5.0 生产环境,若您打算将 fogcloud 部署于其他公有云平台或本地服务器,也可以参考本教程,并结合其他公有云平台的文档进行部署,部署流程基本相同。

# 1 部署准备

请提前申请好您的阿里云账号,阿里云申请地址:https://www.aliyun.com/ (opens new window)

本示例教程中省略了阿里云服务资源创建的过程,您可能需要参考阿里云官方帮助文档进行资源的购买或开通。

提醒:在您开始部署前应当先了解所需开通的云服务的资费情况,您可以在相关资源的定价页中进行查询。

# 1.1 创建服务器

本教程中的 fogcloud 运行于k3s环境,当然您也可以使用各公有云上提供的托管类型的 kubernetes 服务进行部署,如阿里云 ACK、AWS EKS 等。

您至少需要创建三台 ECS 实例,用来部署 k3s 集群,其中一台为master控制节点,两台为node工作节点,以下为推荐的服务器最低配置。

节点类型

硬件配置

服务器名称

内网 IP

master

CPU:4 核

内存:8G

硬盘:60G

mxchip-fogcloud-prod1

192.168.10.1

node1

CPU:4 核

内存:8G

硬盘:60G

mxchip-fogcloud-k8s-prod1

192.168.20.1

node2

CPU:4 核

内存:8G

硬盘:60G

mxchip-fogcloud-k8s-prod2

192.168.30.1

网络要求:服务器能够访问外网,并且也可以互相通信

安全组配置:若需要通过外网管理 k3s,您需要在 ECS 实例所在的安全组中开放6443/TCP 端口

提醒:您需要在创建服务器前规划好您的 VPC 网络,可以参考阿里云 VPC 帮助文档 (opens new window)

# 1.2 创建数据库

默认情况下,fogcloud 在部署过程中会在 k3s 上自动创建数据库容器(仅用于测试环境)

生产环境建议使用阿里云的云数据库,下文将提供关闭 k3s 数据库容器的方法。

数据库类型

规格

版本

数量

mongodb

2 核 4G,硬盘空间:40G,三节点

4.2

1

postgresql

2 核 4G,硬盘空间:20G,高可用版

14

1

redis

1GB

7.0

1

网络要求:需要打通与服务器的网络(通过数据库的 IP 白名单配置)

# 1.3 域名规划

您共需要准备四个域名,并请准备好对应的 SSL 证书,可以使用通配符域名证书。

以下为本次部署示例所使用的域名:

域名

描述

app-fog.dev.mxchip.com.cn

fogcloud 前端

api-fog.dev.mxchip.com.cn

fogcloud 后端 API

mqtt-fog.dev.mxchip.com.cn

mqtt 消息

amqp-fog.dev.mxchip.com.cn

rabbitmq 消息队列

# 1.4 各服务对应端口

在部署开始前,请先了解 fogcloud 对外使用的服务端口及其作用:

端口

描述

备注

6443

k8s api

用于访问 k8s api

80

http 服务

因为部分设备因为性能问题,无法访问 https 服务,因此使用 http 服务用于设备固件下载

443

https 服务

管理后台

1883

mqtt-tcp 服务

用于设备不安全 mqtt 连接

8883

mqtt-ssl-tcp 服务

用于设备 mqtt 连接

8083

mqtt-websocket 服务

用于前端虚拟设备不安全连接

8084

mqtt-websocket-ssl 服务

用于前端虚拟设备安全连接

5672

amqp 服务

用于服务端消息订阅(未加密)

5671

amqp-tls 服务

用于服务端消息订阅

# 2 安装 k3s 集群

# 2.1 安装 k3s

若您希望了解更多的 k3s 使用信息,请参考官方文档 (opens new window)

# 1. master上创建配置文件

master上创建文件/etc/rancher/k3s/config.yaml作为 k3s 启动的配置文件:

root@mxchip-fogcloud-prod1:~# mkdir -p /etc/rancher/k3s/
root@mxchip-fogcloud-prod1:~# cat > /etc/rancher/k3s/config.yaml < "1000-40000"
tls-san:
  - "192.168.10.1"
  - "192.168.20.1"
  - "192.168.30.1"
kubelet-arg:
  - "container-log-max-files=10"
EOF

注意:请将以上配置文件中的 ip 替换为您云服务器的真实 ip

# 2. k3s master节点安装

master上运行脚本:

root@mxchip-fogcloud-prod1:~# curl -sfL https://get.k3s.io | sh -

提醒:国内用户,可以使用以下方法加速安装:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
# 3. master 上获取 token

master/var/lib/rancher/k3s/server/node-token获取mynodetoken

该 token 用于将node节点加入到 k3s 集群

root@mxchip-fogcloud-prod1:~# cat /var/lib/rancher/k3s/server/node-token
# 4. node 节点加入到 k3s

node1node2上分别运行脚本:

注意:将${mynodetoken}替换为上一步中获得的 token

root@mxchip-fogcloud-k8s-prod1:~# curl -sfL https://get.k3s.io | K3S_URL=https://192.168.10.1:6443 K3S_TOKEN=${mynodetoken} sh -

提醒:国内用户,可以使用以下方法加速安装:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.10.1:6443 K3S_TOKEN=${mynodetoken} sh -
# 5. 验证 k3s 集群状态

master上查看集群状态,正常情况下集群所有节点状态都应为Ready

root@mxchip-fogcloud-prod1:~# kubectl get node
NAME                        STATUS   ROLES                  AGE   VERSION
mxchip-fogcloud-prod1       Ready    control-plane,master   22m   v1.27.6+k3s1
mxchip-fogcloud-k8s-prod1   Ready    <none>                 41s   v1.27.6+k3s1
mxchip-fogcloud-k8s-prod2   Ready    <none>                 5s    v1.27.6+k3s1

# 2.2 安装 Helm v3

您可以选择在自己的本机或在master节点安装 Helm,请先根据自己的操作系统类型下载好对应的安装包。

Helm github 下载地址:https://github.com/helm/helm/releases (opens new window)

  • master节点安装 Helm:
root@mxchip-fogcloud-prod1:~# wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
root@mxchip-fogcloud-prod1:~# tar zxf helm-v3.12.3-linux-amd64.tar.gz
root@mxchip-fogcloud-prod1:~# mv linux-amd64/helm /usr/local/bin/
root@mxchip-fogcloud-prod1:~# export KUBECONFIG=/etc/rancher/k3s/k3s.yaml  #Helm将使用该变量获取kubeconfig配置文件,从而连接到k3s
  • 本机安装 Helm:

    1. 请根据您自己的操作系统并参照官方教程 (opens new window)安装 kubectl 工具。
    2. 请按照官方教程 (opens new window)配置kubeconfigkubeconfig位于master/etc/rancher/k3s/k3s.yaml,通常情况下,您需要将该文件重命名为config,并放置于$HOME/.kube目录下。
    3. 请将$HOME/.kube/config中的server: https://192.168.10.1:6443,修改为server: https://&lt;master公网IP&gt;:6443,此处请注意在安全组中开放6443/TCP端口。
    4. 验证安装:在本机运行命令:kubectl get nodes,若出现上述三个云服务器节点则安装正确。
    5. 请根据自己的操作系统并参考官方教程 (opens new window)安装 Helm

验证 Helm 安装:

root@mxchip-fogcloud-k8s-prod1:~# helm version
version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}

# 3 安装 fogcloud

# 3.1 获取 chart

fogcloud5.0 chart:📎fogcloud.zip

master上运行命令:

root@mxchip-fogcloud-prod1:~# helm repo add fogcloud-charts https://fogcloud-io.github.io/fogcloud-charts
root@mxchip-fogcloud-prod1:~# helm repo update
root@mxchip-fogcloud-prod1:~# helm pull fogcloud-charts/fission-all --untar
root@mxchip-fogcloud-prod1:~# unzip fogcloud.zip

运行成功后,会在本机当前目录生成两个文件夹:fogcloudfission-all

# 3.2 准备配置文件

# 3.2.1 证书配置

假设我们为 fogcloud 服务申请了如下域名的证书文件:

服务

域名

证书文件

前端服务

app-fog.dev.mxchip.com.cn

web.crt,web.key

后端服务

api-fog.dev.mxchip.com.cn

api.crt,api.key

mqtt 服务

mqtt-fog.dev.mxchip.com.cn

mqtt.crt,mqtt.key

amqp 服务

amqp-fog.dev.mxchip.com.cn

amqp.crt,amqp.key

  • 使用 web.crt,web.key 替换fogcloud/configs/cert/webAdmin目录下原有证书文件
  • 使用 api.crt,api.key 替换fogcloud/configs/cert/api目录下原有证书文件
  • 使用 mqtt.crt,mqtt.key 替换fogcloud/configs/cert/mqtt目录下原有证书文件
  • 使用 amqp.crt,amqp.key 替换fogcloud/configs/cert/amqp目录下原有证书文件

注意:证书和密钥文件名可以随意更改,但后缀名需要改为.crt.key

# 3.2.2 helm values 配置

配置文件位于fogcloud/values.yaml,生产环境推荐使用LoadBalancer

请注意以下两点:

  • 如果PostgreSQLmongodbredis使用的是云数据库,需要注释values.yaml文件的postgresmongodbredis三段段,并且删除fogcloud/templates/目录下,postgresmongodbredis三个目录
  • 如果您开启了etcd-cluster,可以将values.yamletcd.internal.enabled的值改为false或注释该段,并删除fogcloud/templates/目录下etcd目录
  • 如果您开启了minio-cluster,需要注释values.yaml中的minio这段,并删除fogcloud/templates/目录下 minio 目录
  • 部分resources资源限制可先注释,或按服务器资源大小结合实际业务用量设置

更改配置文件的配置项:

配置项

说明

environment

配置文件的环境

production

k8sApiServer

k8s server api 地址,用来创建 k8s StatefulSet 资源;可以通过kubectl config view获取

https://192.168.10.1:6443

fissionEnabled

是否启用了云函数功能;若启用该功能,需要将 kubeconfig 文件放入fogcloud-charts/config/kubeconfig目录,文件名没有要求。(注意 kubeconfig 里面服务器地址要改为可用域名)

false

cloudGatewayEnabled

是否启用云网关功能

true

telemetryEnabled

是否启用遥测

true

expose.type

如何暴露服务:IngressClusterIPNodePortLoadBalancer,其他值将被忽略,服务的创建将被跳过。

LoadBalancer

expose.hosts.api

api 服务域名,用于前端服务访问后端 api

api-fog.dev.mxchip.com.cn

expose.hosts.mqtt

mqtt 服务域名,用于前端服务访问 mqtt-websocket 服务

mqtt-fog.dev.mxchip.com.cn:8084

expose.tls.enabled

是否启用 ingress tls

true

storageClassName

使用的存储类,k3s 默认为 local-path

local-path

expose.tls.cert.api.certSource

api 服务证书的来源:file, autonone

1)file:使用证书文件,直接将.key 和.crt 文件放入 fogcloud-charts/config/cert/api 目录下;

2)auto:使用 cert-manager 生成免费证书,需要保证设置的域名可用;

3)none:不为服务入口配置证书

file

expose.tls.cert.webAdmin.certSource

web 服务证书的来源:file, autonone

1)file:使用证书文件,直接将.key 和.crt 文件放入 fogcloud-charts/config/cert/api 目录下;

2)auto:使用 cert-manager 生成免费证书,需要保证设置的域名可用;

3)none:不为服务入口配置证书

file

expose.Ingress.hosts.webAdmin

web 服务域名,用于 ingress 路由

app-fog.dev.mxchip.com.cn

expose.Ingress.hosts.api

api 服务域名,用于 ingress 路由

api-fog.dev.mxchip.com.cn

mqttBroker.internal.tls.enabled

mqtt 应用是否启用 tls

true

rabbitmq.internal.tls.enabled

rabbitmq 应用是否启用 tls

true

etcd.internal.enabled

是否开启单机 etcd

false

minio.internal.enabled

是否开启单机 minio

false

tdengine.enabled

是否开启 tdengine 集群

ture

nats.enabled

是否开启 nats

ture

minio-cluster.enabled

是否开启 minio 集群

ture

redis-cluster.enabled

是否开启 redis 集群

false

etcd-cluster.enabled

是否开启 etcd 集群

true

提供本次部署示例修改后的values.yaml文件供参考:

# Default values for fogcloud-charts.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

# 配置文件环境:development,test,production
environment: production

imagePullPolicy: Always

k8sApiServer: "https://192.168.10.1:6443"
# 是否启用云函数功能,若安装了fission可以设置为true
fissionEnabled: false
# 是否启用云网关功能
cloudGatewayEnabled: true
# 是否启用遥测
telemetryEnabled: true

# 暴露web管理后台和api服务,有:Ingress, ClusterIP, NodePort, LoadBalancer这几种类型;
# 若要公开服务,请使用LoadBalancer,Ingress,NodePort三种类型
expose:
  type: LoadBalancer
  insecureOSS: true
  # 各个服务的域名,若启用对应服务的tls,请保证域名是外网可以访问的;
  hosts:
    api: api-fog.dev.mxchip.com.cn
    mqtt: mqtt-fog.dev.mxchip.com.cn:8084

  tls:
    enabled: true
    cert:
      webAdmin:
        # x509证书创建方式,支持file, auto, none这三种方式
        # file: 通过文件创建,可将对应证书文件:*.key,*.crt,放到fogcloud-charts/configs/cert/webAdmin目录下
        # none: 不创建
        # auto: 使用cert-manager自动生成
        certSource: file
        secretName: web-cert
        dnsName: 
      api:
        certSource: file
        secretName: api-cert
        dnsName: 

  Ingress:
    className: traefik-lb
    controller: traefik.io/ingress-controller
    annotations: {}
    hosts:
      # web管理后台域名
      webAdmin: app-fog.dev.mxchip.com.cn
      # 后端api服务域名
      api: api-fog.dev.mxchip.com.cn

  NodePort:
    externalTrafficPolicy: Local
    ports:
      webAdmin:
        httpPort: 8000
      api:
        httpPort: 8001

  LoadBalancer:
    externalTrafficPolicy: Local
    healthCheckNodePort: 4000
    ports:
      webAdmin:
        httpPort: 18000  
      api:
        httpPort: 18001  

secret:
  # 配置私有镜像仓库    
  imageCredentials:
#    - registry:
#      name:
#      username:
#      password:
#      email:

storageClassName: "local-path"

resourceRangeLimit:
  limits:
  # - default:
  #     memory: "512Mi"
  #     cpu: "0.5"
  #   defaultRequest:
  #     memory: "256Mi"
  #     cpu: "0.1"
  #   min:
  #     memory: "128Mi"
  #     cpu: "0.1"
  #   max:  
  #     memory: "4Gi"
  #     cpu: "2"
  #   type: Container    

fogcloud:
  restartPolicy: Always
  image: registry.cn-shanghai.aliyuncs.com/fogcloud/public-fogcloud
  imageTag: v5.2.0
  config:{}

  replicas: 3
  service:
    externalTrafficPolicy: Local
    type: ClusterIP
    ports:
      http:
        nodePort: 4000
      grpc:
        nodePort: 4001
  strategy: 
    type: RollingUpdate # enum: Recreate, RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  resources:
    limits:
      cpu: "3"
      memory: "4Gi"
    requests:
      cpu: "10m"
      memory: "32Mi"

fogcloudWeb:
  image: registry.cn-shanghai.aliyuncs.com/fogcloud/public-fogcloud-web
  imageTag: v5.2.0
  replicas: 3
  envVars:
    - name: "MAP_CONFIG"
      value: "china"
    - name: "DEPLOYMENT_CONFIG"
      value: "private"
  strategy: 
    type: RollingUpdate # enum: Recreate, RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  resources:
    limits:
      cpu: "100m"
      memory: "32Mi"
    requests:
      cpu: "10m"
      memory: "16Mi"

faasbuilder:
  image: registry.cn-shanghai.aliyuncs.com/fogcloud/public-faas-builder
  imageTag: latest
  config: {}
  createKubeconfigWithFile: true
  replicas: 3
  resources:
    limits:
      cpu: "2"
      memory: "2Gi"
    requests:
      cpu: "10m"
      memory: "32Mi"
  strategy: 
    type: RollingUpdate # enum: Recreate, RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

fogcronScheduler:
  image: registry.cn-shanghai.aliyuncs.com/fogcloud/public-fogcron-scheduler
  imageTag: latest
  replicas: 3
  config: {}
  resources:
    limits:
      cpu: "500m"
      memory: "128Mi"
    requests:
      cpu: "10m"
      memory: "16Mi"  
  strategy: 
    type: RollingUpdate # enum: Recreate, RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

fognotifier:
  image: registry.cn-shanghai.aliyuncs.com/fogcloud/public-fognotifier
  imageTag: v5.0.0
  replicas: 3
  config: {}
  resources:
    limits:
      cpu: "500m"
      memory: "128Mi"
    requests:
      cpu: "10m"
      memory: "16Mi"
  strategy: 
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

mqttwebhook:
  image: registry.cn-shanghai.aliyuncs.com/fogcloud/public-mqttwebhook
  imageTag: v5.1.0
  replicas: 3
  config: {}
  resources:
    limits:
      cpu: "1"
      memory: "1Gi"
    requests:
      cpu: "10m"
      memory: "16Mi"
  strategy: 
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

fogthinghistory:
  image: registry.cn-shanghai.aliyuncs.com/fogcloud/public-fogthinghistory
  imageTag: v5.0.0
  replicas: 3
  config: {}
  resources:
    limits:
      cpu: "1"
      memory: "1Gi"
    requests:
      cpu: "10m"
      memory: "16Mi"
  strategy: 
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

nginx:
  image: nginx
  imageTag: 1.21
  replicas: 3
  resources:
    limits:
      cpu: "1"
      memory: "1Gi" 
    requests:
      cpu: "10m"
      memory: "16Mi" 
  strategy: 
    type: RollingUpdate # enum: Recreate, RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

mqttBroker:
  type: internal
  internal:
    type: emqx
    image: emqx/emqx
    imageTag: 4.2.14
    defaultUsername: fogcloud
    defaultPassword: "4Jy!YC7bdpsjU*6k"
    dashboardUsername: admin
    dashboardPassword: "%PWpPb*qhB*g82dY"
    persistence:
      keep: true
      pvcExisted: false
      pvc: emqx-pvc
      storageClassName: local-path
      storage: 10Gi      
    resources:
      limits:
        cpu: "2"
        memory: "4Gi"
      requests:
        cpu: "10m"
        memory: "256Mi"
    nodeSelector:
      enabled: false
      key: kubernetes.io/hostname
      value: fogcloud-prod1
    replicas: 3
    tls:
      enabled: true
      certSource: file # file, auto, none
      secretName: mqtt-cert
    service:
      type: NodePort
      externalTrafficPolicy: Local
      healthCheckNodePort: 30000
      ports:
        mqttTcp:
          port: 1883
          nodePort: 1883
        mqttTcpTls:
          port: 8883
          nodePort: 8883
        httpApi:
          port: 8081
          nodePort: 8081
        mqttWs:
          port: 8083
          nodePort: 8083
        mqttWss:
          port: 8084
          nodePort: 8084
        admin:
          port: 18083
          nodePort: 18083

rabbitmq:
  type: internal
  internal:
    image: rabbitmq
    imageTag: 3.10.2-management
    replicas: 3
    defaultUsername: rabbitmq
    defaultPassword: fogcloud
    additionalConfigs:
    envVars:
    persistence:
      keep: true
      pvcExisted: false
      pvc: rabbitmq-pvc
      storageClassName: local-path
      storage: 5Gi
    resources:
      limits:
        cpu: "1"
        memory: "1Gi"
      requests:
        cpu: "10m"
        memory: "256Mi"
    tls:
      enabled: true
      certSource: file # file, auto, none 
      secretName: amqp-cert
    service:
      externalTrafficPolicy: Cluster
      healthCheckNodePort: 30001
      type: NodePort
      ports:
        amqp:
          port: 5672
          nodePort: 5672
        amqps:
          port: 5671
          nodePort: 5671

#postgres:
#  type: internal
#  internal: 
#    image: postgres
#    imageTag: 13
#    persistence:
#      pvcExisted: false
#      keep: true
#      pvc: postgres-pvc
#      storageClassName: local-path
#      storage: 10Gi
#    resources:
#      limits:
#        cpu: "1"
#        memory: "512Mi"
#      requests:
#        cpu: "0.01"
#        memory: "64Mi" 
#    envVars:
#      - name: POSTGRES_DB
#        value: fogcloud
#      - name: POSTGRES_PASSWORD
#        value: fogcloud
#      - name: POSTGRES_USER
#        value: postgres

#mongodb:
#  type: internal
#  internal:
#    enabled: true
#    image: mongo
#    imageTag: 4.4-rc-focal
#    persistence:
#      keep: true
#      pvcExisted: false
#      pvc: mongo-pvc
#      storageClassName: local-path
#      storage: 30Gi    
#    resources:
#      limits:
#        cpu: "1"
#        memory: "512Mi"
#      requests:
#        cpu: "0.1"
#        memory: "128Mi" 
#    envVars:

#redis:
#  type: internal
#  internal:
#    image: redis
#    imageTag: 6.2
#    persistence:
#      keep: true
#      pvcExisted: false
#      pvc: redis-pvc
#      storageClassName: local-path
#      storage: 1Gi     
#    resources:
#      limits:
#        cpu: "0.1"
#        memory: "128Mi"
#      requests:
#        cpu: "0.01"
#        memory: "8Mi"
#    envVars:

etcd:
  type: internal
  internal:
    enabled: false
    image: bitnami/etcd
    imageTag: 3.5.1
    persistence:
      keep: true
      pvcExisted: false
      pvc: etcd-pvc
      storageClassName: local-path
      storage: 3Gi    
    resources:
      limits:
        cpu: "100m"
        memory: "256Mi"
      requests:
        cpu: "10m"
        memory: "32Mi"  
    replicas: 1
    envVars:
      - name: ALLOW_NONE_AUTHENTICATION
        value: "yes"
      - name: ETCD_ADVERTISE_CLIENT_URLS
        value: "http://etcd1:2379"
      - name: ETCD_LISTEN_CLIENT_URLS
        value: "http://0.0.0.0:2379"

#minio:
#  type: internal
#  internal: 
#    service:
#      type: ClusterIP
#      nodePorts:
#        api: "19000"
#        console: "19001"
#    enabled: false
#    image: minio/minio
#    imageTag: latest
#    persistence:
#      keep: true
#      pvcExisted: false
#      pvc: minio-pvc
#      storageClassName: local-path
#     storage: 30Gi     
#    resources:
#      limits:
#        cpu: "1"
#        memory: "256Mi"
#      requests:
#        cpu: "10m"
#        memory: "128Mi"
#    envVars:
#      - name: MINIO_ACCESS_KEY
#        value: "1234567890"
#      - name: MINIO_REGION_NAME
#        value: "cn-south-1"
#      - name: MINIO_ROOT_PASSWORD
#        value: "fogcloud"
#      - name: MINIO_ROOT_USER
#        value: "minio"
#      - name: MINIO_SECRET_KEY
#        value: "abcdefghi"

tdengine:
  enabled: true
  replicaCount: 3
  resources:
    limits:
      cpu: "1"
      memory: "1Gi"
    requests:
      cpu: "10m"
      memory: "64Mi"

nats:
  enabled: true
  config:
    cluster:
      enabled: true
      replicas: 3
    jetstream:
      enabled: true
    merge:
      system_account: SYS
      accounts:
        SYS: 
          users:
            - user: admin
              password: public
        APP:
          jetstream:
              max_memory: 1G
              max_filestore: 10G
              max_streams: 100
              max_consumers: 100
          jetstream: enabled
          users:
            - user: "fogcloud"
              password: "root"
  service:
    ports:
      monitor:
        enabled: true
  natsBox:
    enabled: false
  reloader:
    enabled: true
  container:
    merge:
      resources:
        limits:
          cpu: 1
          memory: 512Mi
        requests:
          cpu: 100m
          memory: 16Mi

minio-cluster:
  enabled: true
  mode: distributed
  nameOverride: minio
  auth:
    rootUser: "minio"
    rootPassword: "fogcloud"
  resources:
    limits:
      cpu: 1
      memory: 256Mi
    requests:
      cpu: 10m
      memory: 128Mi
  statefulset:
    replicaCount: 4
  persistence:
    storageClass: local-path
    size: 30Gi

redis-cluster:
  enabled: false
  nameOverride: redis
  global:
    storageClass: local-path
  master:
    persistence:
      size: 1Gi
  sentinel:
    enabled: true
  auth:
    password: "fogcloud"
  replica:
    persistence:
      size: 1Gi
    resources:
      limits:
        cpu: 1000m
        memory: 256Mi
      requests:
        cpu: 10m
        memory: 16Mi

etcd-cluster:
  enabled: true
  nameOverride: etcd
  replicaCount: 3
  auth:
    rbac:
      create: false
  persistence:
    storageClass: local-path
    size: 2Gi
  resources:
    limits:
      cpu: "100m"
      memory: "256Mi"
    requests:
      cpu: "10m"
      memory: "32Mi"

# 3.2.3 fogcloud 应用配置

  • fogcloud-core 应用配置文件修改

fogcloud-core 应用配置文件位于fogcloud/configs/fogcloud-core/fogcloud.example.yaml

生产环境配置请在production段下添加数据库信息,以下内容请按实际情况填写:

...
production:
  <<: *development
  NAME: fogcloud
  HOST: app-fog.dev.mxchip.com.cn
  FAAS_STORE_ENDPOINT: https://fogcloud.io
  MINIO_HOST: fogcloud-minio

  # postgres配置
  POSTGRES_HOST: pgm-uf6jwv17jf31i2zb.pg.rds.aliyuncs.com
  POSTGRES_PORT: 5432
  POSTGRES_USER: fogcloud
  POSTGRES_PASSWORD: aA123456
  POSTGRES_DBNAME: fogcloud
  POSTGRES_SSLMODE: disable

# mongo配置
  MONGO_URI: mongodb://root:aA123456@dds-uf6a96d35090c0141.mongodb.rds.aliyuncs.com:3717,dds-uf6a96d35090c0142.mongodb.rds.aliyuncs.com:3717/fogcloud?replicaSet=mgset-72857898
  MONGO_DBNAME: fogcloud

# redis配置
  REDIS_HOST: r-bp2ae47c4nsrhy868s.redis.rds.aliyuncs.com
  REDIS_PORT: 6379
  REDIS_PASSWORD: "aA123456"
  REDIS_DB: 0

  CRON_WORKER_BROKER_ENDPOINTS: "redis://:aA123456@r-bp2ae47c4nsrhy868s.redis.rds.aliyuncs.com:6379/11"
  CRON_WORKER_RESULT_BACKEND_ENDPOINT: "redis://:aA123456@r-bp2ae47c4nsrhy868s.redis.rds.aliyuncs.com:6379/12"
  • faasbuilder 应用配置文件修改:

faasbuilder应用配置文件位于fogcloud/configs/faasbuilder/faasbuilder.yaml

以下内容请按实际情况填写:

...
production:
  <<: *development
  POSTGRES_HOST: pgm-uf6jwv17jf31i2zb.pg.rds.aliyuncs.com
  POSTGRES_PORT: 5432
  POSTGRES_USER: fogcloud
  POSTGRES_PASSWORD: aA123456
  POSTGRES_DBNAME: fogcloud
  POSTGRES_SSLMODE: disable

  REDIS_HOST: r-bp2ae47c4nsrhy868s.redis.rds.aliyuncs.com
  REDIS_PORT: 6379
  REDIS_PASSWORD: "aA123456"
  REDIS_DB: 3
  • fogcron 应用配置文件修改:

fogcron应用配置文件位于fogcloud/configs/fogcron/fogcron.yaml

以下内容请按实际情况填写:

...
production:
  <<: *development
  BROKER_ENDPOINTS: "redis://:aA123456@r-bp2ae47c4nsrhy868s.redis.rds.aliyuncs.com:6379/11"
  RESULT_BACKEND_ENDPOINT: "redis://:aA123456@r-bp2ae47c4nsrhy868s.redis.rds.aliyuncs.com:6379/12"
  • fognotifier 应用配置文件修改:

fognotifier应用配置文件位于fogcloud/configs/fognotifier/fognotifier.yaml

以下内容请按实际情况填写:

...
production:
  <<: *development

  POSTGRES_DBNAME: fogcloud
  POSTGRES_HOST: pgm-uf6jwv17jf31i2zb.pg.rds.aliyuncs.com
  POSTGRES_PASSWORD: aA123456
  POSTGRES_PORT: 5432
  POSTGRES_SSLMODE: disable
  POSTGRES_USER: fogcloud

  REDIS_DB: 1
  REDIS_HOST: r-bp2ae47c4nsrhy868s.redis.rds.aliyuncs.com
  REDIS_PASSWORD: aA123456
  REDIS_PORT: 6379
  SERVER_NOTIFIER_TASK_POOL_SIZE: 50 
  • tdengine 应用配置文件修改:

tdengine应用配置文件位于fogcloud/charts/tdengine/values.yaml

需要修改存储类名称和 pvc 存储大小

storage:
  # Set storageClassName for pvc. K8s use default storage class if not set.
  #
  className: "local-path"  #修改该处
  dataSize: "10Gi"  #修改该处
  logSize: "5Gi"  #修改该处
  • nats 应用配置文件修改:

nats应用配置文件位于fogcloud/charts/nats/values.yaml

需要修改存储类名称

 ...
  jetstream:
    enabled: false

    fileStore:
      enabled: true
      dir: /data

      ############################################################
      # stateful set -> volume claim templates -> jetstream pvc
      ############################################################
      pvc:
        enabled: true
        size: 10Gi
        storageClassName: local-path  #修改该处
...
  resolver:
    enabled: false
    dir: /data/resolver

    ############################################################
    # stateful set -> volume claim templates -> resolver pvc
    ############################################################
    pvc:
      enabled: true
      size: 10Gi
      storageClassName: local-path  #修改该处

# 3.3 安装服务

# 3.3.1 配置阿里云负载均衡

您需要创建一个阿里云负载均衡CLB实例,创建完成后需要将步骤1.3中规划好的 4 个域名解析到该CLB实例上。

阿里云负载均衡 CLB 的配置,你可以参考阿里云帮助文档 (opens new window)

# 3.3.1.1 创建虚拟服务器组

请先创建如下虚拟服务器组,分组对应的后端服务器端口如下:

分组名称

后端服务器端口

fogcloud-k8s-api

8001

fogcloud-k8s-web-admin

8000

fogcloud-k8s-mqtt-tcp

1883

fogcloud-k8s-mqtt-ssl-tcp

8883

fogcloud-k8s-mqtt-websocket-ssl

8084

fogcloud-k8s-amqp

5672

fogcloud-k8s-amqp-tls

5671

注意:三台服务器都需要添加到分组中,配置示例如下:

# 3.3.1.2 创建监听

请按下表创建监听器:

注意:web-admin对应的为 HTTPS 协议,需要在监听器上绑定 app-fog.dev.mxchip.com.cn 证书

监听名称

前端协议/端口

服务器组

健康检查

ota

HTTP:80

[虚拟]fogcloud-k8s-api

健康检查协议:HTTP

健康检查方法:GET

健康检查路径:/api/v1/ping

健康检查端口:8001

健康检查域名:app-fog.dev.mxchip.com.cn

amqp_tls

TCP:5671

[虚拟]fogcloud-k8s-amqp-tls

健康检查协议:TCP

健康检查端口:5671

mqtt_tcp

TCP:1883

[虚拟]fogcloud-k8s-mqtt-tcp

健康检查协议:TCP

健康检查端口:1883

amqp

TCP:5672

[虚拟]fogcloud-k8s-amqp

健康检查协议:TCP

健康检查端口:5672

mqtt_websocket_ssl

TCP:8084

[虚拟]fogcloud-k8s-mqtt-websocket-ssl

健康检查协议:TCP

健康检查端口:8084

mqtt_ssl_tcp

TCP:8883

[虚拟]fogcloud-k8s-mqtt-ssl-tcp

健康检查协议:TCP

健康检查端口:8883

web-admin

HTTPS:443

[虚拟]fogcloud-k8s-web-admin

健康检查协议:HTTP

健康检查方法:HEAD

健康检查路径:/

健康检查端口:8000

健康检查域名:app-fog.dev.mxchip.com.cn

# 3.3.1.3 转发策略配置

请按下图进行配置:

  • ota监听器转发策略配置:

  • web-admin监听器转发策略配置:

# 3.3.2 安装 fogcloud

请先确认已按步骤 3.2 的要求正确修改了您的配置文件;

若检查无误,请在master上运行如下命令(若您在自己本机安装的 helm,则在本机运行):

root@mxchip-fogcloud-prod1:~# kubectl create namespace fogcloud
root@mxchip-fogcloud-prod1:~# kubectl create namespace fission
root@mxchip-fogcloud-prod1:~# kubectl apply -f ./fogcloud/operator/rabbitmq-cluster-operator.yaml
root@mxchip-fogcloud-prod1:~# helm install fission -n fission ./fission-all
root@mxchip-fogcloud-prod1:~# helm install fogcloud -n fogcloud ./fogcloud

提醒:请保存好您的 helm 部署文件,在后续的升级更新中仍将使用这些文件。

# 4 验证 fogcloud

# 4.1 查看 pod 状态

  • 请确认所有 pod 运行状态为Running
  • pod 副本数量可通过配置文件fogcloud/values.yaml的 replicas 参数调节
root@mxchip-fogcloud-prod1:~# kubectl get pod -n fogcloud
NAME                                 READY   STATUS    RESTARTS      AGE
faasbuilder-766bfd956f-bddzm         1/1     Running   0             11m
faasbuilder-766bfd956f-jcf6d         1/1     Running   0             11m
faasbuilder-766bfd956f-lgvjj         1/1     Running   0             11m
fogcloud-core-7d6c9ffc9d-gvr2x       1/1     Running   0             11m
fogcloud-core-7d6c9ffc9d-hd7bl       1/1     Running   0             11m
fogcloud-core-7d6c9ffc9d-vtbwt       1/1     Running   0             11m
fogcloud-etcd-0                      1/1     Running   0             11m
fogcloud-etcd-1                      1/1     Running   0             11m
fogcloud-etcd-2                      1/1     Running   0             11m
fogcloud-minio-0                     1/1     Running   0             11m
fogcloud-minio-1                     1/1     Running   0             11m
fogcloud-minio-2                     1/1     Running   0             11m
fogcloud-minio-3                     1/1     Running   0             11m
fogcloud-nats-0                      2/2     Running   0             11m
fogcloud-nats-1                      2/2     Running   0             11m
fogcloud-nats-2                      2/2     Running   0             11m
fogcloud-tdengine-0                  1/1     Running   0             11m
fogcloud-tdengine-1                  1/1     Running   0             11m
fogcloud-tdengine-2                  1/1     Running   0             11m
fogcloud-web-6964ccddbb-7cjts        1/1     Running   0             11m
fogcloud-web-6964ccddbb-865wd        1/1     Running   0             11m
fogcloud-web-6964ccddbb-ljsc5        1/1     Running   0             11m
fogcron-scheduler-7958699885-6plsf   1/1     Running   0             11m
fogcron-scheduler-7958699885-dvk9w   1/1     Running   0             11m
fogcron-scheduler-7958699885-sz9bs   1/1     Running   0             11m
fognotifier-7455c74c6-b7x9n          1/1     Running   0             11m
fognotifier-7455c74c6-n5fzd          1/1     Running   0             11m
fognotifier-7455c74c6-spqc4          1/1     Running   0             11m
fogthinghistory-7d6f88895-6tdg8      1/1     Running   0             11m
fogthinghistory-7d6f88895-d9klb      1/1     Running   0             11m
fogthinghistory-7d6f88895-dhp72      1/1     Running   0             11m
mqtt-broker-0                        1/1     Running   0             11m
mqtt-broker-1                        1/1     Running   0             11m
mqtt-broker-2                        1/1     Running   0             11m
mqttwebhook-9b9d9fbf5-4rzh9          1/1     Running   0             11m
mqttwebhook-9b9d9fbf5-j7lv9          1/1     Running   0             11m
mqttwebhook-9b9d9fbf5-qvqqb          1/1     Running   0             11m
nginx-f6499fd78-8xw6p                1/1     Running   0             11m
nginx-f6499fd78-phnss                1/1     Running   0             11m
nginx-f6499fd78-v2vjf                1/1     Running   0             11m
rabbitmq-server-0                    1/1     Running   0             11m
rabbitmq-server-1                    1/1     Running   0             11m
rabbitmq-server-2                    1/1     Running   0             11m

若 pod 运行状态长时间不能转为Running,请通过以下命令定位问题:

  • kubectl describe pod <pod 名称>-n fogcloud # 查看 pod 的详细信息,其中 Events 事件可以查看到 pod 被创建的详过程
  • kubectl logs -f <pod 名称>-n fogcloud #查看 pod 中的程序打印到标准输出的日志

# 4.2 查看负载均衡状态

# 4.3 登录 fogcloud

您可以通过 fogcloud 前端域名登录到 fogcloud 控制台:

# 5 更新 fogcloud 服务

您可以在获取到最新的容器镜像后,替换掉helm values.yaml里的镜像版本,例如:

升级 fogcloud-core 服务至 v5.2.x 版本,您可以修改values.yaml里面的fogcloud.imageTagv5.2.x

升级 fogcloud-web 服务至 v5.2.x 版本,您可以修改values.yaml里面的fogcloudWeb.imageTagv5.2.x

然后运行以下命令即可:

root@mxchip-fogcloud-prod1:~# helm upgrade fogcloud -n fogcloud .

# 6 卸载/重新安装服务

使用 helm uninstall 卸载服务时,应用数据会保留;

请勿直接删除 fogcloud 使用的命名空间!

root@mxchip-fogcloud-prod1:~# helm uninstall fogcloud -n fogcloud
root@mxchip-fogcloud-prod1:~# helm uninstall fission -n fission
root@mxchip-fogcloud-prod1:~# kubectl delete -f ./fogcloud/operator/rabbitmq-cluster-operator.yaml

重新安装服务时,只需要运行以下命令即可:

root@mxchip-fogcloud-prod1:~# helm install fogcloud -n fogcloud .
更新时间: 2024/5/31 16:26:00