1. 概述 需要先准备一台中控机,在中控机安装 kubectl、helm、helmfile 等工具,以及蓝鲸安装脚本。然后部署基础套餐,最后再部署持续集成套餐(蓝盾)。
简单来说就是三个步骤:
2. 准备中控机 按照官方文档 安装和配置即可。
3. 部署基础服务 需要按照官方文档 一步步部署。
3.1 下载安装文件 请在 中控机 使用下载脚本下载蓝鲸 helmfile 包及公共证书。( helmfile相关value文件在git上维护)
1 bkdl-7.1-stable.sh -ur latest base demo
这些文件默认放在了 ~/bkce7.1-install/ 目录。
3.2 配置 Helm Chart 仓库 1 2 3 helm repo add blueking https://hub.bktencent.com/chartrepo/blueking helm repo update helm repo list
3.3 配置全局 custom-values 相关文件已经修改,在git上维护,配置访问域名。
1 2 3 4 5 6 7 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
1 ./scripts/generate_app_secret.sh ./environments/default/app_secret.yaml
生成 apigw 所需的 keypair
1 ./scripts/generate_rsa_keypair.sh ./environments/default/bkapigateway_builtin_keypair.yaml
生成 paas 所需的 clusterAdmin
1 ./scripts/create_k8s_cluster_admin_for_paas3.sh
3.5 安装入口网关 3.5.1 安装 ingress controller 先检查你的环境是否已经部署了 ingress controller:
1 kubectl get pods -A -l app.kubernetes.io/name=ingress-nginx
如果没有,则使用如下命令创建:
1 2 helmfile -f 00-ingress-nginx.yaml.gotmpl sync kubectl get pods -A -l app.kubernetes.io/name=ingress-nginx 查看创建的pod
pops集群相关标签如下:
1 2 3 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
1 2 3 4 5 6 7 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 # 检查添加的记录。
确认注入结果,执行如下命令:
1 2 cd ~/bkce7.1-install/blueking/ 进入工作目录 ./scripts/control_coredns.sh list
参考输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 172.27.124.109 bkce.diezhi.net 172.27.124.109 bkrepo.bkce.diezhi.net 172.27.124.109 docker.bkce.diezhi.net 172.27.124.109 bkapi.bkce.diezhi.net 172.27.124.109 bkpaas.bkce.diezhi.net 172.27.124.109 bkiam-api.bkce.diezhi.net 172.27.124.109 bkiam.bkce.diezhi.net 172.27.124.109 apps.bkce.diezhi.net 172.27.124.109 bknodeman.bkce.diezhi.net 172.27.124.109 job.bkce.diezhi.net 172.27.124.109 jobapi.bkce.diezhi.net 172.27.124.109 devops.bkce.diezhi.net
3.6 部署或对接存储服务 3.6.1 部署蓝鲸预置的存储服务 参考官方文档 安装,相关helm配置已经放在gitlab仓库 上维护,可以直接简单执行以下命令:
1 helmfile -f base-storage.yaml.gotmpl sync
3.6.2 对接已有的存储服务 禁用蓝鲸内置服务,配置使用已有服务。helmfile 定义及 values 文件已经放在gitlab仓库上维护。
此处可直接跳过。
3.7 部署基础套餐 通过helmfile安装 base-blueking.yaml.gotmpl ,按照顺序依次安装。具体每层安装的内容可以查看文件内容。 参考官方文档 安装,相关helm配置已经放在gitlab仓库上维护,可以直接简单执行以下命令:
1 2 3 4 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.8.1 查找ingress nginx svc 找到ingress nginx的svc
1 2 3 4 5 # pops kubectl get svc -n kube-system|grep ingress # pops-dev kubectl get svc -n ingress-nginx|grep ingress
结果:
1 2 3 4 5 6 7 8 # pops ingress-nginx-controller-admission ClusterIP 172.26.10.30 <none> 443/TCP 3y69d nginx-ingress-lb LoadBalancer 172.26.1.155 10.212.14.158 80:30725/TCP,443:31357/TCP 3y69d # pops-dev ingress-nginx-controller NodePort 172.27.124.109 <none> 80:32080/TCP,443:32443/TCP 279d ingress-nginx-controller-admission ClusterIP 172.27.123.38 <none> 443/TCP 279d ingress-nginx-controller-metrics ClusterIP 172.27.116.175 <none> 10254/TCP 279d
这里nginx-ingress-lb
是目前pops集群
的ingress nginx svc
,而ingress-nginx-controller
是目前pops-dev集群
的ingress nginx svc
。
3.8.2 设置svc type为LoadBalancer 查看svc type:
1 2 3 4 5 # 查看pops集群ingress nginx svc命令 kubectl get svc/nginx-ingress-lb -n kube-system -oyaml|grep type # 查看pops-dev集群ingress nginx svc命令 kubectl get svc/ingress-nginx-controller -n ingress-nginx -oyaml|grep type
若无type: LoadBalancer
结果,则手动进行修改:
1 2 3 4 5 # 修改pops集群ingress nginx svc命令 kubectl edit svc/nginx-ingress-lb -n kube-system # 修改pops-dev集群ingress nginx svc命令 kubectl edit svc/ingress-nginx-controller -n ingress-nginx
3.8.3 负载均衡clb实例 查看svc yaml是否包含两个重要annotation:
1 2 3 4 5 6 7 # 查看pops集群ingress nginx svc命令 kubectl get svc/nginx-ingress-lb -n kube-system -oyaml|grep service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners kubectl get svc/nginx-ingress-lb -n kube-system -oyaml|grep service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id # 查看pops-dev集群ingress nginx svc命令 kubectl get svc/ingress-nginx-controller -n ingress-nginx -oyaml|grep service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners kubectl get svc/ingress-nginx-controller -n ingress-nginx -oyaml|grep service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id
若这两个重要annotation缺失,则需进行设置。
负载均衡控制台地址:https://slb.console.aliyun.com/overview
找到pops-dev
集群的clb:pops-k8s-dev-ingress
找到pops
集群的clb:k8s-pops-ingress-slb
1 2 3 4 5 6 7 8 9 # 修改pops集群ingress nginx svc命令 # pops集群clb名称:k8s-pops-ingress-slb # pops集群clb id :lb-bp1tt6vxctuzi38mqfkw0 kubectl edit svc/nginx-ingress-lb -n kube-system # 修改pops-dev集群ingress nginx svc命令 # pops-dev集群clb名称:pops-k8s-dev-ingress # pops-dev集群clb id :lb-bp1r1dsywnqktp1hxih38 kubectl edit svc/ingress-nginx-controller -n ingress-nginx
3.8.4 访问地址 查看浏览器访问地址:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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/" # 测试环境一般结果为:http://bkce.diezhi.net/login/origin/ # 生产环境一般结果为:https://bk.diezhi.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 的内容提前修改完成,执行类似部署基础服务的以下命令:
1 2 3 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。
1 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\" ;"'
请根据结果进行操作:
提示
当你单独卸载蓝盾重装后,可能出现查询镜像为空,但是新增镜像时报错 { status: 400, message: “权限中心创建项目失败” } 的情况。这是因为权限中心存在蓝盾 demo 项目的数据所致,我们后续会优化蓝盾单独卸载的文档。请先手动新建项目,并修改上述代码中 projectCode 字段的值。
4.1.1 解决权限中心创建项目失败 在 中控机 执行:
1 2 cd ~/bkce7.1-install/blueking/ # 进入工作目录 ./scripts/control_coredns.sh list # 检查添加的记录。
会得到类似的结果:
1 2 3 4 5 6 7 8 9 10 11 12 172.27.124.109 devops.bkce.diezhi.net 172.27.124.109 bkce.diezhi.net 172.27.124.109 bkrepo.bkce.diezhi.net 172.27.124.109 docker.bkce.diezhi.net 172.27.124.109 bkapi.bkce.diezhi.net 172.27.124.109 bkpaas.bkce.diezhi.net 172.27.124.109 bkiam-api.bkce.diezhi.net 172.27.124.109 bkiam.bkce.diezhi.net 172.27.124.109 apps.bkce.diezhi.net 172.27.124.109 bknodeman.bkce.diezhi.net 172.27.124.109 job.bkce.diezhi.net 172.27.124.109 jobapi.bkce.diezhi.net
使用admin账号通过浏览器访问devops.bkce.diezhi.net,并创建项目:
此时重新新增:
1 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":"huari-demo","userId":"admin"}' | jq .
如新建项目遇见可授权人员范围加载不出来(白屏转圈圈)
需要确定跳转从蓝鲸跳转蓝盾是否是走了https,本文档是使用http部署,所以使用https会出现问题
4.2 [可跳过]对接制品库 蓝盾依靠蓝鲸制品库来提供流水线仓库和自定义仓库,需要调整制品库的认证模式。
当 bk-ci
release 成功启动后,我们开始配置蓝鲸制品库,并注册到蓝盾中。
4.2.1 修改 bk-repo custom values 相关配置已经放在gitlab仓库上维护,可以直接跳过本步骤。
[可跳过]请在 中控机 执行:
1 2 3 4 5 6 7 8 9 10 11 12 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
[可跳过]修改成功后,继续在工作目录执行如下命令使修改生效:
1 helmfile -f base-blueking.yaml.gotmpl -l name=bk-repo apply
4.2.2 检查配置是否生效 检查 release 生效的 values 和 configmap 是否重新渲染。
[可跳过]请在 中控机 执行:
1 2 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 没有变动,所以不会自动重启,此处需要单独重启:
1 kubectl rollout restart deployment -n blueking bk-repo-bkrepo-auth
4.2.4 在蓝盾中注册制品库 [可跳过]请在 中控机 执行:
1 2 3 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 下载插件 请在 中控机 执行:
1 bkdl-7.1-stable.sh -ur latest ci-plugins
4.3.2 上传插件 此操作只能新建插件,每个插件只能上传一次。
1 2 3 4 5 6 7 8 9 10 11 12 13 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
4.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.blazehu.com、*.bk.blazehu.com(如devops.bk.blazehu.com)。需购买泛域名证书。
5.2 创建相关Secret(用于存储TLS证书和私钥) 1 2 3 4 5 6 7 # 创建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 ———————————————— 本文链接:https://blazehu.com/2024/05/24/devops/landun_install/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
5.3 更新 Ingress TLS 在证书及证书secret准备好之后,需要变更蓝鲸系列ingress开启tls的支持,执行对应的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 # !/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
1 2 3 4 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
5.5 构建机Agent配置变更及重启 1 2 3 4 5 6 7 8 9 10 11 12 13 # 停止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