Appearance
华为云容器部署
背景
针对用户需要使用华为云容器部署去搭建部署织信NEXT平台,本文档将分别介绍CCE和CCI两种不同的方式去部署k8s集群。
TIP
CCE:云容器引擎 (Cloud Container Engine, CCE) 提供高性能可扩展的容器服务,基于云服务器快速构建高可靠的容器集群。
CCI:云容器实例(Cloud Container Instance, CCI)服务提供无服务器容器引擎。
CCI方式部署
CCI的部署流程可以拆分为准备工作、创建命名空间、创建镜像并上传镜像仓库、创建负载以及访问负载。
1 准备工作
注册华为帐号并开通华为云
如果您已有一个华为云帐户,请跳到下一个任务。如果您还没有华为云帐户,请参考以下步骤创建。
1.打开https://www.huaweicloud.com/,单击“注册”。
2.根据提示信息完成注册并开通华为云,详细操作请参见注册华为账号并开通华为云。
3.参考实名认证完成个人或企业帐号实名认证。
1.1 为帐户充值
确保账户上的余额充足,当账户欠费会导致容器服务停止工作。
1.2 创建IAM用户
华为云注册帐号无需授权,由华为云帐号创建的IAM用户需要授予相应的权限才能使用CCI,具体请参见权限管理。 若不需要授权其他用户访问,可以跳过这一步。
2 创建命名空间
a.登录华为云,并访问云容器实例管理控制台 b.在左侧导航栏中选择【命名空间】 c.在右侧页面的【通用计算型】命名空间下单击创建 d.填写命名空间名称、设置vpc、子网段
- 设置VPC,选择使用已有VPC或新建VPC,新建VPC需要填写VPC网段,建议使用网段:10.0.0.0/8~22,172.16.0.0/12~22,192.168.0.0/16~22。
- 您需要关注子网的可用IP数,确保有足够数量的可用IP,如果没有可用IP,则会导致负载创建失败。
e.点击创建
注意:此处VPC和子网的网段不能为10.247.0.0/16,10.247.0.0/16是云容器实例预留给负载访问的网段。如果您使用此网段,后续可能会造成IP冲突,导致负载无法创建或服务不可用;如果您不需要通过负载访问,而是直接访问Pod,则可以使用此网段。
3 上传镜像至镜像仓库
部署织信NEXT的平台所需要的镜像包除去基础的informat-biz、informat-account两个镜像包以外,其他的rabbitmq、redis、postgres、nginx、onlyoffice这些组件镜像包如果有对应的云服务可不上传,如果没有则需要上传镜像包。
镜像包版本推荐:
informat-biz、informat-account:联系织信商务获取
rabbitmq: 3.9.19
redis: 7.0.5
postgres: 13.11
nginx: 1.22
onlyoffice: 7.1
若没有镜像打包的基础,以上镜像包均可联系织信商务获取。
3.1 页面上传镜像
1.访问容器镜像服务(SWR) 2.创建组织 3.点击上传镜像,选择组织后,上传镜像
若出现镜像上传失败,原因显示鉴权失败的情况,请刷新页面后再尝试,或者采用客户端上传。
3.2 客户端上传镜像
前提:一台云服务器或者虚拟机中的linux系统已经有这些组件tar包或者镜像,并且安装了docker
1.将tar包导入成镜像(若云服务器已经有这些镜像了,可以跳过这一步)
sh
docker import postgres-13.11.tar postgres:13.11
docker import redis-7.0.5.tar redis:7.0.5
docker import rabbitmq-3.9.19.tar rabbitmq:3.9.19
docker import nginx-1.22.tar nginx:1.22
docker import onlyoffice-7.1.tar onlyoffice:7.1
docker import informat-account.tar informat-account:2.8
docker import informat-biz.tar informat-biz:2.8
2.给这些镜像打标签 给上面导入的每一个镜像都打一下tag
sh
sudo docker tag [{镜像名称}:{版本名称}] swr.cn-north-4.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
打包的tag命令,可能会不一样,请点击【上传镜像】-【使用客户端上传】中查看 3. 获取临时登录指令,连接容器镜像服务 将获取到的临时登录指令,在装有镜像的云服务器上运行,运行成功会显示login succeeded。
4.登录成功后,使用push命令,将打好tag的镜像进行传输
push命令在客户端上传的弹窗中,与第2步的tag命令同一位置
sh
sudo docker push swr.cn-north-4.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
5.返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
4 创建负载
在左侧导航栏中选择“工作负载 > 无状态(Deployment)”,在右侧页面单击“镜像创建”。
容器创建顺序先组件再创建织信平台的容器 推荐容器创建的顺序:
rabbitmq->redis->postgres->onlyoffice->nginx->informat-account->informat-biz
4.1 基本信息创建
在创建页面填写基本信息,选择容器
负载名称:例如informat-account
命名空间:前面创建的命名空间。
Pod数量:容器节点的数量,如果需要部署该组件2个节点就选择2。
Pod规格:选择通用计算型,具体参数根据业务需求选择,推荐CPU2核,内存4GB 容器配置:选择【我的镜像】-之前上传到容器服务中的【informat-account】镜像,容器名称就与镜像名一致即可,也可以自定义
选择镜像以后,各个镜像需要配置相应的环境变量和运行命令,请参考以下:
查看组件的内部域名:云容器实例控制台(CCI)->左侧的【网络管理】的服务
rabbitmq:
yaml
name: RABBITMQ_DEFAULT_USER
value: root
name: RABBITMQ_DEFAULT_PASS
value: Next_nxdw_20230801
redis: redis不需要配置环境变量,只需要配置启动命令即可
yaml
command: ["redis-server"]
args: ["--requirepass", "Next_rds_nxdw20230801"]
pgsql:
yaml
name: POSTGRES_PASSWORD
value: Pg_nxdw_20230801#@
onlyoffice: 不需要配置环境变量和启动命令
nginx: 不需要配置环境变量和启动命令
informat-account:
yaml
环境变量:
name: port
value: 9881
name: intranet_url
value: http://nginx-service.default.svc.cluster.local:80
name: db_host
value: postgresql-13-service.default.svc.cluster.local
name: db_port
value: 5432
name: db_account_name
value: db_informat2_account_prd
name: db_user
value: postgres
name: db_password
value: Pg_nxdw_20230801#@
name: redis_host
value: redis-service.default.svc.cluster.local
name: redis_port
value: 6379
name: redis_password
value: Next_rds_nxdw20230801
name: mq_host
value: rabbitmq-service.default.svc.cluster.local
name: mq_port
value: 5672
name: mq_user
value: root
name: mq_password
value: Next_nxdw_20230801
informat-biz:
yaml
name: port
value: 8881
name: intranet_url
value: http://nginx-service.default.svc.cluster.local:80
name: db_host
value: postgresql-13-service.default.svc.cluster.local
name: db_port
value: 5432
name: db_biz_name
value: db_informat2_biz_prd_0
name: db_user
value: postgres
name: db_password
value: Pg_nxdw_20230801#@
name: redis_host
value: redis-service.default.svc.cluster.local
name: redis_port
value: 6379
name: redis_password
value: Next_rds_nxdw20230801
name: mq_host
value: rabbitmq-service.default.svc.cluster.local
name: mq_port
value: 5672
name: mq_user
value: root
name: mq_password
value: Next_nxdw_20230801
name: es_cluster_name
value: 127.0.0.1:9200
4.2 访问设置
访问设置相当于是在创建容器pod的service 访问类型:除去nginx需要选择公网访问,其余的所有组件与informat-account和biz,均选择内网访问
4.2.1 内网访问配置:
- 访问类型:内网访问
- 服务名称:推荐取名规则:容器名-service
- redis: redis-service
- rabbitmq: rabbitmq-service
- pgsql: postgresql-13-service
- onlyoffice: onlyoffice-service
- informat-account: informat-account-service
- informat-biz: informat-biz-service
- 安装coredns:这个需要打开,提供负载之间内部域名的解析服务(任意组件打开安装后,其他组件安装时该选项就不会再显示了)
- 负载端口配置:
- redis: 配置6379端口
- rabbitmq: 配置5672和15672
- pgsql: 配置5432
- onlyoffice: 配置9002到80端口
- informat-account: informat-account-service
- informat-biz: informat-biz-service
4.2.2 公网访问配置
- 访问类型: 公网访问
- 服务名称: 推荐取名规则:容器名-service
- nginx: nginx-service
- 安装coredns: 这个需要打开,提供负载之间内部域名的解析服务(任意组件打开安装后,其他组件安装时该选项就不会再显示了)
- ELB实例:若没有,则需要创建一个ELB实例 根据需求,自行选择规格参数 配置访问端口
4.3 高级设置
不需要做额外配置,直接点击下一步
4.4 规格确认
确认规格参数正确后,直接点击提交
所有容器根据上述步骤,进行创建,创建完成后返回无状态负载列表: 当发现所有的容器均显示运行中,代表容器创建成功,运行正常。
返回左侧菜单【网络管理】-【服务】,查看服务列表 删除nginx的服务 重新创建一个负载均衡的nginx服务
5 访问负载
确认所有创建的容器状态都是运行中以后,复制nginx的service上的公网地址,在浏览器输入访问 当出现以下页面,代表部署成功:
6 常见问题
6.1 创建无状态(Deployment)后,无法运行一直重启,显示异常
查看该实例的配置信息是否正确,若配置均正确可采取以下措施: 1、重启该Deployment组件 2、重启若无效,检查该组件是否适配NEXT平台 3、重新安装一次组件
6.2 访问nginx的时候,页面一直是502的错误
1、进入nginx的容器终端,执行nginx -s reload命令 2、重建组件的service服务 3、若还不可以,可以考虑重新换个镜像包安装运行
6.3 informat-account服务一直报错连不上rabbitmq和redis
1、重装rabbitmq和redis的组件 2、检查是否安装了coredns插件 3、检查accunt环境变量中配置的rabbitmq和redis的环境变量是否正确
CCE方式部署
1 购买CCE集群服务
里面的配置按照自己的业务需求勾选,网络模型选择容器隧道网络
2 进入容器镜像服务,创建组织
组织名字也可以自定义
3 上传容器所需要的镜像
部署织信NEXT的平台所需要的镜像包除去基础的informat-biz、informat-account两个镜像包以外,其他的rabbitmq、redis、postgres、nginx、onlyoffice这些组件镜像包如果有对应的云服务可不上传,如果没有则需要上传镜像包。
镜像包版本推荐:
informat-biz、informat-account:联系织信商务获取
rabbitmq: 3.9.19
redis: 7.0.5
postgres: 13.11
nginx: 1.22
onlyoffice: 7.1
若没有镜像打包的基础,以上镜像包均可联系织信商务获取。
3.1 页面上传镜像
1.访问容器镜像服务(SWR) 2.创建组织 3.点击上传镜像,选择组织后,上传镜像
若出现镜像上传失败,原因显示鉴权失败的情况,请刷新页面后再尝试,或者采用客户端上传。
3.2 客户端上传镜像
前提:一台云服务器或者虚拟机中的linux系统已经有这些组件tar包或者镜像,并且安装了docker
1.将tar包导入成镜像(若云服务器已经有这些镜像了,可以跳过这一步)
sh
docker import postgres-13.11.tar postgres:13.11
docker import redis-7.0.5.tar redis:7.0.5
docker import rabbitmq-3.9.19.tar rabbitmq:3.9.19
docker import nginx-1.22.tar nginx:1.22
docker import onlyoffice-7.1.tar onlyoffice:7.1
docker import informat-account.tar informat-account:2.8
docker import informat-biz.tar informat-biz:2.8
2.给这些镜像打标签 给上面导入的每一个镜像都打一下tag
sh
sudo docker tag [{镜像名称}:{版本名称}] swr.cn-north-4.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
打包的tag命令,可能会不一样,请点击【上传镜像】-【使用客户端上传】中查看 3. 获取临时登录指令,连接容器镜像服务 将获取到的临时登录指令,在装有镜像的云服务器上运行,运行成功会显示login succeeded。
4.登录成功后,使用push命令,将打好tag的镜像进行传输
push命令在客户端上传的弹窗中,与第2步的tag命令同一位置
sh
sudo docker push swr.cn-north-4.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
5.返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
4 管理k8s集群
从服务列表 找到CCE集群 第一步我们成功购买集群后,进入到该页面点击集群进入集群管理页面 在该处创建所需要的节点 上述购买节点的配置,按需自己选择就好 节点类型选择:弹性服务器-虚拟机 节点规格:选择通用型 用户可以根据自身需求选择对应的服务器配置 其他配置选择默认
5 为组件创建service服务
点击左侧的服务,进入页面点击yaml创建按钮 需要一次性将所有service.yaml在创建组件之前全部创建成功 复制account.service.yaml文件内容至窗口中后,点击确定
其他服务均与上述的一致
account.service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: informat-account
name: informat-account-service
spec:
ports:
- name: http
nodePort: 30881
port: 9881
protocol: TCP
targetPort: 9881
selector:
app: informat-account
type: NodePort
biz.service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: informat-biz
name: informat-biz-service
spec:
ports:
- name: http
nodePort: 31881
port: 8881
protocol: TCP
targetPort: 8881
selector:
app: informat-biz
type: NodePort
nginx.service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-service
spec:
ports:
- name: http
nodePort: 30080 # 节点端口,取值范围为30000-32767
port: 80 # 访问Service的端口
protocol: TCP # 访问Service的协议,支持TCP和UDP
targetPort: 80 # Service访问目标容器的端口,此端口与容器中运行的应用强相关,如本例中nginx镜像默认使用80端
- name: https
nodePort: 30443 # 节点端口,取值范围为30000-32767
port: 443 # 访问Service的端口
protocol: TCP # 访问Service的协议,支持TCP和UDP
targetPort: 443 # Service访问目标容器的端口,此端口与容器中运行的应用强相关,如本例中nginx镜像默认使用80端
selector: # 标签选择器,Service通过标签选择Pod,将访问Service的流量转发给Pod,此处选择带有 app:nginx 标签的Pod
app: nginx-1.22
type: NodePort # Service的类型,NodePort表示在通过节点端口访问
onlyoffice.service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: onlyoffice
name: onlyoffice-service
spec:
ports:
- name: tcp
nodePort: 30980
port: 9002
protocol: TCP
targetPort: 80
selector:
app: onlyoffice
type: NodePort
pgsql.service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: postgresql-13
name: postgresql-13-service
spec:
ports:
- name: tcp
nodePort: 30432
port: 5432
protocol: TCP
targetPort: 5432
selector:
app: postgresql-13
type: NodePort
apiVersion: v1
kind: Service
metadata:
labels:
app: postgresql-13
name: postgresql-13-service
spec:
ports:
- name: tcp
nodePort: 30432
port: 5432
protocol: TCP
targetPort: 5432
selector:
app: postgresql-13
type: NodePort
rabbitmq.service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: rabbitmq
name: rabbitmq-service
spec:
ports:
- name: tcp
port: 5672
protocol: TCP
targetPort: 5672
- name: manager
nodePort: 30672
port: 15672
protocol: TCP
targetPort: 15672
selector:
app: rabbitmq
type: NodePort
redis.service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: redis
name: redis-service
spec:
ports:
- name: tcp
nodePort: 32379
port: 6379
protocol: TCP
targetPort: 6379
selector:
app: redis
type: NodePort
6 创建应用
在左上角【服务列表】中找到【应用管理与运维平台】,点击左边菜单栏中的【应用管理】
在应用管理中创建应用规则.(项目名称首字母小写-应用名称)
7 上传组件
在左上角【服务列表】中找到【应用管理与运维平台】,在该页面中点击新增组件
在下面的操作中自动生成组件版本,选择对应环境、应用
选择镜像包、开启yaml模型
将account.pod.yaml文件内容粘贴到文本框中后,点击创建并部署
其余组件与上述创建方式一致
注意:根据上传了那些镜像就创建那些组件,比如我只上传了biz和account镜像,那我们就只需要创建account和biz的组件
以下yaml文件中提及的image参数,请使用自己镜像对应的地址
查看地址:【容器镜像服务SWR】-【我的镜像】
account.pod.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: informat-account
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: informat-account
template:
metadata:
labels:
app: informat-account
spec:
imagePullSecrets:
- name: default-secret
containers:
- image: swr.cn-east-3.myhuaweicloud.com/informat-develop/informat-account:2.8.20230904
name: informat-account
imagePullPolicy: Always
ports:
- containerPort: 9881
protocol: TCP
name: http
env:
- name: port
value: '9881'
- name: intranet_url
value: http://nginx-service.default.svc.cluster.local:80
- name: db_host
value: postgresql-13-service.default.svc.cluster.local
- name: db_port
value: '5432'
- name: db_account_name
value: db_informat2_account_prd
- name: db_user
value: postgres
- name: db_password
value: Pg_nxdw_20230801#@
- name: redis_host
value: redis-service.default.svc.cluster.local
- name: redis_port
value: '6379'
- name: redis_password
value: Next_rds_nxdw20230801
- name: mq_host
value: rabbitmq-service.default.svc.cluster.local
- name: mq_port
value: '5672'
- name: mq_user
value: root
- name: mq_password
value: Next_nxdw_20230801
biz.pod.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: informat-biz
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: informat-biz
template:
metadata:
labels:
app: informat-biz
spec:
imagePullSecrets:
- name: default-secret
containers:
- image: swr.cn-east-3.myhuaweicloud.com/informat-develop/informat-biz:2.6.20230723
name: informat-biz
imagePullPolicy: Always
ports:
- containerPort: 8881
protocol: TCP
name: http
env:
- name: port
value: '8881'
- name: intranet_url
value: http://nginx-service.default.svc.cluster.local:80
- name: db_host
value: postgresql-13-service.default.svc.cluster.local
- name: db_port
value: '5432'
- name: db_biz_name
value: db_informat2_biz_prd_0
- name: db_user
value: postgres
- name: db_password
value: Pg_nxdw_20230801#@
- name: redis_host
value: redis-service.default.svc.cluster.local
- name: redis_port
value: '6379'
- name: redis_password
value: Next_rds_nxdw20230801
- name: mq_host
value: rabbitmq-service.default.svc.cluster.local
- name: mq_port
value: '5672'
- name: mq_user
value: root
- name: mq_password
value: Next_nxdw_20230801
- name: es_cluster_name
value: 127.0.0.1:9200
nginx.pod.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-1.22
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-1.22
template:
metadata:
labels:
app: nginx-1.22
spec:
imagePullSecrets:
- name: default-secret
containers:
- image: swr.cn-east-3.myhuaweicloud.com/informat-develop/nginx:1.22
name: nginx
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
- containerPort: 443
protocol: TCP
name: https
onlyoffice.pod.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: onlyoffice
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: onlyoffice
template:
metadata:
labels:
app: onlyoffice
spec:
imagePullSecrets:
- name: default-secret
containers:
- image: swr.cn-east-3.myhuaweicloud.com/informat-develop/onlyoffice:7.1
name: onlyoffice
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: tcp
pgsql.pod.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgresql-13
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: postgresql-13
template:
metadata:
labels:
app: postgresql-13
spec:
imagePullSecrets:
- name: default-secret
containers:
- image: swr.cn-south-1.myhuaweicloud.com/informat-developer/postgres:13.11
name: postgresql-13
imagePullPolicy: Always
ports:
- containerPort: 5432
protocol: TCP
name: tcp
env:
- name: POSTGRES_PASSWORD
value: Pg_nxdw_20230801#@
rabbitmq.pod.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
template:
metadata:
labels:
app: rabbitmq
spec:
imagePullSecrets:
- name: default-secret
containers:
- image: swr.cn-east-3.myhuaweicloud.com/informat-develop/rabbitmq:3.9.19
name: rabbitmq
imagePullPolicy: Always
ports:
- containerPort: 5672
protocol: TCP
name: tcp
- containerPort: 15672
protocol: TCP
name: manager
env:
- name: RABBITMQ_DEFAULT_USER
value: root
- name: RABBITMQ_DEFAULT_PASS
value: Next_nxdw_20230801
redis.pod.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
imagePullSecrets:
- name: default-secret
containers:
- image: swr.cn-east-3.myhuaweicloud.com/informat-develop/redis:7.0.5
name: redis
imagePullPolicy: Always
command: ["redis-server"]
args: ["--requirepass", "Next_rds_nxdw20230801"]
ports:
- containerPort: 6379
protocol: TCP
name: tcp
8 初始化数据库
1)下载安装器
sh
curl -O https://git.itit.io/api/v4/projects/21/packages/generic/informat2-installer/docker/informat\_next\_installer.zip
2)解压安装器
sh
unzip informat\_next\_installer.zip
cd informat\_next\_installer
3)创建初始化数据库脚本
sh
vi init_db.properties
4)在init_db.properties输入配置信息
sh
#安装包目录
package-path=../informat_next_2.7.zip
# 不安装数据库
db.install=false
# 创建account数据库
db.create-account=true
# 创建biz数据库
db.create-biz=true
# 初始化account数据库
db.init-account=true
# 初始化biz数据库
db.init-biz=true
# 更新account
db.upgrade-account=true
# 更新biz
db.upgrade-biz=true
# account库名称 db.account.name=db_informat2_account_prd
# biz库名称 db.biz.name=db_informat2_biz_prd_0
# 数据库地址
db.host=127.0.0.1
# 数据库端口
db.port=5432
# 数据库用户
db.user=postgres
# 数据库密码
db.password={password}
# 默认操作库
db.opt-db-name=postgres
5)运行初始化命令
sh
./jdk/bin/java -jar InformatNextInstaller-1.0.0.jar init_db.properties
9 查看组件列表中组件状态
在左上角【服务列表】中找到【应用管理与运维平台】 dep-status1.png 点击应用进入查看组件状态
10 购买弹性公网ip绑定到节点
最后点击弹性公网ip服务,将购买的服务绑定我们的集群节点 假设公网ip为:172.123.22.1 访问格式:公网ip+nginx集群的nodePort端口 nginx集群的nodePort端口: 可以看到nginx的集群nodePort为30080 最后打开浏览器,在访问地址输入:172.123.22.1:80即可访问项目