蓝盾快速部署文档(v7.1)

蓝鲸持续集成平台(蓝盾)是一个免费并开源的 CI 服务。本文档旨在提供蓝鲸智云 7.1 版本蓝盾的快速部署指南。通过详细的步骤说明和脚本示例,帮助用户在 Kubernetes 集群上快速搭建蓝鲸基础服务和蓝盾平台,并实现 HTTPS 安全访问。

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 仓库

添加 charts 仓库

helm repo add blueking https://hub.bktencent.com/chartrepo/blueking
helm repo update
helm repo list

3.3 配置全局 custom-values

相关文件已经修改,在git上维护,配置访问域名。

BK_DOMAIN=bk.blazehu.com  # 请修改为你分配给蓝鲸平台的主域名 cd ~/bkce7.1-install/blueking/  # 进入工作目录# 可使用如下命令添加域名。如果文件已存在,请手动编辑。custom=environments/default/custom.yaml
cat >> "$custom" <<EOF
imageRegistry: ${REGISTRY:-hub.bktencent.com}
domain:
bkDomain: $BK_DOMAIN
bkMainSiteDomain: $BK_DOMAIN
EOF

3.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.sh

3.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
kubectl get pods -A -l app.kubernetes.io/name=ingress-nginx 查看创建的pod

pops集群相关标签如下:

kubectl get pods -A -l app=ingress-nginx  # 查看创建的pod
IP1=$(kubectl get svc -A -l app=nginx-ingress-lb -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
# IP1=$(kubectl get svc -A -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

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) # 从自定义配置中提取, 也可自行赋值
#IP1=$(kubectl get svc -A -l app.kubernetes.io/instance=ingress-nginx -o jsonpath='{.items[0].spec.clusterIP}')
IP1=$(kubectl get svc -A -l app=nginx-ingress-lb -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
./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
./scripts/control_coredns.sh update "$IP1" devops.$BK_DOMAIN
./scripts/control_coredns.sh list # 检查添加的记录。

确认注入结果,执行如下命令:

cd ~/bkce7.1-install/blueking/  进入工作目录
./scripts/control_coredns.sh list

参考输出如下:

10.241.0.9 bk.blazehu.com
10.241.0.9 apps.bk.blazehu.com
10.241.0.9 bkrepo.bk.blazehu.com
10.241.0.9 docker.bk.blazehu.com
10.241.0.9 bkapi.bk.blazehu.com
10.241.0.9 bkpaas.bk.blazehu.com
10.241.0.9 bkiam-api.bk.blazehu.com
10.241.0.9 bkiam.bk.blazehu.com
10.241.0.9 bcs.bk.blazehu.com
10.241.0.9 bknodeman.bk.blazehu.com
10.241.0.9 job.bk.blazehu.com
10.241.0.9 jobapi.bk.blazehu.com

3.6 部署或对接存储服务

3.6.1 部署蓝鲸预置的存储服务
参考官方文档安装,相关helm配置已经放在git上维护,可以直接简单执行以下命令:

helmfile -f base-storage.yaml.gotmpl sync

注意:我当前使用阿里云盘,使用该存储类创建的存储盘最小容量为20Gi,目前git上已经都修改为20Gi.

3.6.2 对接已有的存储服务
禁用蓝鲸内置服务,配置使用已有服务。请参考helmfile定义及values文件自行研究。参考官方文档的例子

3.7 部署基础套餐

通过helmfile安装 base-blueking.yaml.gotmpl ,按照顺序依次安装。具体每层安装的内容可以查看文件内容。

helmfile -f base-blueking.yaml.gotmpl -l seq=first sync
helmfile -f base-blueking.yaml.gotmpl -l seq=second sync
helmfile -f base-blueking.yaml.gotmpl -l seq=third sync
#helmfile -f base-blueking.yaml.gotmpl -l seq=fourth sync

3.8 访问蓝鲸桌面

在负载均衡器配置后端为 ingress-nginx pod 所在机器的内网 IP,端口为 80。详细信息参考文档

3.9 对接Ldap服务

在用户中心里配置Ldap相关配置,然后更新 bk-user-api-web 服务的镜像。
alt text
alt text

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

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 apply

4.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' -

预期 2 条命令均显示 devops。如果任意配置没有生效,请检查上述 helmfile 命令的输出是否正常。

4.2.3 重启 bk-repo auth 微服务
因为 deployment 没有变动,所以不会自动重启,此处需要单独重启:

kubectl rollout restart deployment -n blueking bk-repo-bkrepo-auth

4.2.4 在蓝盾中注册制品库
请在 中控机 执行:

cd ~/bkce7.1-install/blueking/ 
BK_DOMAIN=$(yq e '.domain.bkDomain' environments/default/custom.yaml)
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-plugins

4.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 .
done

注意事项

  • 插件重复上传:如果重复执行会报错:{“status”: 2100001, “message”: “系统内部繁忙,请稍后再试”}。后续更新插件,请访问蓝盾研发商店的工作台界面,在列表中找到对应插件进行“升级”操作。
  • 插件包体过大:上传或者更新插件报错:”413 Request Entity Too Large”。原因是nginx-ingress的默认配置中proxy-body-size的数值太小,具体解决方式详见:Ingress 域名方式导致413 Request Entity Too Large-阿里云开发者社区

5. TLS配置

如果开始就准备好了相关证书,那么可以将该步骤提前,在部署基础服务和蓝盾之前就先修改好相关的yaml,将需要创建的Secret和要更新的Ingress配置都提前修改好,然后直接部署即可。

5.1 购买相关证书

涉及的域名:bk.blazehu.com、*.bk.blazehu.com(如devops.bk.blazehu.com)。需购买泛域名证书。

5.2 创建相关Secret(用于存储TLS证书和私钥)

# 创建Secret
BK_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.key

5.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 1
fi

# 获取命名空间中的所有 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: http
sed -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 全部Ready
watch -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
# 这里蓝盾系列服务可能不会重启,需要手动删除老pod
kubectl get pods -n blueking --field-selector=status.phase=Running| grep 'bk-ci-bk-ci' |awk '{print $1}' | xargs kubectl delete pod -n blueking

5.5 构建机Agent配置变更及重启

# 停止agent服务
./stop.sh

BK_DOMAIN="deveops.bk.blazehu.com"

# 修改.agent.properties文件,开启https
sed -i '' 's|http://$BK_DOMAIN|https://$BK_DOMAIN|g' .agent.properties
# 修改telegraf.conf文件,开启https
sed -i '' 's|http://$BK_DOMAIN|https://$BK_DOMAIN|g' telegraf.conf

# 启动agent
./start.sh
# 这里需要注意,仔细查看.agent.properties里devops.agent.user, 这里是哪个用户就用哪个用户启动agent

参考