蓝鲸持续集成平台(蓝盾)是一个免费并开源的 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 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 IP1=$(kubectl get svc -A -l app=nginx-ingress-lb -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=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
3.8 访问蓝鲸桌面 在负载均衡器配置后端为 ingress-nginx pod 所在机器的内网 IP,端口为 80。详细信息参考文档 。
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
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证书和私钥) 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 " if [[ -z "$BK_DOMAIN " ]]; then echo "Error: BK_DOMAIN is not set in $DOMAIN_FILE ." exit 1 fi ingresses=$(kubectl get ingress -n "$NAMESPACE " -o jsonpath='{.items[*].metadata.name}' ) for ingress in $ingresses ; do echo "Updating Ingress: $ingress in namespace: $NAMESPACE " 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 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 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 kubectl delete pod -n blueking -l 'app.kubernetes.io/instance=bk-apigateway,app.kubernetes.io/component in (api-support-fe, dashboard-fe)' kubectl get pod -n blueking -l 'app.kubernetes.io/instance=bk-apigateway,app.kubernetes.io/component in (api-support-fe, dashboard-fe)' kubectl delete pod -n blueking -l 'app.kubernetes.io/instance=bk-repo,bk.repo.scope=backend' 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 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 kubectl delete pod -n blueking -l 'app.kubernetes.io/instance=bk-paas,app.kubernetes.io/name=webfe' helmfile -f 03-bkci.yaml.gotmpl sync 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配置变更及重启 ./stop.sh BK_DOMAIN="deveops.bk.blazehu.com" sed -i '' 's|http://$BK_DOMAIN|https://$BK_DOMAIN|g' .agent.properties sed -i '' 's|http://$BK_DOMAIN|https://$BK_DOMAIN|g' telegraf.conf ./start.sh
参考