1. 概述
需要先准备一台中控机,在中控机安装 kubectl、helm、helmfile 等工具,以及蓝鲸安装脚本。然后部署基础套餐,最后再部署持续集成套餐(蓝盾)。
简单来说就是三个步骤:
- 1.准备环境
- 2.部署基础服务
- 3.部署蓝盾
2. 准备中控机
按照官方文档安装和配置即可。
3. 部署基础服务
需要按照官方文档一步步部署。
3.1 下载安装文件
请在 中控机 使用下载脚本下载蓝鲸 helmfile 包及公共证书。( helmfile相关value文件在git上维护)
bkdl-7.1-stable.sh -ur latest base demo这些文件默认放在了 ~/bkce7.1-install/ 目录。
3.2 配置 Helm Chart 仓库
helm repo add blueking https://hub.bktencent.com/chartrepo/blueking
helm repo update
helm repo list3.3 配置全局 custom-values
相关文件已经修改,在git上维护,配置访问域名。、
# 请修改为你分配给蓝鲸平台的主域名BK_DOMAIN=bk.hua-ri.cn
# 进入工作目录cd ~/bkce7.1-install/blueking/
# 可使用如下命令添加域名。如果文件已存在,请手动编辑。custom=environments/default/custom.yaml
cat >> "$custom" <<EOFimageRegistry: ${REGISTRY:-hub.bktencent.com}domain: bkDomain: $BK_DOMAIN bkMainSiteDomain: $BK_DOMAINEOF3.4 生成 values 文件
还有一些 values 文件随着部署环境的不同而变化,所以我们提供了脚本快速生成。
生成蓝鲸 app code 对应的 secret:
./scripts/generate_app_secret.sh ./environments/default/app_secret.yaml生成 apigw 所需的 keypair:
./scripts/generate_rsa_keypair.sh ./environments/default/bkapigateway_builtin_keypair.yaml生成 paas 所需的 clusterAdmin:
./scripts/create_k8s_cluster_admin_for_paas3.sh3.5 安装入口网关
3.5.1 安装 ingress controller
先检查你的环境是否已经部署了 ingress controller:
kubectl get pods -A -l app.kubernetes.io/name=ingress-nginx如果没有,则使用如下命令创建:
helmfile -f 00-ingress-nginx.yaml.gotmpl sync
# 查看创建的podkubectl get pods -A -l app.kubernetes.io/name=ingress-nginx需要特别注意,在你的集群里,可能并不存在这个label:app.kubernetes.io/name=ingress-nginx
3.5.2 配置 coredns
在部署过程中,会在容器内访问这些域名,所以需要提前配置 coredns,将蓝鲸域名解析到 service IP。
这里解决的是集群内部的域名解析!!!
注意: 当 service 被删除,重建后 clusterIP 会变动,此时需重新操作刷新 hosts 文件。
因此需要注入 hosts 配置项到 kube-system namespace 下的 coredns 系列 pod
# 进入工作目录cd ~/bkce7.1-install/blueking/
# 从自定义配置中提取, 也可自行赋值BK_DOMAIN=$(yq e '.domain.bkDomain' environments/default/custom.yaml)
# 获取ingress-nginx svc的ipIP1=$(kubectl get svc -A -l app=nginx-ingress-lb -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
# 创建coredns记录./scripts/control_coredns.sh update "$IP1" $BK_DOMAIN bkrepo.$BK_DOMAIN docker.$BK_DOMAIN bkapi.$BK_DOMAIN bkpaas.$BK_DOMAIN bkiam-api.$BK_DOMAIN bkiam.$BK_DOMAIN apps.$BK_DOMAIN bknodeman.$BK_DOMAIN job.$BK_DOMAIN jobapi.$BK_DOMAIN devops.$BK_DOMAIN
# 检查添加的记录。./scripts/control_coredns.sh list参考输出如下:
172.27.124.109 bkce.hua-ri.cn 172.27.124.109 bkrepo.bkce.hua-ri.cn 172.27.124.109 docker.bkce.hua-ri.cn 172.27.124.109 bkapi.bkce.hua-ri.cn 172.27.124.109 bkpaas.bkce.hua-ri.cn 172.27.124.109 bkiam-api.bkce.hua-ri.cn 172.27.124.109 bkiam.bkce.hua-ri.cn 172.27.124.109 apps.bkce.hua-ri.cn 172.27.124.109 bknodeman.bkce.hua-ri.cn 172.27.124.109 job.bkce.hua-ri.cn 172.27.124.109 jobapi.bkce.hua-ri.cn 172.27.124.109 devops.bkce.hua-ri.cn3.6 部署或对接存储服务
3.6.1 部署蓝鲸预置的存储服务
参考官方文档安装,相关helm配置已经放在git上维护,可以直接简单执行以下命令:
helmfile -f base-storage.yaml.gotmpl sync请注意,使用该存储类创建的存储盘最小容量为20Gi.
3.6.2 对接已有的存储服务
禁用蓝鲸内置服务,配置使用已有服务。请参考helmfile定义及values文件自行研究。参考官方文档的例子。
3.7 部署基础套餐
通过helmfile安装 base-blueking.yaml.gotmpl ,按照顺序依次安装。具体每层安装的内容可以查看文件内容。
helmfile -f base-blueking.yaml.gotmpl -l seq=first synchelmfile -f base-blueking.yaml.gotmpl -l seq=second synchelmfile -f base-blueking.yaml.gotmpl -l seq=third sync# helmfile -f base-blueking.yaml.gotmpl -l seq=fourth sync3.8 访问蓝鲸桌面
在负载均衡器配置后端为 ingress-nginx pod 所在机器的内网 IP,端口为 80。详细信息参考文档。
3.8.1 查找ingress nginx svc
找到ingress nginx的svc:
kubectl get svc -n kube-system|grep ingress结果:
# popsingress-nginx-controller-admission ClusterIP x.x.x.x <none> 443/TCP 3y69dnginx-ingress-lb LoadBalancer x.x.x.x x.x.x.x 80:30725/TCP,443:31357/TCP 3y69d这里
nginx-ingress-lb是目前集群的ingress nginx svc
3.8.2 设置svc type为LoadBalancer
查看svc type:
# 查看集群ingress nginx svc命令kubectl get svc/nginx-ingress-lb -n kube-system -oyaml|grep type若无type: LoadBalancer结果,则手动进行修改:
# 修改pops集群ingress nginx svc命令kubectl edit svc/nginx-ingress-lb -n kube-system3.8.3 负载均衡clb实例
查看svc yaml是否包含两个重要annotation:
# 查看pops集群ingress nginx svc命令kubectl get svc/nginx-ingress-lb -n kube-system -oyaml|grep service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listenerskubectl get svc/nginx-ingress-lb -n kube-system -oyaml|grep service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id若这两个重要annotation缺失,则需进行设置。
负载均衡控制台地址:https://slb.console.aliyun.com/overview
比如目前集群使用的clb:k8s-pops-ingress-slb

# 修改集群ingress nginx svc命令# 集群clb名称:k8s-pops-ingress-slb# 集群clb id:lb-bp1tt6vxctuzi38mqfkw0kubectl edit svc/nginx-ingress-lb -n kube-system3.8.4 访问地址
查看浏览器访问地址:
# 进入工作目录cd ~/bkce7.1-install/blueking/
# 从自定义配置中提取BK_DOMAIN=$(yq e '.domain.bkDomain' environments/default/custom.yaml)
# 普通登录地址(接入统一登录,且登录成功后会跳转蓝盾)echo "http://$BK_DOMAIN"
# admin登录地址(接入统一登录后,可通过此方法适用admin登录)echo "http://${BK_DOMAIN}/login/origin/"
# 一般结果为:https://bk.hua-ri.net/login/origin/
# 查看用户密码(预设原始密码):kubectl get cm -n blueking bk-user-api-general-envs -o go-template='user={{.data.INITIAL_ADMIN_USERNAME}}{{"\n"}}password={{ .data.INITIAL_ADMIN_PASSWORD }}{{"\n"}}'3.9 对接Ldap服务
在用户中心里配置Ldap相关配置,然后更新 bk-user-api-web 服务的镜像。


4. 部署蓝盾
参考官方文档部署,配置 custom values 的内容提前修改完成,执行类似部署基础服务的以下命令:
# 进入工作目录cd ~/bkce7.1-install/blueking/
# 部署helmfile -f 03-bkci.yaml.gotmpl sync
# 更新helmfile -f 03-bkci.yaml.gotmpl apply剩下的步骤参考官方文档执行即可,主要步骤有以下三个,其他的步骤可以不做。
4.1 [可选]注册默认构建镜像
我们提供了 bkci/ci 镜像用于提供构建环境。为了加速镜像下载过程,可以修改镜像地址为 hub.bktencent.com/bkci/ci,或者为你自己托管的内网 registry。
先检查数据库有没有历史数据:
kubectl exec -it -n blueking bk-ci-mysql-0 -- /bin/bash -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -u root -e "USE devops_ci_store; SELECT IMAGE_NAME,IMAGE_CODE,IMAGE_REPO_NAME FROM T_IMAGE WHERE IMAGE_CODE = \"bkci\" ;"'请根据结果进行操作:
- 如果有显示镜像数据,可以修改镜像地址为蓝鲸国内仓库,也可改为你已经缓存在内网的镜像:
kubectl exec -it -n blueking bk-ci-mysql-0 -- /bin/bash -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -u root -e "USE devops_ci_store; UPDATE T_IMAGE SET IMAGE_REPO_NAME=\"hub.bktencent.com/bkci/ci\" WHERE IMAGE_CODE = \"bkci\" ;"'- 然后重新查询数据库,可以看到
IMAGE_REPO_NAME列已经更新。 - 如果没有镜像,可以新增:
kubectl exec -n blueking deploy/bk-ci-bk-ci-store -- \curl -vs http://bk-ci-bk-ci-store.blueking.svc.cluster.local/api/op/market/image/init -X POST \-H 'X-DEVOPS-UID: admin' -H 'Content-type: application/json' -d '{"imageCode":"bkci","imageName":"bkci","imageRepo":"hub.bktencent.com/bkci/ci","projectCode":"demo","userId":"admin"}' | jq .
- 提示
- 当你单独卸载蓝盾重装后,可能出现查询镜像为空,但是新增镜像时报错 { status: 400, message: “权限中心创建项目失败” } 的情况。
- 这是因为权限中心存在蓝盾 demo 项目的数据所致,我们后续会优化蓝盾单独卸载的文档。请先手动新建项目,并修改上述代码中 projectCode 字段的值。
4.2 [可跳过]对接制品库
蓝盾依靠蓝鲸制品库来提供流水线仓库和自定义仓库,需要调整制品库的认证模式。
当 bk-ci release 成功启动后,我们开始配置蓝鲸制品库,并注册到蓝盾中。
4.2.1 修改 bk-repo custom values
相关配置已经放在gitlab仓库上维护,可以直接跳过本步骤。
[可跳过]请在 中控机 执行:
# 进入工作目录cd ~/bkce7.1-install/blueking/
case $(yq e '.auth.config.realm' environments/default/bkrepo-custom-values.yaml.gotmpl 2>/dev/null) in null|"") tee -a environments/default/bkrepo-custom-values.yaml.gotmpl <<< $'auth:\n config:\n realm: devops' ;; devops) echo "environments/default/bkrepo-custom-values.yaml.gotmpl 中配置了 .auth.config.realm=devops, 无需修改." ;; *) echo "environments/default/bkrepo-custom-values.yaml.gotmpl 中配置了 .auth.config.realm 为其他值, 请手动修改值为 devops." ;;esac[可跳过]修改成功后,继续在工作目录执行如下命令使修改生效:
helmfile -f base-blueking.yaml.gotmpl -l name=bk-repo apply4.2.2 检查配置是否生效
检查 release 生效的 values 和 configmap 是否重新渲染。
[可跳过]请在 中控机 执行:
helm get values -n blueking bk-repo | yq e '.auth.config.realm'kubectl get cm -n blueking bk-repo-bkrepo-auth -o json | jq -r '.data."application.yml"' | yq e '.auth.realm' -4.2.3 重启 bk-repo auth 微服务
因为对接制品库的相关信息已经在gitlab仓库上维护了,所以此处不用进行重启。
[可跳过]因为 deployment 没有变动,所以不会自动重启,此处需要单独重启:
kubectl rollout restart deployment -n blueking bk-repo-bkrepo-auth4.2.4 在蓝盾中注册制品库
[可跳过]请在 中控机 执行:
# 进入工作目录cd ~/bkce7.1-install/blueking/
# 从自定义配置中提取, 也可自行赋值BK_DOMAIN=$(yq e '.domain.bkDomain' environments/default/custom.yaml)
# 向project微服务注册制品库kubectl exec -i -n blueking deploy/bk-ci-bk-ci-project -- curl -sS -X PUT -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'X-DEVOPS-UID: admin' -d "{\"showProjectList\":true,\"showNav\":true,\"status\":\"ok\",\"deleted\":false,\"iframeUrl\":\"//bkrepo.$BK_DOMAIN/ui/\"}" "http://bk-ci-bk-ci-project.blueking.svc.cluster.local/api/op/services/update/Repo"4.3 [可选]下载和上传插件
4.3.1 下载插件
请在 中控机 执行:
bkdl-7.1-stable.sh -ur latest ci-plugins4.3.2 上传插件
此操作只能新建插件,每个插件只能上传一次。
# 进入工作目录cd ~/bkce7.1-install/blueking/
for f in ../ci-plugins/*.zip; do atom="${f##*/}" atom=${atom%.zip} echo >&2 "upload $atom from $f" kubectl exec -i -n blueking deploy/bk-ci-bk-ci-store -- \ curl -s \ http://bk-ci-bk-ci-store.blueking.svc.cluster.local/api/op/pipeline/atom/deploy/"?publisher=admin" \ -H 'X-DEVOPS-UID: admin' -F atomCode=$atom -F file=@- < "$f" | jq . # 设置为默认插件,全部项目可见。 kubectl exec -n blueking deploy/bk-ci-bk-ci-store -- \ curl -s http://bk-ci-bk-ci-store.blueking.svc.cluster.local/api/op/pipeline/atom/default/atomCodes/$atom \-H 'X-DEVOPS-UID: admin' -X POST | jq .done4.3.3 问题及解决方案
这个问题已经在蓝盾的helm charts里面进行了优化
上传插件时会碰到这个问题:

蓝盾官方文档说法是:

实际原因是:HTTP请求报了 413 Request Entity Too Large
具体解决方式详见:Ingress 域名方式导致413 Request Entity Too Large-阿里云开发者社区
造成这个问题的主要原因是nginx-ingress的默认配置中proxy-body-size的数值太小

5. 支持https
如果开始就准备好了相关证书,那么可以将该步骤提前,在部署基础服务和蓝盾之前就先修改好相关的yaml,将需要创建的Secret和要更新的Ingress配置都提前修改好,然后直接部署即可。
5.1 购买相关证书
涉及的域名:bk.hua-ri.cn、*.bk.hua-ri.cn(如devops.bk.hua-ri.cn)。
需购买泛域名证书。
5.2 创建相关Secret(用于存储TLS证书和私钥)
# 创建SecretBK_DOMAIN=$(yq e '.domain.bkDomain' environments/default/custom.yaml)
cd $HOME/$BK_DOMAIN
kubectl create secret tls $BK_DOMAIN -n blueking --cert=$HOME/$BK_DOMAIN/$BK_DOMAIN.pem --key=$HOME/$BK_DOMAIN/$BK_DOMAIN.key5.3 更新 Ingress TLS
在证书及证书secret准备好之后,需要变更蓝鲸系列ingress开启tls的支持,执行对应的脚本
#!/bin/bash
# 配置变量NAMESPACE="blueking"DOMAIN_FILE="environments/default/custom.yaml"BK_DOMAIN=$(yq e '.domain.bkDomain' "$DOMAIN_FILE") # 从配置文件中读取域名TLS_HOST="*.$BK_DOMAIN" # 泛域名TLS_SECRET="$BK_DOMAIN" # Secret 名称与域名一致
# 检查域名和 Secret 是否正确if [[ -z "$BK_DOMAIN" ]]; then echo "Error: BK_DOMAIN is not set in $DOMAIN_FILE." exit 1fi
# 获取命名空间中的所有 Ingress 资源ingresses=$(kubectl get ingress -n "$NAMESPACE" -o jsonpath='{.items[*].metadata.name}')
# 遍历所有 Ingress 资源并更新 TLS 配置for ingress in $ingresses; do echo "Updating Ingress: $ingress in namespace: $NAMESPACE"
# 检查 Ingress 是否已存在 TLS 配置 if kubectl get ingress "$ingress" -n "$NAMESPACE" -o jsonpath='{.spec.tls}' | grep -q "$TLS_HOST"; then echo "TLS configuration for $TLS_HOST already exists in Ingress $ingress. Skipping." continue fi
# 更新 Ingress 的 TLS 配置 kubectl patch ingress "$ingress" -n "$NAMESPACE" --type=json -p='[ { "op": "add", "path": "/spec/tls", "value": [ { "hosts": ["'"$TLS_HOST"'"], "secretName": "'"$TLS_SECRET"'" } ] } ]' || { echo "Failed to update Ingress $ingress"; exit 1; }
echo "Updated Ingress $ingress with TLS configuration for $TLS_HOST."done
echo "All Ingress resources in namespace $NAMESPACE have been updated with TLS configuration for $TLS_HOST."5.4 配置蓝鲸启用HTTPS
在git仓库维护,主要有两个变更:
- environments/default/custom.yaml: .bkDomainScheme 值设置为 https
- environments/default/bkci/bkci-custom-values.yaml.gotmpl: .config.bkHttpSchema 值设置为 https
yq -i '.bkDomainScheme = "https"' environments/default/custom.yaml
# 将bkHttpSchema: https替换为bkHttpSchema: httpsed -i 's|bkHttpSchema: http|bkHttpSchema: https|' environments/default/bkci/bkci-custom-values.yaml.gotmpl重启服务使https配置生效
# 重启第一批服务helmfile -f base-blueking.yaml.gotmpl -l seq=first sync
# bk-apigateway 部分 pod 不会重启,主动删除等重建kubectl delete pod -n blueking -l 'app.kubernetes.io/instance=bk-apigateway,app.kubernetes.io/component in (api-support-fe, dashboard-fe)'
# 等待 bk-apigateway 全部 pod 重启成功后进行下一步kubectl get pod -n blueking -l 'app.kubernetes.io/instance=bk-apigateway,app.kubernetes.io/component in (api-support-fe, dashboard-fe)'
# bkrepo 部分 pod 不会重启,主动删除等重建kubectl delete pod -n blueking -l 'app.kubernetes.io/instance=bk-repo,bk.repo.scope=backend'
# 等待 bkrepo 全部 pod 重启成功后进行下一步# 这里一定要等所有pod重启成功后,才开始下一步,否则会导致服务异常# repo系列服务会因为阿里云EKS csi插件问题,导致服务卡住,需要手动删除卡在ContainerCreating的pod,让pod重启watch -n 1 kubectl get pod -n blueking -l 'app.kubernetes.io/instance=bk-repo,bk.repo.scope=backend'
# 重启第二批服务helmfile -f base-blueking.yaml.gotmpl -l seq=second sync# 持续观察等 bk-repo-repository pod 全部Readywatch -n 1 kubectl get pod -n blueking -l 'app.kubernetes.io/instance=bk-repo,app.kubernetes.io/component=repository'
# 重启第三批服务helmfile -f base-blueking.yaml.gotmpl -l seq=third sync # bk-paas-webfe-web pod 不会重启,主动删除等重建kubectl delete pod -n blueking -l 'app.kubernetes.io/instance=bk-paas,app.kubernetes.io/name=webfe'
# 重启蓝盾服务helmfile -f 03-bkci.yaml.gotmpl sync# 这里蓝盾系列服务可能不会重启,需要手动删除老podkubectl get pods -n blueking --field-selector=status.phase=Running| grep 'bk-ci-bk-ci' |awk '{print $1}' | xargs kubectl delete pod -n blueking5.5 构建机Agent配置变更及重启
# 停止agent服务./stop.sh
BK_DOMAIN="deveops.bk.blazehu.com"
# 修改.agent.properties文件,开启httpssed -i '' 's|http://$BK_DOMAIN|https://$BK_DOMAIN|g' .agent.properties# 修改telegraf.conf文件,开启httpssed -i '' 's|http://$BK_DOMAIN|https://$BK_DOMAIN|g' telegraf.conf
# 启动agent./start.sh# 这里需要注意,仔细查看.agent.properties里devops.agent.user, 这里是哪个用户就用哪个用户启动agent6 参考
部分信息可能已经过时









