文章目录

  • 1 组件安装(Linux)
    • 1.1 Go
    • 1.2 Nodejs
  • 2 代码编译打包
    • 2.1 代码编译
  • 3 K8s部署cmdb
    • 3.1 Redis
    • 3.2 Zookeeper
    • 3.3 Mongodb
    • 3.4 Elasticsearch
    • 3.5 部署cmdb
  • 4 参考文章

1 组件安装(Linux)

1.1 Go

# 下载
cd /usr/local/src
sudo wget https://studygolang.com/dl/golang/go1.16.5.linux-amd64.tar.gz
sudo tar -xf go1.16.5.linux-amd64.tar.gz# 配置环境变量
sudo vim /etc/profile
export GOROOT=/usr/local/src/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=$HOME/goprojects/
export GO111MODULE=auto
export GOPROXY=https://goproxy.cn,directsource /etc/profile# 创建目录
mkdir -p $HOME/goprojects/{src,pkg}

1.2 Nodejs

nodejs下载地址:https://nodejs.org/en/download/

# 下载
cd /usr/local/src
sudo wget https://nodejs.org/dist/v14.16.0/node-v14.16.0-linux-x64.tar.gz
sudo mv node-v14.16.0-linux-x64 nodejs
安装cnpm v7.1.0
# 若已有cnmp,查看版本,如若版本高于8.0+,则需要卸载
sudo npm uninstall -g cnpm# 安装cnpm v7.1.0
sudo npm install -g cnpm@7.1.0 --registry=https://registry.npm.taobao.org创建软链接
sudo ln -s /usr/local/src/nodejs/bin/npm /usr/local/bin
sudo ln -s /usr/local/src/nodejs/bin/node /usr/local/bin
sudo ln -s /usr/local/src/nodejs/bin/cnpm /usr/local/bin
sudo ln -s /usr/local/src/nodejs/bin/npm /usr/bin
sudo ln -s /usr/local/src/nodejs/bin/node /usr/bin
sudo ln -s /usr/local/src/nodejs/bin/cnpm /usr/bin

2 代码编译打包

2.1 代码编译

# 1. 代码编译
cd $GOPATH/src# 这里需要注意,如果代码是直接download下来的zip包,后边代码编译时会出错
git clone -b release-v3.10.17 https://github.com/Tencent/bk-cmdb configcenter
# 2. 前后端一块编译,cnpm版本小于8.0,否则编译不过
make NPM=cnpm
# 3. 打包package
make package
# 产物生成目录
${GOPATH}/src/configcenter/src/bin/pub/cmdb

前后端分别编译:

#单独编译前端
make ui NPM=cnpm
#单独编译后端
make server

3 K8s部署cmdb

3.1 Redis

kind: ConfigMap
apiVersion: v1
metadata:name: redis-confignamespace: bk-cmdblabels:app: redis
data:redis.conf: |-dir /dataport 6379bind 0.0.0.0appendonly yesprotected-mode norequirepass 123456pidfile /data/bk-cmdb/redis/redis-6379.pid
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: redisname: redisnamespace: bk-cmdb
spec:replicas: 1selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:nodeSelector:kubernetes.io/hostname: node04containers:- image: redis:6.2imagePullPolicy: IfNotPresentname: rediscommand:- "sh"- "-c"- "redis-server /usr/local/etc/redis/redis.conf"ports:- containerPort: 6379volumeMounts:- name: datamountPath: /data- name: configmountPath: /usr/local/etc/redis/redis.confsubPath: redis.confvolumes:- name: configconfigMap:name: redis-config- name: datahostPath:path: /data/bk-cmdb/redis/data
---
apiVersion: v1
kind: Service
metadata:labels:app: redisname: redisnamespace: bk-cmdb
spec:ports:- port: 6379protocol: TCPtargetPort: 6379nodePort: 30279selector:app: redistype: NodePort

3.2 Zookeeper

# Setup Service to provide access to Zookeeper for clients
apiVersion: v1
kind: Service
metadata:# DNS would be like zookeeper.zoonsname: zookeeperlabels:app: zookeepernamespace: bk-cmdb
spec:ports:- port: 2181name: clienttargetPort: 2181nodePort: 30181- port: 7000name: prometheustargetPort: 7000nodePort: 30700selector:app: zookeeperwhat: nodetype: NodePort
---
# Setup Headless Service for StatefulSet
apiVersion: v1
kind: Service
metadata:# DNS would be like zookeeper-0.zookeepers.etcname: zookeeperslabels:app: zookeepernamespace: bk-cmdb
spec:ports:- port: 2888name: server- port: 3888name: leader-electionclusterIP: Noneselector:app: zookeeperwhat: node
---
# Setup max number of unavailable pods in StatefulSet
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:name: zookeeper-pod-disruption-budgetnamespace: bk-cmdb
spec:selector:matchLabels:app: zookeepermaxUnavailable: 1
---
# Setup Zookeeper StatefulSet
# Possible params:
# 1. replicas
# 2. memory
# 3. cpu
# 4. storage
# 5. storageClassName
# 6. user to run app
apiVersion: apps/v1
kind: StatefulSet
metadata:# nodes would be named as zookeeper-0, zookeeper-1, zookeeper-2name: zookeepernamespace: bk-cmdb
spec:selector:matchLabels:app: zookeeperserviceName: zookeepersreplicas: 3updateStrategy:type: RollingUpdatepodManagementPolicy: Paralleltemplate:metadata:labels:app: zookeeperwhat: nodeannotations:prometheus.io/port: '7000'prometheus.io/scrape: 'true'spec:
#      affinity:
#        podAntiAffinity:
#          requiredDuringSchedulingIgnoredDuringExecution:
#            - labelSelector:
#                matchExpressions:
#                  - key: "app"
#                    operator: In
#                    values:
#                      - zookeeper
#              topologyKey: "kubernetes.io/hostname"nodeSelector:app: zookeepercontainers:- name: kubernetes-zookeeperimagePullPolicy: IfNotPresentimage: "zookeeper:3.6.3"resources:requests:memory: "512M"cpu: "1"limits:memory: "4Gi"cpu: "2"ports:- containerPort: 2181name: client- containerPort: 2888name: server- containerPort: 3888name: leader-election- containerPort: 7000name: prometheus# See those links for proper startup settings:# https://github.com/kow3ns/kubernetes-zookeeper/blob/master/docker/scripts/start-zookeeper# https://clickhouse.yandex/docs/en/operations/tips/#zookeeper# https://github.com/ClickHouse/ClickHouse/issues/11781command:- bash- -x- -c- |SERVERS=3 &&HOST=`hostname -s` &&DOMAIN=`hostname -d` &&CLIENT_PORT=2181 &&SERVER_PORT=2888 &&ELECTION_PORT=3888 &&PROMETHEUS_PORT=7000 &&ZOO_DATA_DIR=/var/lib/zookeeper/data &&ZOO_DATA_LOG_DIR=/var/lib/zookeeper/datalog &&{echo "clientPort=${CLIENT_PORT}"echo 'tickTime=2000'echo 'initLimit=300'echo 'syncLimit=10'echo 'maxClientCnxns=2000'echo 'maxSessionTimeout=60000000'echo "dataDir=${ZOO_DATA_DIR}"echo "dataLogDir=${ZOO_DATA_LOG_DIR}"echo 'autopurge.snapRetainCount=10'echo 'autopurge.purgeInterval=1'echo 'preAllocSize=131072'echo 'snapCount=3000000'echo 'leaderServes=yes'echo 'standaloneEnabled=false'echo '4lw.commands.whitelist=*'echo 'metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider'echo "metricsProvider.httpPort=${PROMETHEUS_PORT}"} > /conf/zoo.cfg &&{echo "zookeeper.root.logger=CONSOLE"echo "zookeeper.console.threshold=INFO"echo "log4j.rootLogger=\${zookeeper.root.logger}"echo "log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender"echo "log4j.appender.CONSOLE.Threshold=\${zookeeper.console.threshold}"echo "log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout"echo "log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n"} > /conf/log4j.properties &&echo 'JVMFLAGS="-Xms128M -Xmx4G -XX:+UseG1GC -XX:+CMSParallelRemarkEnabled"' > /conf/java.env &&if [[ $HOST =~ (.*)-([0-9]+)$ ]]; thenNAME=${BASH_REMATCH[1]}ORD=${BASH_REMATCH[2]}elseecho "Failed to parse name and ordinal of Pod"exit 1fi &&mkdir -p ${ZOO_DATA_DIR} &&mkdir -p ${ZOO_DATA_LOG_DIR} &&export MY_ID=$((ORD+1)) &&echo $MY_ID > $ZOO_DATA_DIR/myid &&for (( i=1; i<=$SERVERS; i++ )); doecho "server.$i=$NAME-$((i-1)).$DOMAIN:$SERVER_PORT:$ELECTION_PORT" >> /conf/zoo.cfg;done &&chown -Rv zookeeper "$ZOO_DATA_DIR" "$ZOO_DATA_LOG_DIR" "$ZOO_LOG_DIR" "$ZOO_CONF_DIR" &&zkServer.sh start-foregroundreadinessProbe:exec:command:- bash- -c- "OK=$(echo ruok | nc 127.0.0.1 2181); if [[ \"$OK\" == \"imok\" ]]; then exit 0; else exit 1; fi"initialDelaySeconds: 10timeoutSeconds: 5livenessProbe:exec:command:- bash- -c- "OK=$(echo ruok | nc 127.0.0.1 2181); if [[ \"$OK\" == \"imok\" ]]; then exit 0; else exit 1; fi"initialDelaySeconds: 10timeoutSeconds: 5volumeMounts:- name: data-dir-volumemountPath: /var/lib/zookeeper# Run as a non-privileged usersecurityContext:runAsUser: 0fsGroup: 0volumeClaimTemplates:- metadata:name: data-dir-volumespec:# 替换成自己的存储器storageClassName: nfs-storageaccessModes:- ReadWriteOnceresources:requests:storage: 25Gi

3.3 Mongodb

apiVersion: v1
kind: ConfigMap
metadata:name: mongodb-rs-cm
data:keyfile: |dGhpcyBpcyBycyBzdXBlciBzZWNyZXQga2V5Cg==mongod_rs.conf: |+systemLog:destination: filelogAppend: truepath: /data/mongod.logstorage:dbPath: /datajournal:enabled: truedirectoryPerDB: truewiredTiger:engineConfig:cacheSizeGB: 2directoryForIndexes: trueprocessManagement:fork: truepidFilePath: /data/mongod.pidnet:port: 27017bindIp: 0.0.0.0maxIncomingConnections: 5000security:keyFile: /data/configdb/keyfileauthorization: enabledreplication:oplogSizeMB: 1024replSetName: rs0
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mongodb-rs
spec:serviceName: mongodb-rsreplicas: 3selector:matchLabels:app: mongodb-rstemplate:metadata:labels:app: mongodb-rsspec:containers:- name: mongoimage: mongo:4.4.1ports:- containerPort: 27017name: clientcommand: ["sh"]args:- "-c"- |set -exmongod --config /data/configdb/mongod_rs.confsleep infinity              env:- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIPvolumeMounts:- name: confmountPath: /data/configdbreadOnly: false- name: datamountPath: /datareadOnly: falsevolumes:- name: confconfigMap:name: mongodb-rs-cmdefaultMode: 0600volumeClaimTemplates:- metadata:name: dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 80GistorageClassName: nfs-storage
---
apiVersion: v1
kind: Service
metadata:name: mongodb-rslabels:app: mongodb-rsnamespace: bk-cmdb
spec:ports:- port: 27017targetPort: 27017nodePort: 30717selector:app: mongodb-rstype: NodePort

mongodb初始化配置。

# 创建cmdb数据库和user
# 1.进入容器
kubectl  exec -it mongodb-rs-0 -n bk-cmdb bash# 2.进入数据库
mongo# 3.集群init
# members解析如下:
#     pod名字 .<service名>.<namespace>.固定格式
# mongodb-rs-0.mongodb-rs.bk-cmdb.svc.cluster.localconfig = { _id:"rs0", members:[{_id:0,host:"mongodb-rs-0.mongodb-rs.bk-cmdb.svc.cluster.local:27017",priority:90}, {_id:1,host:"mongodb-rs-1.mongodb-rs.bk-cmdb.svc.cluster.local:27017",priority:80}, {_id:2,host:"mongodb-rs-2.mongodb-rs.bk-cmdb.svc.cluster.local:27017",priority:70}]
}
rs.initiate(config)
# 查看集群状态
rs.status()# 4. 创建管理员账号
use admin
db.createUser({user:"admin", pwd:"123456", roles:[{role: "userAdminAnyDatabase", db:"admin" }]})
db.auth('admin','123456')
db.grantRolesToUser("admin", ["clusterAdmin"])# 5. 创建普通用户
use cmdb
db.createUser({user: "cc",pwd: "cc",roles: [ { role: "readWrite", db: "cmdb" },{ role: "readWrite", db: "monstache" } ]})

3.4 Elasticsearch

apiVersion: v1
kind: ConfigMap
metadata:name: es-7namespace: bk-cmdb
data:elasticsearch.yml: |node.name: mastercluster.initial_master_nodes: ["master"]network.host: 0.0.0.0path.data: /datahttp.cors.enabled: truehttp.cors.allow-origin: "*"
---
apiVersion: apps/v1
kind: Deployment
metadata:name: elasticsearch7-singlenamespace: bk-cmdb
spec:replicas: 1selector:matchLabels:name: elasticsearch7template:metadata:labels:name: elasticsearch7spec:nodeSelector:kubernetes.io/hostname: node07initContainers:- name: init-sysctlimage: busybox:stableimagePullPolicy: IfNotPresentcommand:- sysctl- -w- vm.max_map_count=655360securityContext:privileged: truecontainers:- name: elasticsearchimage: elasticsearch:7.5.2imagePullPolicy: IfNotPresentports:- containerPort: 9200- containerPort: 9300volumeMounts:- name: es-datamountPath: /data- name: es-pluginsmountPath: /usr/share/elasticsearch/plugins- name: es-confmountPath: /usr/share/elasticsearch/config/elasticsearch.ymlsubPath: elasticsearch.ymlvolumes:- name: es-datahostPath:path: /data/bk-cmdb/elasticsearch/data- name: es-pluginshostPath:path: /data/bk-cmdb/elasticsearch/plugins- name: es-confconfigMap:name: es-7
---
apiVersion: v1
kind: Service
metadata:name: elasticsearch7-singlenamespace: bk-cmdblabels:name: elasticsearch7
spec:type: NodePortports:- port: 9200targetPort: 9200nodePort: 30920name: elasticsearch7-single1- port: 9300targetPort: 9300nodePort: 30930name: elasticsearch7-single2selector:name: elasticsearch7

3.5 部署cmdb

Dockerfile.product文件如下:

FROM centos:7# copy to bin directory
RUN mkdir -p /data/bin/
COPY bk-cmdb /data/bin/bk-cmdb/

Docker build镜像

  • init.py参数详解
# 1.拷贝生成物
cd ${GOPATH}/src/configcenter/helm/image
cp -a ${GOPATH}/src/configcenter/src/bin/pub/cmdb bk-cmdb# 2.生成配置文件
# --discovery:zookeeper地址
# --database:mongodb数据库 cmdb
# --blueking_cmdb_url:cmdb被外部访问的端口
# --user_info:定义账号密码,以:冒号分隔。多个用户以,逗号分隔,示例:admin:123456,songqi:123456,pcj:123456
cd bk-cmdb
python init.py  \--discovery          172.16.0.100:30181 \--database           cmdb \--redis_ip           172.16.0.100 \--redis_port         30279 \--redis_pass         123456\--mongo_ip           172.16.0.100 \--mongo_port         30217 \--mongo_user         cc \--mongo_pass         cc \--blueking_cmdb_url  http://172.16.0.28:8083/ \--listen_port        8083 \--es_url             http://172.16.0.100:30920\--log_level          3 \--user_info          admin:123456# 3.在执行完第二步配置文件初始化后,一些shell脚本的格式需要转换下 dos2unix
find . -name "*.sh" | xargs dos2unix && find . -name "*.py" | xargs dos2unix

制作镜像需要注意的是,在build镜像时,cmdb前后端程序文件所在的宿主机目录要跟容器内所在的目录保持一致,以上述Dockerfile-product为例,我需要在宿主机的/data/bin/目录下去build镜像

# 4.制作镜像
[root@node05 bin]# pwd
/data/bin
[root@node05 bin]# ls -l
total 8
drwxrwxr-x 21 1001 1001 4096 Jul  9 16:22 bk-cmdb
-rw-r--r--  1 root root   94 Jul  9 11:02 Dockerfile.product
[root@node05 bin]# docker build . -t 172.16.0.28:9000/cmdb/bk-cmdb:v3.10.17 -f Dockerfile.product --no-cache
[root@node05 bin]# docker push 172.16.0.28:9000/cmdb/bk-cmdb:v3.10.17
bk-cmdb.yaml

kubectl apply -f bk-cmdb.yaml。目前没有把这些服务拆分开,守护进程用sleep代替,后续改改即可

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: bk-cmdbname: bk-cmdbnamespace: bk-cmdb
spec:replicas: 1selector:matchLabels:app: bk-cmdbtemplate:metadata:labels:app: bk-cmdbspec:nodeSelector:kubernetes.io/hostname: node05containers:- image: 172.16.0.28:9000/cmdb/bk-cmdb:v3.10.18imagePullPolicy: IfNotPresentname: bk-cmdbcommand:- "sh"- "-c"- "/data/bin/bk-cmdb/start.sh && sleep 1000000000000"ports:- containerPort: 8083
---
apiVersion: v1
kind: Service
metadata:labels:app: bk-cmdbname: bk-cmdbnamespace: bk-cmdb
spec:ports:- port: 8083protocol: TCPtargetPort: 8083nodePort: 30800selector:app: bk-cmdbtype: NodePort

由于mongodb版本大于3.6,所以部署完bk-cmdb需要手动执行init_db.sh

kubectl  exec -it bk-cmdb-676b7b568-v79rm -n bk-cmdb bash
./init_db.sh

4 参考文章

  • 腾讯CMDB3.6.3部署
  • CMDB编译指南 - 官方
  • CMDB部署指南 - 官方

K8S部署蓝鲸开源bk-cmdb v3.10.17相关推荐

  1. K8S 1.18.0 以及KubeEdge 1.10.3 三机安装部署(含过程记录及遇到的报错和解决方法)

    因为网络上大多数教程只有部署相关的命令,而无输入命令后正确界面的显示样例,因此在参考网络上教程并跟随实现的过程中,我将过程进行截图记录,供大家参考.希望对大家有帮助~ 一. K8S部署 选用了三台虚拟 ...

  2. k8s挂载目录_拥抱云原生,如何将开源项目用k8s部署?

    k8s以及云原生相关概念近年来一直比较火热,阿丸最近搞了个相关项目,小结一下. 本文将重点分享阿里开源项目otter适配k8s部署的改造过程,其中的改造过程和技巧应该适用于将大多数开源项目改造到k8s ...

  3. k8s部署zabbix_Kubernetes 中部署 Zabbix

    Zabbix 简介[1] Zabbix 是由 Alexei Vladishev 开发的一种网络监视.管理系统,基于 Server-Client 架构.可用于监视各种网络服务.服务器和网络机器等状态. ...

  4. 记一次阿里云k8s部署-测试存储

    记一次阿里云k8s部署 阿里云资源准备 服务器 ip 角色 资源 192.168.1.160 master1 2核4G 192.168.1.161 master2 2核4G 192.168.1.162 ...

  5. k8s部署zookeeper集群 运行 ZooKeeper, 一个 CP 分布式系统

    本教程展示了在 Kubernetes 上使用 StatefulSets,PodDisruptionBudgets 和 PodAntiAffinity 特性运行 Apache Zookeeper. 准备 ...

  6. 教程get | K8S部署OpenStack容器云(下)

    如何借助OpenStack Kolla-K8S项目,通过K8S对OpenStack进行容器化部署?并最终部署一套All-In-One类型的OpenStack容器云?让我们继续部署: 部署kolla-k ...

  7. 高可用集群篇(五)-- K8S部署微服务

    高可用集群篇(五)-- K8S部署微服务 一.K8S有状态服务 1.1 什么是有状态服务 1.2 k8s部署MySQL 1.2.1 创建MySQL主从服务 1.2.2 测试主从配置 1.2.3 k8s ...

  8. 原生K8S部署pig微服务项目

    原生K8S部署pig微服务项目 简介 项目地址:码云 Pig微服务项目 基于 Spring Cloud 2021 .Spring Boot 2.7. OAuth2 的 RBAC 权限管理系统 基于数据 ...

  9. k8s 部署 TCP node应用

    k8s 部署 TCP node应用 之前我们已经成功的将node的http应用部署到k8s集群内,但某些业务不仅仅需要http应用还需要TCP长连接应用,本文将对部署tcp应用的步骤及问题进行总结 本 ...

最新文章

  1. 什么是BI?什么是DW?ETL(Extract-Transform-Load)是什么?
  2. 学习笔记Hadoop(四)—— Hadoop集群的安装与部署(1)—— 虚拟机安装、java安装
  3. 如何在Linux(ubuntu21.04)下安装chrome浏览器
  4. Notepad++去除代码行号的几种方法
  5. 有用的网址集合, IT杂谈
  6. 让威胁管理跟上数据中心奔跑的速度
  7. fb 4.7英文版 显示行数
  8. ajax实现上传文件
  9. python 矩阵类型转换_python中的矩阵运算
  10. NOIP 2005 过河
  11. 笔记本电脑怎样连接打印机_“小小”打印机 | 惠普M17w迷你激打
  12. 如何利用Keras中的权重约束减少深度神经网络中的过拟合
  13. 聊聊缓存淘汰算法-LRU 实现原理
  14. fastreport按条件查询_查询代价的
  15. 91p3.space/index.php,writeup_for_SCTF2016
  16. 华沙理工大学语言c1,留学波兰华沙理工大学:一个让人轻易就爱上的地方
  17. Solana首个IDO平台Solstarter前景如何?
  18. 教育行业是永恒不过时的常青藤行业!
  19. IP-Guard如何注册
  20. css 实现单行、多行文本显示

热门文章

  1. 递推法加分数和c语言,跳台阶
  2. AppConfig增加IsEnumToInt配置
  3. word格式刷如何连续刷多段不同字段?
  4. 今日头条视频如何消重
  5. 在InstallShield中写SuperDog加密狗程序
  6. android点击不抬起,Android小坑-OnTouchListener()事件监听长按后抬手MotionEvent.ACTION_MOVE不触发问题...
  7. ShaderJoy —— 仿抖音 “天使光芒” 特效【GLSL】
  8. word添加特定字体操作
  9. SurfaceView简单使用--可做帧动画
  10. 边框样式、段落样式、背景样式