1. 概述

需要先准备一台中控机,在中控机安装 kubectl、helm、helmfile 等工具,以及蓝鲸安装脚本。然后部署基础套餐,最后再部署持续集成套餐(蓝盾)。

简单来说就是三个步骤:

  • 1.准备环境
  • 2.部署基础服务
  • 3.部署蓝盾

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

img_11

找到pops集群的clb:k8s-pops-ingress-slb

img_13

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 服务的镜像。

img_22

img_23

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\" ;"'

请根据结果进行操作:

  • 如果有显示镜像数据,可以修改镜像地址为蓝鲸国内仓库,也可改为你已经缓存在内网的镜像:

    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; UPDATE  T_IMAGE SET IMAGE_REPO_NAME=\"hub.bktencent.com/bkci/ci\" WHERE IMAGE_CODE = \"bkci\" ;"'
  • 然后重新查询数据库,可以看到 IMAGE_REPO_NAME 列已经更新。

  • 如果没有镜像,可以新增:

    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":"demo","userId":"admin"}' | jq .
  • 提示
  • 当你单独卸载蓝盾重装后,可能出现查询镜像为空,但是新增镜像时报错 { 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,并创建项目:

img_15

img_16

img_17

此时重新新增:

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会出现问题

img_18

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里面进行了优化

上传插件时会碰到这个问题:

img_19

蓝盾官方文档说法是:

img_20

实际原因是:HTTP请求报了 413 Request Entity Too Large

具体解决方式详见:Ingress 域名方式导致413 Request Entity Too Large-阿里云开发者社区

造成这个问题的主要原因是nginx-ingress的默认配置中proxy-body-size的数值太小

img_21

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