已开启
docs(bke): add installation and operations guide #212
docs(bke): add installation and operations guide #212
已开启
zhangzq1011创建于 8月6日
57 个文件变更+5451-0
@@ -0,0 +1,37 @@
1+# BKE 安装部署与运维手册
2+ 
3+> 本手册由 BKE 历史资料整理而来,部分命令、组件版本和部署方式可能与当前 openFuyao 版本存在差异,请结合实际版本使用。
4+ 
5+ 
6+ 
7+> Cluster API 是 Kubernetes的一个子项目,专注于提供声明式API和工具来简化配置,实现创建、升级、管理多个Kubernetes集群。
8+>
9+> Cluster API项目是由 Kubernetes Special Interest Group (SIG) Cluster Lifecycle 发起,使用Kubernetes 风格的API和模式为平台运营商提供自动化集群生命周期管理。支持基础设施(如虚拟机、网络、负载均衡和VPC)以及Kubernetes的定义方式与应用程序开发人员部署和管理工作负载的方式相同。可以在各种基础设施环境中实现一致可重复的集群部署。
10+ 
11+Cluster API 是一款声明式的Kubernetes集群管理工具,其由多个组件构成。公有云厂商实现了自己的cluster-api-provider来支持通过cluster-api拉起公有云虚拟机以及构建Kubernetes集群。
12+ 
13+cluster-api-bke项目同样是Cluster API项目的一个provider,它管理的对象是裸机;即在私有云情况下,客户提供了数台服务器Cluster API + cluster-api-bke实现这些服务器Kubernetes的搭建、扩缩容等操作
14+ 
15+ 
16+ 
17+## KONK
18+ 
19+KONK是一系列工具的集合,目前包含bke 、cluster-api-bke、bkeagent、bocoperator、manifests,它们共同协作完成服务器从裸机到可治理的Kubernetes的转变
20+ 
21+bke:二进制工具,能启动集群部署、各种服务部署、镜像迁移等功能,属于KONK的起点
22+ 
23+cluster-api-bke: Cluster API 的裸机管理k8s的provider,当然我们为他额外了添加了更多的K8s生态组件部署功能
24+ 
25+bkeagent:运行在各个节点的二进制文件,托管于systemd,负责监听kube-apiserver crd资源从而操作宿主机,可称为云原生的宿主机管理工具
26+ 
27+bocoperator:负责boc产品的部署,通过监听k8s crd资源来触发boc组件的部署
28+ 
29+manifests:按照一定的规范整合yaml资源,包含k8s生态组件、boc部署组件
30+ 
31+ 
32+ 
33+## 架构图
34+ 
35+ 
36+ 
37+![](res/bke-architecture.png)
@@ -0,0 +1,69 @@
1+# BKE 安装部署与运维手册
2+ 
3+* [前言](README.md)
4+ 
5+#### 主机预检
6+ 
7+- 1.1 [使用](content/c1precheck/c1use.md)
8+- 1.2 [配置及场景](content/c1precheck/c2config.md)
9+- 1.3 [与boc集成](content/c1precheck/c3controller.md)
10+- 1.4 [检查条目](content/c1precheck/c4task.md)
11+ 
12+#### 集群安装
13+ 
14+- 2.1 [资源要求](content/c2installation/c1environment.md)
15+- 2.2 [开放端口](content/c2installation/c1openport.md)
16+- 2.3 [安装](content/c2installation/c2installation.md)
17+- 2.4 [配置文件详解](content/c2installation/c3configurations.md)
18+- 2.5 [配置文件扩展](content/c2installation/c4configaddon.md)
19+- 2.6 [配置文件示例](content/c2installation/c5allconfigurations.md)
20+- 2.7 [集群检查](content/c2installation/c6clustercheck.md)
21+- 2.8 [支持矩阵](content/c2installation/c7supportmatrix.md)
22+ 
23+#### 集群管理
24+ 
25+- 3.1 [管理集群](content/c3kubernetes/c1cluster.md)
26+- 3.2 [纳管集群](content/c3kubernetes/c2cluster.md)
27+- 3.3 [健康集群维护注意事项](content/c3kubernetes/c3healthycluster.md)
28+ 
29+#### 制作部署包
30+ 
31+- 4.1 [制作部署资源模板](content/c4prepare/c1manifests.md)
32+- 4.2 [制作部署依赖](content/c4prepare/c2depend.md)
33+- 4.3 [构建部署包](content/c4prepare/c4bkebuild.md)
34+- 4.4 [制作扩展rpm源](content/c4prepare/c4extendedrpm.md)
35+- 4.5 [构建增量包](content/c4prepare/c5bkebuildpatch.md)
36+- 4.6 [制作在线依赖镜像](content/c4prepare/c5onlineimage.md)
37+- 4.7 [配置文件示例](content/c4prepare/c6config.md)
38+- 4.8 [额外k8s版本支持](content/c4prepare/c7k8ssupport.md)
39+ 
40+#### bocoperator
41+- 5.2 [部署](content/c5operator/c1deploy.md)
42+- 5.3 [部署资源制作](content/c5operator/c2manifest.md)
43+ 
44+#### 场景演示
45+ 
46+- 6.1 [部署概要流程](content/c6scenario/c0deployprocess.md)
47+- 6.2 [部署包制作](content/c6scenario/c1build.md)
48+- 6.3 [初始化引导节点](content/c6scenario/c2bkeinit.md)
49+- 6.4 [部署管理集群](content/c6scenario/c3createcluster.md)
50+- 6.5 [主机IP变更后恢复集群](content/c6scenario/c4clusterrecovery.md)
51+ 
52+#### 技术细节
53+ 
54+- 7.1 [引导节点](content/c7technical/c1bootstrap.md)
55+- 7.2 [新业务集群部署](content/c7technical/c4deploybussiness.md)
56+- 7.3 [老业务集群纳管](content/c7technical/c5nanotube.md)
57+- 7.4 [BKEAgent启动器](content/c7technical/c6agentlauncher.md)
58+ 
59+#### 测试
60+ 
61+- 8.1 [自动测试](content/c8autotest/c1autotest.md)
62+ 
63+#### 路线图
64+ 
65+- 9.1 [路线图](content/c9roadmap/c1roadmap.md)
66+ 
67+#### 常见问题
68+ 
69+- [常见问题](content/FAQ/faq.md)
@@ -0,0 +1,203 @@
1+### 常见问题
2+ 
3+1. Kubernetes证书有效期 ?
4+ 
5+ 目前部署的kubernetes证书有效期为一百年。
6+ 
7+2. 如何获取集群的证书,token, kubeconfig等信息?
8+ 
9+ 以如下bkeCluster为例,所创建出来的集群相关证书等内容在管理集群 命名空间xxx下,以secret形式保存,具体见下图。
10+ 
11+ ```yaml
12+ apiVersion: bke.bocloud.com/v1beta1
13+ kind: BKECluster
14+ metadata:
15+ name: zzz
16+ namespace: bke-xxx
17+ ```
18+ 
19+ 证书命名规则为 "集群名称-证书名称"
20+ 
21+ ![image-20230418113334093](../../res/faq-secrets.png)
22+ 
23+3. 配置文件扩展章节的adonn是否都能部署?
24+ 
25+ 支持部署,前置条件是使用的镜像仓库里有对应的镜像,才能确保addon能成功部署并运行。
26+ 
27+4. konk部署的addon与手动部署的addon功能上有误吗?
28+ 
29+ 没有区别,konk只是将手动提交yaml的过程转换为了使用代码自动提交。实际功能与相关addon镜像及addon版本有关
30+ 
31+5. 已经开始部署了,但有一个addon忘记填写了,还能修改吗?
32+ 
33+ 可以,在EnsureAddonDeploy阶段之前或之后进行修改都能生效并触发部署,但需要注意填写的addon是否对其他addon具有依赖性
34+ 
35+6. 引导节点iptables 不能是nftables版本
36+ 
37+ 目前bke会在部署时候将iptables(nf_tables)转换为老的版本iptables,若出现无法转换成功请自主转换
38+ 
39+7. 我想要部署后的master用作worker节点该如何设置?
40+ 
41+ 正常情况下 master节点的角色定义如下,注意role字段
42+ 
43+ ```yaml
44+ - role:
45+ - master
46+ - etcd
47+ ip: x.x.x.x
48+ port: "xx"
49+ username: xxx
50+ password: <ssh-password>
51+ hostname: xxx
52+ ```
53+ 
54+ 对于问题描述情况将master这一角色替换为 master/node即可
55+ 
56+ ```yaml
57+ - role:
58+ - master/node # !!!
59+ - etcd
60+ ip: x.x.x.x
61+ port: "xx"
62+ username: xxx
63+ password: <ssh-password>
64+ hostname: xxx
65+ ```
66+ 
67+ 注意以下为错误实例,填写时请避免
68+ 
69+ ```yaml
70+ - role:
71+ - master
72+ - node # 不能分开写!!!
73+ - etcd
74+ ip: x.x.x.x
75+ port: "xx"
76+ username: xxx
77+ password: <ssh-password>
78+ hostname: xxx
79+ ```
80+ 
81+8. 删除BKECluster或删除BKECluster中节点时对实际机器做了什么?
82+ 
83+ BKECluster是一个实际的集群在管理集群中的CR映射,无其他特殊说明或特殊配置任何对BKECluster的操作都将作用到实际的集群之上
84+ 
85+ - 删除BKECluster,也代表将对应的集群进行删除,BKE控制程序会对该集群做删除处理并对所在节点做清理,包含以下内容
86+ 
87+ 1. 容器清理
88+ 
89+ - docker运行时,删除所有命名以"k8s_"开头的容器
90+ - containerd运行时,删除k8s.io命名空间下的所有容器
91+ 
92+ 2. kubelet清理
93+ 
94+ 在BKE中kubelet以容器的方式运行并且数据目录(详见配置文件详解中kubelet章节)会挂载到主机,清理主要是对该目录进行清理,以及kubelet容器本身
95+ 
96+ - umount kubelet目录,所有k8s容器有关的挂载都会在该目录下的pods子目录进行挂载,移除kubelet数据文件夹前会先进行umount操作
97+ 
98+ ```sh
99+ #参考 umount 脚本 /var/lib/kubelet对应实际的配置目录,此处仅做示例
100+ for m in $(sudo tac /proc/mounts | sudo awk '{print $2}'|sudo grep /var/lib/kubelet);do sudo umount $m||true; done
101+ ```
102+ 
103+ - kubelet容器删除
104+ 
105+ - kubelet数据文件夹删除
106+ 
107+ - 容器挂载目录删除,其中CNI相关的目录在运行时为containerd的情况下不会删除
108+ 
109+ ```go
110+ RunKubeletPreCreateDirs = []string{
111+ "/var/lib/calico",
112+ "/var/lib/lxc",
113+ "/opt/fabric",
114+ "/opt/cni",
115+ "/usr/libexec/kubernetes",
116+ "/var/lib/cni",
117+ "/var/lib/etcd",
118+ "/var/log/pods",
119+ "/var/log/containers",
120+ "/etc/cni",
121+ "/etc/kubernetes",
122+ }
123+ ```
124+ 
125+ 3. 证书删除
126+ 
127+ 对配置的证书目录(详见配置文件详解中certificatesDir字段解释)进行删除
128+ 
129+ 4. 静态pod yaml存放目录删除
130+ 
131+ 对配置的证书目录(详见配置文件详解中kubelet章节)进行删除
132+ 
133+ 5. 其他清理(部署中创建的文件或文件夹)
134+ 
135+ - kubectl (/usr/bin/kubectl)
136+ 
137+ - iptables 清理
138+ 
139+ ```shell
140+ iptables -F -t raw && iptables -F -t filter && iptables -t nat -F && iptables -t mangle -F && iptables -X -t nat && iptables -X -t raw && iptables -X -t mangle && iptables -X -t filter
141+ ```
142+
143+ - 路由条目清理
144+ 
145+ 核心路由表(移除 boc0和cali开头的路由)
146+ 
147+ ```sh
148+ ip route show all | awk '($1!="default" && $3~/^(boc0|cali.*)$/) {printf "%s %s %s\n",$1,$2,$3}'
149+ ```
150+
151+ 邻居表(移除 boc0和cali开头的路由)
152+ 
153+ ```sh
154+ ip neigh show all | awk '($3~/^(boc0|cali.*)$/) {print}' | awk '$4 == "lladdr" || $4 == "FAILED" {printf "%s %s %s\n",$1,$2,$3}'
155+ ```
156+
157+ - /etc/kubernetes/ 目录
158+ 
159+ 6. 容器运行时删除
160+ 
161+ 容器运行时的删除在BKECluster中通过` bke.bocloud.com/deep-restore-node` annotation控制(详见配置文件详解中annotation部分)
162+ 
163+ - 运行时清理
164+ 
165+ docker
166+ 
167+ ```sh
168+ #删除所有容器
169+ docker ps -a -q | awk '{print $1}' | xargs docker rm -f --volumes
170+ #删除所有数据
171+ docker system prune -a -f --volumes
172+ #停止docker
173+ systemctl stop docker && systemctl disable docker
174+ #卸载docker
175+ yum remove -y docker* containerd.io
176+ ```
177+
178+ containerd
179+ 
180+ ```sh
181+ #删除所有容器
182+ crictl pods -q | awk '{print $1}' | xargs crictl rmp -f
183+ nerdctl ps -a -q | awk '{print $1}' | xargs nerdctl rm -f --volumes
184+ #停止containerd
185+ systemctl stop containerd && systemctl disable containerd
186+ #卸载containerd
187+ rm -rf /usr/bin/containerd /usr/bin/containerd-shim /usr/bin/containerd-shim-runc-v1 /usr/bin/containerd-shim-runc-v2 /usr/bin/crictl /etc/crictl.yaml /usr/bin/ctr /usr/bin/nerdctl /usr/bin/containerd-stress /usr/lib/systemd/system/containerd.service usr/local/sbin/runc /usr/local/beyondvm /etc/containerd/
188+ ```
189+
190+ - 数据目录删除
191+ 
192+ docker默认`/var/lib/docker`,containerd对应`/var/lib/containerd`以实际配置为准(详见配置文件详解中containerRuntime部分)
193+ 
194+ - CNI目录清理
195+ 
196+ `/var/lib/cni` ,`/etc/cni`,` /opt/cni`
197+ 
198+ - 删除BKECluster中节点
199+
200+ 1. 从管理集群中缩容MachineDeployment副本数->触发machine资源删除->触发bkeMachine删除->做节点清理(参考BKECluster删除清理内容)
201+ 2. 从目标集群中删除该节点对应node资源
202+
203+ 注:如果是HA高可用集群且删除的是master节点,还会动态修改现有未删除master节点上的HA配置(haproxy keepalived)
@@ -0,0 +1,30 @@
1+### 预检项目
2+ 
3+#### 背景
4+ 
5+- 在boc多年的客户现场支持过程中,我们发现很多问题在部署之初就存在的,在后续使用过程中问题渐渐暴露出来。这导致我们需要花费大量的精力去修复问题、去和客户做解释说明,这大大增加了我们的工作量、以及降低了客户对我们公司产品的信任。
6+- 所以我们需要有在部署前对部署集群做资源检查的能力,这样能大大减少我们交付人员现场的交付压力以及降低在后续出现重大问题的可能性。
7+ 
8+#### 介绍
9+ 
10+- 该项目用途一,在boc产品部署之前,对客户提供的机器进行检查
11+- 该项目用途二,在boc产品部署完成后,要部署业务集群时,对业务集群进行检查
12+- 针对以上两个用途,预检项目将分别提供二进制文件用于裸机检查、CRD文件用于BOC对接检查
13+ 
14+#### 使用方法
15+ 
16+1. 准备要检查的机器的配置文件`config.yaml`
17+2. 在任意节点执行检查命令
18+ 
19+```shell
20+$ cd /tmp/v1
21+$ ./bc_amd64 run -f config.yaml
22+```
23+ 
24+3. 执行完成后会在当前目录下生成`report.html`报告文件
25+4. 执行命令`./bc_amd64 report`可启动一个`8080`端口的http服务,通过浏览器打开即可查看报告
26+ 
27+```shell
28+$ ./bc_amd64 report
29+2023/05/26 11:35:22 启动httpServer 0.0.0.0:8080...
30+```
@@ -0,0 +1,227 @@
1+### 配置文件与使用场景
2+ 
3+#### 配置
4+ 
5+1. 使用`./bc_amd64 config` 指令生成示例配置
6+ 
7+```shell
8+$ ./bc_amd64 config
9+当前目录下生成配置文件config.yaml
10+$ cat config.yaml
11+ 
12+hosts:
13+ - ip: 192.168.1.120
14+ username: root
15+ password: "<ssh-password>"
16+ port: "22"
17+ role:
18+ - bootstrap
19+ - ip: 192.168.1.121
20+ username: root
21+ password: "<ssh-password>"
22+ port: "22"
23+ role:
24+ - manager
25+ - master
26+ - ip: 192.168.1.122
27+ username: root
28+ password: "<ssh-password>"
29+ port: "22"
30+ role:
31+ - master
32+ - ip: 192.168.1.123
33+ username: root
34+ password: "<ssh-password>"
35+ port: "22"
36+ role: []
37+ - ip: 192.168.1.124
38+ username: root
39+ password: "<ssh-password>"
40+ port: "22"
41+ role: []
42+ - ip: 192.168.1.125
43+ username: root
44+ password: "<ssh-password>"
45+ port: "22"
46+ role: []
47+dataDir: ""
48+kubeletDir: ""
49+ntpServer: cn.pool.ntp.org:123
50+runInPod: false
51+checkLevel: 0
52+```
53+ 
54+#### 配置参数说明
55+ 
56+| 参数 | 是否必填 | 默认值 | 备注 |
57+| ------------- | -------- | ------ | ------------------------------------------------------------ |
58+| runInPod | 否 | false | 检查裸机值为false<br>与boc集成值为true,当为true将忽略引导节点和管理节点的检查 |
59+| checkLevel | 否 | 0 | 0表示全检查,从1-9级表示检查条目越来越多<br>1 主机信息,只是获取cpu、内存等<br>2 内核版本及内核参数设置<br>3 主机资源检查<br>4 主机软件修改<br>5 主机端口占用检查<br>6.主机之间端口连通性检<br>7/8/9 不重要的检查 |
60+| ntpServer | 是 | 无 | 检查ntpserver地址是否可达 |
61+| kubeletDir | 否 | / | 检查空闲磁盘空间 |
62+| dataDir | 否 | / | 检查空闲磁盘空间 |
63+| host.ip | 是 | 无 | 例:192.168.1.125 |
64+| host.username | 是 | 用户 | 例:root ,如果用户名密码均为空则跳过该主机 |
65+| host.password | 是 | 密码 | 例:password ,如果用户名密码均为空则跳过该主机 |
66+| host.port | 是 | 端口 | 例:22 |
67+| host.role | 否 | 角色 | 例:master |
68+| ignoreError | 否 | false | 例:false |
69+ 
70+#### 主机角色
71+ 
72+| 角色 | 功能 | 备注 |
73+| --------- | -------------------------------------- | ------------------------------------------------- |
74+| bootstrap | 表示为引导节点,即执行`bke init`的节点 | 只在裸机检查时有此角色,与boc集成的预检中无此角色 |
75+| manager | 表示为管理节点,即boc portal机器的节点 | 裸机检查和boc集成的场景均存在该角色 |
76+| master | 表示k8s master节点 | 裸机检查和boc集成的场景均存在该角色 |
77+| node | 表示k8s node节点 | 裸机检查和boc集成的场景中均存在该角色 |
78+ 
79+#### 使用场景
80+ 
81+##### 裸机检查
82+ 
83+1. 在该场景下 bootstrap 、manager 、master 三个角色必须同时存在,示例如下
84+ 
85+```yaml
86+hosts:
87+ - ip: 192.168.1.120
88+ username: root
89+ password: "<ssh-password>"
90+ port: "22"
91+ role:
92+ - bootstrap
93+ - ip: 192.168.1.121
94+ username: root
95+ password: "<ssh-password>"
96+ port: "22"
97+ role:
98+ - manager
99+ - master
100+ - ip: 192.168.1.122
101+ username: root
102+ password: "<ssh-password>"
103+ port: "22"
104+ role:
105+ - manager
106+ - ip: 192.168.1.123
107+ username: root
108+ password: "<ssh-password>"
109+ port: "22"
110+ role:
111+ - master
112+ - ip: 192.168.1.124
113+ username: root
114+ password: "<ssh-password>"
115+ port: "22"
116+ role: []
117+dataDir: ""
118+kubeletDir: ""
119+ntpServer: cn.pool.ntp.org:123
120+runInPod: false
121+```
122+ 
123+| 主机 | 角色 | 示意 |
124+| ------------- | --------------- | -------------------- |
125+| 192.168.1.120 | bootstrap | 引导节点 |
126+| 192.168.1.121 | manager,master | 管理节点,master节点 |
127+| 192.168.1.122 | manager | 管理节点,worker节点 |
128+| 192.168.1.123 | master | 业务节点,master节点 |
129+| 192.168.1.124 | | 业务节点,worker节点 |
130+ 
131+##### boc集成的业务集群检查1
132+ 
133+1. 集成后的业务集群检查是没有bootstrap角色的,示例配置
134+2. 注意这里没有配置manager节点,也就是说只检查目标机器的系统及资源情况,与管理集群的端口连通性是无法检查的
135+ 
136+```yaml
137+hosts:
138+ - ip: 192.168.1.123
139+ username: root
140+ password: "<ssh-password>"
141+ port: "22"
142+ role:
143+ - master
144+ - ip: 192.168.1.124
145+ username: root
146+ password: "<ssh-password>"
147+ port: "22"
148+ role: []
149+dataDir: ""
150+kubeletDir: ""
151+ntpServer: cn.pool.ntp.org:123
152+runInPod: true
153+```
154+ 
155+##### boc集成业务集群检查2
156+ 
157+1. 集成后的业务集群检查是没有bootstrap角色的,示例配置
158+2. 注意这里的manger节点配置的用户密码为空,支持的是业务集群到管理节点的端口连通性检查,无法支持管理集群到业务节点的端口连通性检查
159+3. 这里的管理节点只需要添加manager就可以了,不用添加master角色
160+ 
161+```yaml
162+hosts:
163+ - ip: 192.168.1.121
164+ username: root
165+ password: "<ssh-password>"
166+ port: "22"
167+ role:
168+ - manager
169+ - ip: 192.168.1.122
170+ username:
171+ password: ""
172+ port: "22"
173+ role:
174+ - manager
175+ - ip: 192.168.1.123
176+ username:
177+ password: ""
178+ port: "22"
179+ role:
180+ - master
181+ - ip: 192.168.1.124
182+ username: root
183+ password: "<ssh-password>"
184+ port: "22"
185+ role: []
186+dataDir: ""
187+kubeletDir: ""
188+ntpServer: cn.pool.ntp.org:123
189+runInPod: true
190+```
191+ 
192+##### boc集成业务集群检查3
193+ 
194+1. 集成后的业务集群检查是没有bootstrap角色的,示例配置
195+2. 这里的manger节点填入了正确的用户名密码,会检查管理节点到业务节点的端口连通性,不会检查管理节点的基本资源信息
196+3. 此为推荐用法
197+ 
198+```yaml
199+hosts:
200+ - ip: 192.168.1.121
201+ username: root
202+ password: "<ssh-password>"
203+ port: "22"
204+ role:
205+ - manager
206+ - ip: 192.168.1.122
207+ username: root
208+ password: "<ssh-password>"
209+ port: "22"
210+ role:
211+ - manager
212+ - ip: 192.168.1.123
213+ username: root
214+ password: "<ssh-password>"
215+ port: "22"
216+ role:
217+ - master
218+ - ip: 192.168.1.124
219+ username: root
220+ password: "<ssh-password>"
221+ port: "22"
222+ role: []
223+dataDir: ""
224+kubeletDir: ""
225+ntpServer: cn.pool.ntp.org:123
226+runInPod: true
227+```
@@ -0,0 +1,89 @@
1+ 
2+ 
3+### 与boc集成
4+ 
5+#### 简介
6+ 
7+- 作为裸机检查预先服务为一个单独的二进制文件,在与boc集成中将提供一个crd与boc产品进行对接
8+ 
9+#### CRD配置文件介绍
10+ 
11+```yaml
12+apiVersion: bocoperator.bocloud.com/v1beta1
13+kind: ClusterMachineInspection
14+metadata:
15+ labels:
16+ app.kubernetes.io/name: clustermachineinspection
17+ app.kubernetes.io/instance: clustermachineinspection-sample
18+ app.kubernetes.io/part-of: bocoperator
19+ app.kubernetes.io/managed-by: kustomize
20+ app.kubernetes.io/created-by: bocoperator
21+ name: clustermachineinspection-sample
22+spec:
23+ dataDir: "/" #数据目录[非必填] (默认为根目录)
24+ kubeletDir: "/" #kubelet目录[非必填] (默认为根目录)
25+ ntpServer: "/test" #ntpServer地址[非必填]
26+ runInPod: true #是否是在容器中执行[必填] (true) 只用使用二进制方式值为(false)
27+ executeTimes: 8 #执行次数[必填] 大于1
28+ hosts: #主机信息[必填]
29+ #值为manager/master
30+ #manager 表示为管理节点,即boc portal机器的节点
31+ #master 表示k8s master节点
32+ - role: # 角色
33+ - master
34+ ip: 192.0.2.31 #机器ip[必填]
35+ port: "22" #端口号[必填]
36+ username: root # 用户名密码是必须的,且保证ssh连接是通的,所使用用户需要具有sudo权限
37+ password: <ssh-password> #密码[必填]
38+ 
39+ - role:
40+ - master
41+ ip: 192.0.2.32
42+ port: "22"
43+ username: root
44+ password: <ssh-password>
45+ 
46+ - role:
47+ - master
48+ ip: 192.0.2.33
49+ port: "22"
50+ username: root
51+ password: <ssh-password>
52+status:
53+ #当前两个error字段 只和cr的执行状态有关
54+ errorMessage: "" #如果是failed状态.会展示详细信息
55+ errorStatus: success #success/failed failed状态会有错误信息
56+ #如果任务在执行中. 只修改次数. 任务不会终止. 最终次数值为最后一次的修改结果
57+ #如果任务在执行中, 除次数之外的内容变更, 则任务会重新执行.
58+ #如果认为不再执行中, 只要内容发生变化.则会触发
59+ executeTimes: 8 #执行次数. 和spec中的执行次数一直则代表执行完成
60+ failure: 3 #失败数量
61+ #报告链接地址
62+ reportUrl: /cmi/default-clustermachineinspection-sample-cmi-clustermachineinspection-sample.html
63+ result: not pass #检查结果.值为paas/not pass
64+ server:
65+ - ip: 192.0.2.31 #ip
66+ logicCpu: 17 #逻辑cpu
67+ memory: 8G #内存
68+ physicsCpu: 0 #物理cpu
69+ role: master #角色 内容以逗号分隔,工作为节点为""
70+ success: 9 #成功数量
71+ total: 14 #总测试数量
72+ warning: 2 #告警数量
73+ 
74+```
75+ 
76+ 
77+ 
78+#### 与boc集成
79+ 
80+ 
81+ 
82+ 
83+ 
84+#### 工作原理
85+ 
86+![img123](../../res/clusterMachineInspection.png)
87+ 
88+ 
89+ 
@@ -0,0 +1,78 @@
1+### 检查任务项
2+ 
3+注:条目中告警级别表示,表示任务执行失败后的级别,任务执行成功状态一律为成功
4+ 
5+#### 服务器
6+ 
7+| 检查项目 | 适用版本 | 告警级别 | 备注 |
8+| ------------------------------------------------------------ | -------- | -------- | ------------------------ |
9+| 关闭防火墙 | 全系 | 警告 | 尝试关闭防火墙、尝试失败则警告 |
10+| 内核版本>=kernel-3.10.0-1160.15.2.el7.x86_64 | 全系 | 失败 | 内核版本小于该版本则失败 |
11+| ntpserver服务检查 | 全系 | 失败 | 尝试连接ntpserver,无法连接则失败 |
12+| echo 120 > /proc/sys/kernel/hung_task_timeout_secs <br>echo 1 > /proc/sys/kernel/hung_task_panic | 全系 | 警告 | 检查这两个参数值,不符合则警告 |
13+| fs.file-max=9000000 <br>fs.inotify.max_user_instances = 1000000<br>fs.inotify.max_user_watches = 1000000 | 全系 | 警告 | 直接为系统设置该参数,不管结果。<br>命令执行成功则成功<br>命令执行失败则警告 |
14+| 加载内核模块nf_conntrack_ipv4/nf_conntrack | 全系 | 警告 | 直接加载该内核模块,不管结果。<br>命令执行成功为成功<br>命令执行失败则警告 |
15+| 磁盘空间检查 | 全系 | 失败 | 目标目录的磁盘空间小于80G,则失败 |
16+| 磁盘性能要求 | 全系 | 失败 | k8s master节点,根目录小数据块读写时间<50ms |
17+ 
18+ 
19+ 
20+#### 引导节点端口检查
21+ 
22+| 检查项目 | 适用版本 | 告警级别 | 备注 |
23+| -------- | -------- | -------- | ------------ |
24+| 36443 | 全系 | 失败 | 端口不被占用 |
25+| 40080 | 全系 | 失败 | 端口不被占用 |
26+| 40443 | 全系 | 失败 | 端口不被占用 |
27+| 38080 | 全系 | 失败 | 端口不被占用 |
28+ 
29+#### 管理节点到引导节点检查
30+ 
31+| 检查项目 | 适用版本 | 告警级别 | 备注 |
32+| -------- | -------- | -------- | ------------------------ |
33+| 36443 | 全系 | 失败 | 管理节点到引导节点可访问 |
34+| 40080 | 全系 | 失败 | 管理节点到引导节点可访问 |
35+| 40443 | 全系 | 失败 | 管理节点到引导节点可访问 |
36+| 38080 | 全系 | 失败 | 管理节点到引导节点可访问 |
37+ 
38+#### 管理集群内部端口检查
39+ 
40+| 检查项目 | 适用版本 | 告警级别 | 备注 |
41+| -------- | -------- | -------- | -------------------------- |
42+| 30000 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
43+| 30001 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
44+| 30022 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
45+| 30033 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
46+| 30024 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
47+| 18089 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
48+| 30026 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
49+| 30988 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
50+| 30025 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
51+| 30903 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
52+| 30909 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
53+| 3030 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
54+| 30029 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
55+| 8080 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
56+| 40443 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
57+| 6443 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
58+| 9090 | v4.0 | 失败 | 端口不被占用,且内部可互访 |
59+ 
60+#### 管理节点到业务集群节点
61+ 
62+| 检查项目 | 适用版本 | 告警级别 | 备注 |
63+| -------- | -------- | -------- | ---------------------------------------- |
64+| 6443 | v4.0 | 失败 | 端口不被占用,且管理集群到业务集群可访问 |
65+| 30029 | v4.0 | 失败 | 端口不被占用,且管理集群到业务集群可访问 |
66+| 30909 | v4.0 | 失败 | 端口不被占用,且管理集群到业务集群可访问 |
67+| 30903 | v4.0 | 失败 | 端口不被占用,且管理集群到业务集群可访问 |
68+| 3030 | v4.0 | 失败 | 端口不被占用,且管理集群到业务集群可访问 |
69+| 30019 | v4.0 | 失败 | 端口不被占用,且管理集群到业务集群可访问 |
70+| 9012 | v4.0 | 失败 | 端口不被占用,且管理集群到业务集群可访问 |
71+ 
72+#### 业务集群到管理集群
73+ 
74+| 检查项目 | 适用版本 | 告警级别 | 备注 |
75+| -------- | -------- | -------- | ---------------------------------------- |
76+| 30000 | v4.0 | 失败 | 端口不被占用,且业务集群到管理集群可访问 |
77+| 30022 | v4.0 | 失败 | 端口不被占用,且业务集群到管理集群可访问 |
78+ 
@@ -0,0 +1,36 @@
1+### 硬件要求
2+ 
3+> - BKE将机器分为三种类型,引导节点、管理集群、业务集群
4+ 
5+- 引导节点:作为bke的初始化节点
6+- 管理集群:部署kubernetes集群并安装boc产品
7+- 业务集群:即客户使用的业务集群,是由管理集群来部署并管理的
8+ 
9+#### 最小化部署硬件配置
10+ 
11+| 节点类型 | 节点数量 | CPU | 内存 | 硬盘 |
12+| -------- | -------- | ---- | ---- | ------------ |
13+| 引导节点 | 1 | 2 | 4 | 系统盘>=100G |
14+| 管理集群 | 1 | 8 | 16 | 系统盘>=100G |
15+| 业务集群 | 1 | 8 | 16 | 系统盘>=100G |
16+ 
17+注:引导节点可以是管理集群的一个节点
18+ 
19+#### 推荐硬件配置
20+ 
21+| 节点类型 | 节点数量 | CPU | 内存 | 硬盘 |
22+| -------- | ------------ | ------------ | ------------ | ---------------------------- |
23+| 引导节点 | 1 | 2 | 4 | 系统盘>=100G |
24+| 管理集群 | 3 | 8 | 16 | 系统盘>=100G<br>数据盘>=300G |
25+| 业务集群 | 实际情况而定 | 实际情况而定 | 实际情况而定 | 实际情况而定 |
26+ 
27+ 
28+ 
29+### 软件要求
30+ 
31+| 项目 | 具体要求 | 参考命令(以centos7.6 为例) |
32+| ---------- | ------------------------------------------- | ------------------------------------------------------------ |
33+| 操作系 | CentOS Linux 7.6(64-bit) | cat /etc/redhat-release |
34+| kernel版本 | \>= Kernel 3.10.0-957.10.1.el7.x86_64 | uname -sr |
35+| ssh | 确保引导节点、管理集群、业务集群能用ssh互连 | 1. 确保添加所有节点时,IP、用户名和密码输入正确。<br/>2. 确保每个节点都有sudo或root权限。<br/> |
36+| yum | centos系统确保yum指令可用 | 1. 如果是Centos确保拥有yum;其他操作系统类型,确保拥有包管理器<br/> |
@@ -0,0 +1,52 @@
1+### 开放端口
2+ 
3+| 项目名称 | 部署方式 | 协议 | 内部端口 | 外部端口 | 端口功能 | 端口影响范围 |
4+| ----------------------- | ---------------- | ----- | -------- | ----------- | -------------------------------------- | ----------------- |
5+| ssh | 宿主机服务 | SSH | 22 | 22 | SSH通信 | 所有节点 |
6+| k8s节点开放端口范围 | 无 | 无 | 0 | 30000-32767 | NodePort端口 | k8s 所有节点 |
7+| kube-apiserver | 静态POD | HTTPS | 6443 | 36443 | k8s api 端口 | k8s master节点 |
8+| kube-apiserver | 静态POD | HTTP | 8080 | 0 | 非安全端口,默认关闭 | k8s master节点 |
9+| kube-controller-manager | 静态POD | HTTPS | 10257 | 10257 | metrics安全端口 | k8s master节点 |
10+| kube-controller-manager | 静态POD | HTTP | 10252 | 10252 | 非安全端口 | k8s master节点 |
11+| kube-scheduler | 静态POD | HTTPS | 10259 | 10259 | 安全端口 | k8s master节点 |
12+| kube-scheduler | 静态POD | HTTP | 10251 | 10251 | 非安全端口 | k8s master节点 |
13+| kubelet | 容器启动 | HTTPS | 10250 | 10250 | AP,安全端口I | k8s 所有节点 |
14+| kubelet | 容器启动 | HTTP | 10248 | 10248 | /healthz | k8s 所有节点 |
15+| kubelet | 容器启动 | HTTP | 4194 | 4194 | cadvisior | k8s 所有节点 |
16+| kube-proxy | Deployment | HTTP | 10256 | 0 | 健康检查端口 | k8s 所有节点 |
17+| kube-proxy | Deployment | HTTP | 10249 | 0 | 指标端口 | k8s 所有节点 |
18+| etcd | 静态POD | HTTP | 2380 | 2380 | 集群节点通信 | k8s master节点 |
19+| etcd | 静态POD | HTTP | 2379 | 2379 | 客户端交互 | k8s master节点 |
20+| coredns | Deployment | UDP | 53 | 0 | 根域和com域的解析 | k8s 所有节点 |
21+| coredns | Deployment | UDP | 54 | 0 | 根域解析 | k8s 所有节点 |
22+| calico | dasmonset | TCP | 9099 | 0 | 健康检查 | k8s 所有节点 |
23+| calico | dasmonset | TCP | 9100 | 0 | 指标端口 | k8s 所有节点 |
24+| calico | dasmonset | UDP | 179 | 0 | calico bgp | k8s 所有节点 |
25+| prometheus | Prometheus CRD | HTTP | 9090 | 30909 | web界面 | k8s 所有节点 |
26+| alertmanager | Alertmanager CRD | HTTP | 9093 | 30903 | web界面 | k8s 所有节点 |
27+| node exporter | Daemonset | HTTP | 9100 | 9100 | 指标端口 | 所有节点 |
28+| grafana | Deployment | HTTP | 3000 | 30902 | web界面 | k8s 所有节点 |
29+| kibana | Deployment | HTTP | 5601 | 31065 | web界面 | k8s 所有节点 |
30+| elasticsearch | statefulset | TCP | 9200 | 30029 | db | k8s 所有节点 |
31+| elasticsearch | statefulset | TCP | 9300 | 30039 | transport | k8s 所有节点 |
32+| fabric | daemonset | TCP | 9013 | 9013 | fabric-controller api 端口 | 所有节点 |
33+| fabric ryu-controller | daemonset | TCP | 9016 | 9016 | fabric ryu-controller api 端口 | 所有节点 |
34+| fabric webhook | daemonset | TCP | 9443 | 0 | fabric webhook 端口 | 所有节点 |
35+| fabric ryu-controller | daemonset | TCP | 6633 | 6633 | fabric ryu-controller openflow通信端口 | 所有节点 |
36+| beyondlet | daemonset | HTTP | 9012 | 9012 | api服务 | k8s 所有节点 |
37+| plumber | deployment | HTTP | 9019 | 30019 | api服务 | |
38+| beyondELB | deployment | TCP | 80 | 80 | nginx端口 | ingress-nginx节点 |
39+| beyondELB | deployment | TCP | 443 | 443 | nginx端口 | ingress-nginx节点 |
40+| beyondELB | deployment | TCP | 8443 | 8443 | webhook端口 | ingress-nginx节点 |
41+| beyondELB | deployment | HTTP | 10254 | 0 | 健康检查端口 | ingress-nginx节点 |
42+| securityCron | deployment | HTTP | 8081 | 30018 | showstatus | k8s 所有节点 |
43+| securityCron | deployment | HTTP | 8000 | 0 | readyz检查端口 | 无 |
44+| securityCron | deployment | HTTP | 8080 | 0 | controller端口 | 无 |
45+| beyondac | Deployment | HTTP | 9015 | 0 | webhook端口 | 无 |
46+| beyondac | Deployment | HTTP | 8081 | 0 | metrics端口 | 无 |
47+| konk-k8s | containerd | HTTPS | 6443 | 36443 | k8s api 端口 | 引导节点 |
48+| yum源端口 | containerd | HTTP | 443 | 40443 | yum源端口 | 引导节点 |
49+| charts服务端口 | containerd | HTTP | 8080 | 38080 | charts服务端口 | 引导节点 |
50+| nfsserver | containerd | TCP | 2049 | 2049 | 挂载服务端口 | 引导节点 |
51+| ntpserver | proc | UDP | 50 | 123 | 时间服务器端口 | 引导节点 |
52+ 
@@ -0,0 +1,230 @@
1+### 场景模拟
2+ 
3+- 通过一个客户场景,来模拟一下Konk的使用流程
4+ 
5+```shell
6+[20230801] [事件] 某客户提供了18台服务器,用于部署boc管理平台及公司使用的业务集群
7+[20230801] [规划] 18台服务器三台用于部署高可用的portal集群,15台用于部署业务集群
8+[20230801] [实施] 将预检程序及额外部署要求给客户,让客户在任意一台服务器上执行预检程序,并通过交流检查结果,对集群进行调整
9+[20230801] [传输] 将bke.tar.gz打包文件传输到客户现场,或者用U盘带过去
10+[20230802] [入住] 实施人员入驻现场,将bke.tar.gz包放置到选定的引导节点,并执行解压
11+[20230802] [实施] 提前准备好portal集群部署yaml,执行bke init -f bkecluster.yaml完成portal一键部署
12+[20230802] [检查] 等待若干时间后,检查portal集群是否监控及portal平台是否可以正常登录
13+[20230802] [业务] 登录portal,在portal界面完成业务集群的部署及纳管
14+[20230802] [交付] 将boc平台交付给客户使用
15+```
16+ 
17+### 在线部署
18+ 
19+> - BKE前期部署模式以离线部署为主,但是离线部署的弊端是每次部署一个K8s集群需要提前制作好离线部署包,这个实在是太麻烦了
20+> - 对于任何集群部署工具来说,每每想到部署个k8s集群还忒提前准备一系列离线包就会头疼的放弃该产品,转而用kubeadm
21+> - 所以设计并开发BKE在线部署模式,受离线部署的影响,BKE的在线部署模式是基于离线的基础之上实现的。
22+ 
23+#### 部署模式
24+ 
25+> 对于当前的集群部署,有一些依赖组件是必须存在的,比如containerd、kubectl、etcdctl、docker-ce源l等,必须提供一个下载这些资源的地方,对此设计了两种存储
26+>
27+> 第一种,将这些文件打包进一个镜像中,从镜像中获取
28+>
29+> 第二种,提供下载源,从下载源中获取
30+ 
31+##### 部署模式一
32+ 
33+```shell
34+# 必要条件
35+# 提前构建一个镜像,上传到公网仓库,该镜像中包含containerd、rpm、etcdctl等包 参考<<制作在线依赖镜像>>篇
36+ 
37+# 将bke 二进制文件 上传到目标主机, /usr/bin目录下
38+$ upload bke --> bootstarp host /usr/bin
39+# 使用如下指令初始化引导节点
40+$ bke init --otherRepo registry.example.com/bke/demo:v0.3
41+# 初始化完成后,修改/bke/cluster/1master.yaml部署集群,注意公网是没有fabric镜像的要改成calico模式部署
42+# 如果只是想要一个k8s集群的话,将addons中的bocoperator部署移除掉
43+$ bke cluster create -f /bke/cluster/1master.yaml
44+```
45+ 
46+##### 部署模式二
47+ 
48+```shell
49+# 必要条件
50+# 该模式和模式一是相同的,同样需要构建镜像上传到镜像仓库,唯一的不同是该模式是部署到自己搭建的私有镜像仓库,非公网仓库
51+# 从私有仓库下载镜像涉及到证书、https/http、用户名密码等等,由于此种原因BKE并不能支持任意的镜像仓库下载(看需求有客户需要在支持)
52+# BKE 仅仅支持一种镜像仓库,那就是bke start image 启动的镜像仓库,因为这个证书bke/cluster-api都内置了,下镜像不会有任何阻塞
53+ 
54+# 初始化命令和模式一部署命令一致,区别是这里的镜像仓库要用IP
55+$ bke init --otherRepo 192.0.2.10:40443/kubernetes/demo:v0.3
56+# 修改/bke/cluster/1master.yaml,内网仓库就可以用fabric
57+$ bke cluster create -f /bke/cluster/1master.yaml
58+```
59+ 
60+##### 部署模式三
61+ 
62+```shell
63+# 必要条件
64+# 该模式不需要提前构建源镜像,但是需要提前准备好一个rpm的源仓库,即bke start rpm 启动的仓库
65+# 在该仓库中已经存在了需要的contaienrd / kubectl / rpm包等资源
66+# 然后使用如下命令初始化引导节点,注意使用该模式部署出来的集群,会使用这个源做为主机源地址
67+ 
68+# 初始引导节点,注意这里的 --otherRepo指向的是镜像仓库并没有指向具体的镜像 --otherSource 需要http://前缀
69+$ bke init --otherRepo registry.example.com/bke --otherSource http://192.0.2.10:40080
70+# 修改/bke/cluster/1master.yaml,部署集群
71+$ bke cluster create -f /bke/cluster/1master.yaml
72+```
73+ 
74+##### 部署模式四(不支持)
75+ 
76+```shell
77+# 使用公网的开源的rpm源仓库是不支持的,因为我们的自建的仓库除了承担rpm源包安装的任务外,还需要支持诸如kubectl、etcdctl等依赖工具的下载,咱不支持公网源
78+# 假设服务器是公网的,主机已经提前安装好了docker服务,支持待定
79+```
80+ 
81+ 
82+ 
83+### 离线部署
84+ 
85+> 在离线部署情况下,要求引导节点的工作目录必须大于等于50G,注意如果该压缩包中是多架构的bke,它会存在bke_amd64 / bke_arm64两个文件,请根据系统架构使用对应文件
86+>
87+> 部署方案一,属于最简洁常用的部署方案,将压缩包解压到/bke目录中,并使用默认的工作目录/bke
88+>
89+> 部署方案二,属于一些自定义需求的部署方案,下边会详细介绍使用方法
90+>
91+> 部署方案三,在默认情况下bke在引导节点启动了一个镜像仓库、yum源仓库、chart仓库、nfs仓库、ntpserver,有些特殊需求要将该资源分开,这个便如何将服务迁移
92+ 
93+#### 部署方案一
94+ 
95+- 第一步:获取bke.tar.gz文件,并在引导节点解压
96+ 
97+```shell
98+# 该压缩包中包含全量的镜像文件,体积较大
99+$ tar zxvf bke.tar.gz -C /
100+```
101+ 
102+- 第二步:在引导节点执行如下指令
103+ 
104+```shell
105+# 关闭防火墙
106+$ systemctl stop firewalld && systemctl disable firewalld
107+# 初始化引导节点环境并设置ntp服务器,ntp服务器修改参考[引导节点篇]
108+$ bke init [--ntpServer cn.pool.ntp.org:123]
109+# 生成配置文件在${BKE_WORKSAPCE}/cluster(默认/bke/cluster)目录下
110+$ ls /bke/cluster
111+# 根据需求修改配置文件,配置文件修改参考[配置文件篇]
112+# 执行集群部署
113+$ bke cluster create -f /bke/cluster/bkecluster.yaml
114+```
115+ 
116+- 一条指令完成集群部署,适用于提前准备好配置文件
117+ 
118+```shell
119+$ bke init -f /bke/cluster/bkecluster.yaml
120+```
121+ 
122+#### 部署方案二
123+ 
124+- 情况一:根目录磁盘空间不足,想使用额外的磁盘
125+ 
126+```shell
127+# 创建/bke目录,并将其挂载到目标磁盘
128+$ mkdir /bke
129+$ mount /dev/sdc /bke
130+# 其余过程就和使用部署方案一一样
131+```
132+ 
133+- 情况二:不想使用/bke 作为工作目录,想使用其他目录作为工作目录
134+ 
135+```shell
136+$ mkdir /data
137+$ tar zxvf bke.tar.gz -C /data
138+# 注意解压到非根目录 bke二进制文件会在/data/usr/bin下,请将其挪到/usr/bin下
139+$ mv /data/usr/bin/bke /usr/bin
140+# 设置BKE_WORKSPACE环境变量,注意这个环境变量的结尾是bke并不是/data
141+$ export BKE_WORKSPACE=/data/bke
142+$ bke init --runtime docker
143+# 该环境变量的设置,另个一个注意点容易忽略,设置的环境变量往往是在当前会话生效
144+# 当你重新连接该客户端环境变量就失效了,而此时你可能已经忘了,因此执行bke init 会出现未知错误
145+# 所以推荐如下使用方法
146+$ BKE_WORKSPACE=/data/bke bke init --runtime docker
147+```
148+ 
149+- 完成上述操作,就和`方案一`使用bke的过程一样了
150+ 
151+#### 部署方案三
152+ 
153+> 这些所有的自定义配置,最终都会体现到bkecluster这个crd文件上,当你要特殊的配置的时候,要同步修改该配置文件
154+ 
155+- 自定义的镜像仓库,boc暂不支持自定义镜像仓库域名及端口,固定为`repo.example.com:40443`
156+ 
157+```shell
158+# 第一种情况:使用客户提供的镜像仓库,需要将镜像全量同步到客户的仓库中,并在bkecluster.yaml中指定客户仓库即可
159+# 第二种情况:镜像仓库迁移,首先将/bke/mount下数据迁移到指定节点,然后执行如下命令将会在目标节点启动一个新的镜像仓库
160+# 注意 迁移镜像仓库,所有节点 repo.example.com域名指向的IP要变更
161+$ bke start image [--image registry:2.8.1] [--data /bke/mount/image_registry] # 该指令将启动一个带有tls证书的镜像仓库
162+$ bke remove image # 移除仓库
163+```
164+ 
165+- 自定义的chart仓库
166+ 
167+```shell
168+# 将/bke/mount下数据迁移到目标节点
169+$ bke start chart [--image chartsum:0.15.0] [--data /bke/mount/chartsum] # 启动一个chart仓库
170+$ bke remove image # 移除仓库
171+```
172+ 
173+- 自定义yum源仓库
174+ 
175+```shell
176+# 该项配置体现在bkecluster的httpRepo字段
177+# 将/bke/mount下数据文件迁移到目标节点
178+$ bke start yum # 启动一个yum源仓库
179+$ bke remove yum # 移除仓库
180+```
181+ 
182+- 自定义nfs仓库
183+ 
184+```shell
185+# 将/bke/mount下数据迁移到目标节点
186+$ bke start nfs # 启动一个nfsserver
187+$ bke remove nfs # 删除服务
188+```
189+ 
190+- 自定义ntpserver
191+ 
192+```shell
193+$ bke start ntpserver # 启动一个ntpserver
194+$ bke remove ntpserver # 删除服务
195+```
196+ 
197+#### 部署方案四
198+ 
199+> - 有时候引导节点经过多次重复初始化,会存在残留的目录数据,影响本地的初始化结果,当出现这种情况时候,可使用如下命令初始化
200+ 
201+```shell
202+# 重置节点服务,然后重新初始化
203+$ bke reset --mount && bke init
204+```
205+ 
206+ 
207+ 
208+### 增量包部署
209+ 
210+- 第一步:将增量包放到到引导节点 `bke-patch-patch4.0-amd64-20230428170229.tar.gz`
211+- 第二步:执行解压命令,可以将该包解压到任意目录,注意别覆盖现场使用中的bke目录
212+ 
213+```shell
214+$ makde /tmp/v2
215+$ tar zxvf bke-patch-patch4.0-amd64-20230428170229.tar.gz -C /tmp/v2
216+$ tree -L 2 /tmp/v2/
217+/tmp/v2/
218+└── bke-patch4.0
219+ ├── manifests.yaml
220+ └── volumes
221+```
222+ 
223+- 第三步:执行`bke registry patch --source /tmp/v2/patch4.0 --target 127.0.0.1:40443` 进行镜像仓库同步
224+ 
225+```shell
226+$ bke registry patch --source /tmp/v2/patch4.0 --target 127.0.0.1:40443
227+```
228+ 
229+- 第四步:根据部署文档将指定文件增量到指定目录
230+- 第五步:执行部署文档其他任务要求
@@ -0,0 +1,618 @@
1+### 配置文件
2+ 
3+> bke部署集群有一个唯一的配置文件,所有的后续部署均围绕该配置文件进行,部署文件的详细信息如下
4+ 
5+#### 配置文件标准用法
6+ 
7+- 该配置文件是k8s中的crd文件
8+ 
9+ > 当执行完`bke init`后在`${BKE_WORKSPACE}/cluster`(默认`/bke/cluster`)目录下会生成该配置文件
10+ 
11+ > 执行`bke config`在当前目录下生成该配置文件
12+ 
13+- 如下介绍一下配置文件的详细信息
14+ 
15+```yaml
16+apiVersion: bke.bocloud.com/v1beta1
17+kind: BKECluster
18+metadata:
19+ name: bke-cluster
20+ namespace: bke-cluster
21+ # 所有注释不存在则都按默认值处理
22+ annotations:
23+ # 设置agent监听的集群 默认current
24+ # 可选值 current或bkecluster
25+ # 设置为bkecluster时会在当前配置的集群创建之后转移agent监听到新集群。
26+ # 一旦转移将失去对该BKECluster CRD所指集群的控制,即删除扩缩容等操作都将失效
27+ bke.bocloud.com/bkeagent-listener: current
28+ # 集群类型,默认空
29+ # 部署新集群为"",纳管老的bocloud部署的集群值为bocloud,纳管其他来源的k8s用other
30+ bke.bocloud.com/cluster-from: ""
31+ # 是否开启深度清理节点,默认为 true
32+ # 除移除k8s相关,还会额外清理容器运行时(docker containerd)
33+ bke.bocloud.com/deep-restore-node: "true"
34+ # 删除bc时是否忽略删除目标集群,默认为 true
35+ # 若为true则删除bc时不会删除目标集群,只会删除当前集群中的各种CR
36+ # 若为false则删除bc时会删除目标集群
37+ bke.bocloud.com/ignore-target-cluster-delete: "true"
38+ # 删除bc时是否忽略删除bc所在的namespace,默认为 true
39+ # 若为true则删除bc时不会删除bc所在的namespace
40+ # 若为false则删除bc时会删除bc所在的namespace
41+ # 若检测到该namespace下还有其他bc,即使设置为false也不会删除该namespace
42+ bke.bocloud.com/ignore-namespace-delete: "true"
43+ # 节点引导超时时间,默认10m
44+ # 该参数可影响环境检查的超时时间,以及单节点启动k8s组件的时间
45+ # 在网络条件不好时,可适当调高该值
46+ bke.bocloud.com/node-boot-wait-timeout: "10m"
47+ # 节点预约删除,节点删除是个危险的动作故增加此注释做二次确认,默认无
48+ # 删除节点时除从spec中将节点删除,还需将要删除的节点ip填入,多个ip之间使用‘,’分割
49+ # 两步操作少之其一都不会触发节点删除
50+ bke.bocloud.com/appointment-deleted-nodes: ""
51+ # 节点预约安装
52+ # 安装节点时,从spec中将节点信息填入,并在该注解中填入了节点ip,多个ip之间使用‘,’分割
53+ # 将不会对注解中存在ip的节点进行安装,直至将相关ip从注解中移除后才会安装
54+ bke.bocloud.com/appointment-add-nodes: ""
55+ # master节点是否可调度,默认false
56+ # 设置为false等同于在master节点加入集群后使用 kubectl conrdon node **
57+ bke.bocloud.com/master-schedulable: "false"
58+spec:
59+ # 可选 负载均衡地址,需要配置负载均衡器时再填
60+ controlPlaneEndpoint: # 详情见下方章节 负载均衡
61+ host: "HA IP" # 启动负载均衡器时,VIP 将设置为该值,且需要与Node列表中各个node IP同网段
62+ port: 36443 # 可选 int32类型 如只设置host没有port默认设置为36443
63+ pasue: false # 此值为true会暂停集群操作,无法暂停正在运行的操作,eg: 正在扩容,扩容结束后不再进行其他操作
64+ dryRun: false # 此值为true则仅做环境检查不安装k8s集群
65+ reset: false # 此值为true则会删除bc,等同于kubectl delete bc
66+ # kubernetes集群配置
67+ # 各个组件的镜像名称、镜像版本、启动参数配置(组件本身存在默认启动参数,配置的为额外的启动参数)
68+ clusterConfig:
69+ cluster:
70+ apiServer: # 详情见下方章节 kubernetes组件配置-kube-apiserver
71+ port: "6443"
72+ controllerManager: # 详情见下方章节 kubernetes组件配置-kube-controller-manager
73+ etcd: # 详情见下方章节 kubernetes组件配置-etcd
74+ dataDir: /var/lib/etcd
75+ scheduler: # 详情见下方章节 kubernetes组件配置-kube-scheduler
76+ extraVolumes:
77+ - hostPath: /host/exam
78+ mountPath: /host/exam
79+ name: example
80+ pathType: Directory
81+ readOnly: true
82+ kubelet: # 详情见下方章节 kubernetes组件配置-kubelet
83+ manifestsDir: /etc/kubernetes/manifests
84+ # 可选,配置kubelet 数据目录,此处所示为默认配置,没有填写时将会自动设置
85+ # extraVolumes中配置一条name为kubelet-root-dir的才会生效否则会认为是普通的额外挂载
86+ extraVolumes:
87+ - name: kubelet-root-dir
88+ hostPath: /var/lib/kubelet
89+ # 配置容器运行时
90+ containerRuntime: # 详情见下方章节 容器运行时配置
91+ # 设置为containerd时请在下方customExtra字段中填写containerd版本,docker不用填写
92+ cri: containerd # 可选docker、containerd,默认containerd
93+ runtime: runc # 可选 runc、richrunc、kata,默认runc
94+ # docker、containerd配置文件额外参数
95+ # ps: 由于docker的containerd的配置文件格式不同,此处的key,value为定制参数
96+ param:
97+ # 可选,CRI数据保存目录
98+ # cri为containerd时默认为/var/lib/containerd
99+ # cri为docker时默认为/var/lib/docker
100+ # 没有填写时将会自动设置
101+ data-root: /var/lib/containerd
102+ # 可选,cgroup驱动
103+ # 默认为systemd,在麒麟V10 amr64系统上使用docker-engine时,将会强制使用cgroupfs
104+ cgroupDriver: systemd
105+ # 配置kubernetes版本,当各个k8s组件不配置版本时以此为准目前支持(v1.21.1、v1.23.17、v1.25.6)的集群部署
106+ # 可选 默认v1.25.6,支持1.21-1.29
107+ kubernetesVersion: v1.25.6
108+ # k8s证书在主机上的存放目录
109+ # 可选 默认/etc/kubernetes/pki
110+ certificatesDir: /etc/kubernetes/pki
111+ # 集群网络
112+ networking: # 详情见下方章节 网络配置
113+ dnsDomain: cluster.local
114+ podSubnet: 10.250.0.0/16
115+ serviceSubnet: 10.96.0.0/12
116+ # 可选 公网环境可采用公网ntpServer
117+ # 内网环境如果提供则填写上ntpServer
118+ # 默认从 configmap cluster-system / bke-config 中读取,详情见引导节点章节
119+ ntpServer: cn.pool.ntp.org:123
120+ # kubernetes集群部署所有的镜像来源于 repo.example.com:40443/kubernetes
121+ imageRepo: # 详情见下方章节 镜像仓库
122+ domain: repo.example.com
123+ port: "40443"
124+ prefix: kubernetes
125+ # 该http源(yum或apt源)会配置到所有的节点
126+ httpRepo: # 详情见下方章节 yum仓库
127+ domain: repo.example.com
128+ port: "40080"
129+ prefix: ""
130+ # 配置所有节点的详细信息
131+ nodes: # 详情见下方章节 集群节点配置
132+ - hostname: master-1 # 很明显三个master会自动组建高可用k8s集群
133+ ip: 172.100.200.10
134+ username: root # 用户名密码是必须的,且保证ssh连接是通的,使用非root用户需要具有sudo免密权限
135+ password: <ssh-password> # 密码会被自动加密
136+ port: "22"
137+ # 配置该节点的角色,目前只支持master和etcd绑定在一个节点配置
138+ # 支持的角色类型 (master、node、master/node、etcd)
139+ # 注意使用mater和node同节点的角色是,需填写为 "master/node"形式,不可以分开填写
140+ role:
141+ - master/node
142+ - etcd
143+ - hostname: master-2
144+ ip: 172.100.200.11
145+ username: root
146+ password: <ssh-password>
147+ port: "22"
148+ role:
149+ - master
150+ - etcd
151+ - hostname: master-3
152+ ip: 172.100.200.12
153+ username: root
154+ password: <ssh-password>
155+ port: "22"
156+ role:
157+ - master
158+ - etcd
159+ - hostname: worker-1
160+ ip: 172.100.200.13
161+ username: root
162+ password: <ssh-password>
163+ port: "22"
164+ role:
165+ - node
166+ - hostname: worker-2
167+ ip: 172.100.200.14
168+ username: root
169+ password: <ssh-password>
170+ port: "22"
171+ role:
172+ - node
173+ - hostname: worker-3
174+ ip: 172.100.200.15
175+ username: root
176+ password: <ssh-password>
177+ port: "22"
178+ role:
179+ - node
180+ # Kubernetes生态组件,当k8s集群启动完成后将会按照顺序部署如下组件
181+ addons:
182+ # 安装 kubeproxy时 version跟随spec中的k8s版本,
183+ # 如上述填写 "kubernetesVersion: v1.25.6",此处version也填写 v1.25.6
184+ - name: kubeproxy
185+ version: v1.25.6
186+ # 阻塞,即等待该组件启动完成后才会部署下边组件
187+ # 不填写时 默认为false
188+ block: true
189+ param: # 部署该组件需要的参数
190+ clusterNetworkMode: calico
191+ - name: calico
192+ param:
193+ calicoMode: bgp
194+ version: v3.25.0
195+ - name: coredns
196+ version: v1.10.1
197+ customExtra:
198+ # contaienrd是必须的,且value需要符合命名规则^containerd-([a-z0-9\\.]+)-([a-z0-9]+)-([a-z0-9\\.\\{\\}]+).tar.gz$
199+ containerd: containerd-1.6.16-linux-{.arch}.tar.gz
200+ # 可选,bkeagent-launcher-image纳管集群时使用的bkeagent-lancher镜像,未填写时将使用imageRepo中的镜像仓库生成镜像获取地址
201+ bkeagent-launcher-image: "repo.example.com:40443/kubernetes/bkeagent-launcher:latest"
202+ # 可选,设置master vip的route ID,设置负载均衡器后,且未填写该值,控制器将随机生成1-255的数字填写
203+ masterVirtualRouterId: '60'
204+ # 可选,设置beyondELB vip的route ID,beyondELB 组件中设置lbvip后,且未填写该值,控制器将随机生成1-255的数字填写
205+ ingressVirtualRouterId: '200'
206+ # 可选 设置环境初始化额外执行脚本,具体见下方环境初始化脚本
207+ envExtraExecScripts: "install-lxcfs.sh,install-nfsutils.sh,install-etcdctl.sh,install-helm.sh,install-calicoctl.sh,update-runc.sh"
208+```
209+ 
210+ 
211+ 
212+#### 配置文件高级用法
213+ 
214+#### 负载均衡
215+ 
216+- 填写VIP地址,在部署集群时会启动keepalived+haproxy保证集群的高可用
217+- 目前host需要和节点IP处于同一网段
218+- 当配置多Master,但不配置loadBalancer时,会选取第一个k8s master节点作为其他worker节点的连接地址
219+ 
220+```yaml
221+spec:
222+ controlPlaneEndpoint: # 可选
223+ host: 192.0.2.100
224+ port: 36443 # int32类型 可选 默认36443
225+spec:
226+ clusterConfig:
227+ customExtra:
228+ # 可选,设置master vip的route ID,设置负载均衡器后,且未填写该值,控制器将随机生成1-255的数字填写
229+ masterVirtualRouterId: '60'
230+```
231+ 
232+#### 集群节点配置
233+ 
234+- 在nodes下三个节点的角色配置上 master 和 etcd 便是三主k8s集群
235+- 如果想要集群k8s master高可用 loadBalancer是必须的
236+ 
237+```yaml
238+# spec.clusterConfig:
239+nodes:
240+ # 配置该节点的角色,目前只支持master和etcd绑定在一个节点配置
241+ # 支持的角色类型 (master、node、master/node、etcd)
242+ # 注意使用mater和node同节点的角色是,需填写为 "master/node"形式,不可以分开填写
243+ # 使用master/node角色不会给该master节点设置污点,单独使用master角色会设置污点
244+ - role:
245+ - master/node
246+ - etcd
247+ ip: 172.100.200.10
248+ port: "22" # 可选默认22
249+ username: root # 用户名密码是必须的,且保证ssh连接是通的,所使用用户需要具有sudo权限
250+ password: <ssh-password> # 密码会被自动加密
251+ hostname: master-1 # 会为节点设置成该hostname
252+ # 很明显三个master会自动组建高可用k8s集群
253+ - role:
254+ - master
255+ - etcd
256+ ip: 172.100.200.11
257+ port: "22"
258+ username: root
259+ password: <ssh-password>
260+ hostname: master-2
261+ - role:
262+ - master
263+ - etcd
264+ ip: 172.100.200.12
265+ port: "22"
266+ username: root
267+ password: <ssh-password>
268+ hostname: master-3
269+```
270+ 
271+- 该配置文件中,节点列表上限为2048,如果有更多的节点需要存储到同名的configmap中,可以认为该configmap就是bkecluster的外置扩展,共享调谐逻辑
272+ 
273+```yaml
274+$ kubectl get configmap bke-cluster -n bke-cluster -o yaml
275+apiVersion: v1
276+data:
277+ nodes: |2
278+ 
279+ [{
280+ "role": ["master", "etcd"],
281+ "ip": "172.100.200.11",
282+ "port": "22",
283+ "username": "root",
284+ "password": "<ssh-password>",
285+ "hostname": "worker-2"
286+ },
287+ {
288+ "role": ["node"],
289+ "ip": "172.100.200.12",
290+ "port": "22",
291+ "username": "root",
292+ "password": "<ssh-password>",
293+ "hostname": "worker-3"
294+ }]
295+kind: ConfigMap
296+metadata:
297+ creationTimestamp: "2022-12-26T09:14:24Z"
298+ name: bke-cluster
299+ namespace: default
300+ resourceVersion: "11027428"
301+ uid: 0f7e2c3b-77b8-40dc-9fa1-404f8cde175d
302+```
303+ 
304+ 
305+ 
306+#### kubernetes组件配置
307+ 
308+- kube-apiserver
309+ 
310+ ```yaml
311+ # spec.clusterConfig:
312+ cluster:
313+ apiServer:
314+ host: "" # 无需配置,地址从nodes配置中获取
315+ port: 6443 # int32 类型,默认为6443
316+ # kube-apiserver启动时自定义扩展参数,不配置是有默认值
317+ # https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
318+ extraArgs: # 可选 默认添加authorization-mode: Node,RBAC
319+ authorization-mode: Node,RBAC
320+ # 额外挂载主机目录,示例如下
321+ # https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
322+ extraVolumes: # 可选
323+ - name: vol
324+ hostPath: /data/source
325+ mountPath: /data/mount
326+ readOnly: false
327+ pathType: DirectoryOrCreate
328+ # 会将k8s master ip、127.0.0.1、VIP、master.bocloud.com以及该列中额外设置的值加入生成k8s证书中
329+ # 正常使用无需配置该内容,建议预留IP或域名方便以后master扩容
330+ certSANs: # 可选
331+ - c1
332+ - c2
333+ ```
334+ 
335+- kube-controller-manager
336+ 
337+ ```yaml
338+ # spec.clusterConfig:
339+ cluster:
340+ controllerManager: # 可选
341+ # kube-controller启动时自定义扩展参数,不配置是有默认值
342+ # https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/
343+ extraArgs: # 可选
344+ cluster-name: kubernetes
345+ # 额外挂载主机目录,示例如下
346+ # https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
347+ extraVolumes: # 可选
348+ - name: vol
349+ hostPath: /data/source
350+ mountPath: /data/mount
351+ readOnly: false
352+ pathType: DirectoryOrCreate
353+ ```
354+ 
355+- kube-scheduler
356+ 
357+ ```yaml
358+ # spec.clusterConfig:
359+ cluster:
360+ scheduler: # 可选
361+ # kube-scheduler启动时自定义扩展参数,不配置是有默认值
362+ # https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/
363+ extraArgs: # 可选
364+ bind-address: 0.0.0.0
365+ # 额外挂载主机目录,示例如下
366+ # https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
367+ extraVolumes: # 可选
368+ - name: vol
369+ hostPath: /data/source
370+ mountPath: /data/mount
371+ readOnly: false
372+ pathType: DirectoryOrCreate
373+ ```
374+ 
375+- kubelet
376+ 
377+ ```yaml
378+ # spec.clusterConfig:
379+ cluster:
380+ kubelet:
381+ # kubelet启动时自定义扩展参数,不配置是有默认值
382+ # https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
383+ extraArgs: # 可选
384+ address: 0.0.0.0
385+ # 额外挂载主机目录,示例如下
386+ # https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
387+ extraVolumes: # 可选
388+ - name: vol
389+ hostPath: /data/source
390+ mountPath: /data/mount
391+ readOnly: false
392+ pathType: DirectoryOrCreate
393+ # kubelet工作目录,存放证书、静态yaml等
394+ manifestsDir: /etc/kubernetes/manifests # 可选
395+ ```
396+ 
397+ 配置kubelet数据存放根目录
398+ 
399+ **ps: 可选, 配置kubelet 数据存储目录,此处所示为默认配置,没有填写时将会自动设置**
400+ 
401+ ```yaml
402+ # spec.clusterConfig:
403+ cluster:
404+ kubelet:
405+ manifestsDir: /etc/kubernetes/manifests
406+ # 可选,配置kubelet 数据目录,此处所示为默认配置,没有填写时将会自动设置
407+ # extraVolumes中配置一条name为kubelet-root-dir的才会生效否则会认为是普通的额外挂载
408+ extraVolumes:
409+ - name: kubelet-root-dir
410+ hostPath: /var/lib/kubelet
411+ ```
412+
413+- etcd
414+ 
415+ ```yaml
416+ # spec.clusterConfig:
417+ cluster:
418+ etcd: # 可选
419+ # etcd启动时自定义扩展参数,不配置是有默认值
420+ # https://doczhcn.gitbook.io/etcd/index/index-1/configuration
421+ extraArgs: # 可选
422+ snapshot-count: 1000
423+ # 额外挂载主机目录,示例如下
424+ # https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
425+ extraVolumes: # 可选
426+ - name: vol
427+ hostPath: /data/source
428+ mountPath: /data/mount
429+ readOnly: false
430+ pathType: DirectoryOrCreate
431+ # 数据目录,默认值/var/lib/etcd
432+ dataDir: "/var/lib/etcd" # 可选 默认 /var/lib/etcd
433+ # Etcd server证书额外授权的ip
434+ # 会将k8s master ip、127.0.0.1、VIP等以及该列中值加入生成k8s证书中
435+ serverCertSANs: # 可选
436+ - "192.168.1.110"
437+ # Etcd peer证书额外授权的ip
438+ # 会将k8s master ip、127.0.0.1、VIP等以及该列中值加入生成k8s证书中
439+ peerCertSANs: # 可选
440+ - "192.168.1.120"
441+ - "192.168.1.110"
442+ ```
443+ 
444+
445+ 
446+#### 节点k8s组件定制化配置
447+ 
448+```yaml
449+# spec.ClusterConfig:
450+nodes: # 可选
451+ # 配置该节点的角色,目前只支持master和etcd绑定在一个节点配置
452+ - role: # 必填
453+ - master
454+ - etcd
455+ ip: 172.100.200.10 # 必填
456+ port: "22" # 必填
457+ username: root # 用户名密码是必须的,且保证ssh连接是通的
458+ password: <ssh-password>
459+ hostname: master-1 # 会为节点设置成该hostname
460+ # 支持为每个节点单独配置他的 kube-apiserver/kubelet等配置,以及组件内部可扩展的参数
461+ # 正常使用时无需配置
462+ controllerManager:
463+ scheduler:
464+ apiServer:
465+ port: "6443"
466+ extraArgs:
467+ authorization-mode: Node,RBAC
468+ etcd:
469+ dataDir: /var/lib/etcd
470+ kubelet:
471+ manifestsDir: /etc/kubernetes/manifests
472+```
473+ 
474+#### 网络配置
475+ 
476+```yaml
477+# spec.clusterConfig:
478+cluster:
479+ networking: # 可选
480+ serviceSubnet: "10.96.0.0/12" # k8s service 子网,默认 10.96.0.0/12
481+ podSubnet: "192.168.0.0/16" # k8s pod 子网,默认192.168.0.0/16
482+ dnsDomain: "cluster.local" # k8s service 域名,默认cluster.local
483+```
484+ 
485+#### 自建ntp server
486+ 
487+```yaml
488+# ntpServer该参数是必须的
489+# 如果节点可以访问公网时间服务器,填写一个地址即可
490+# 如果是内网且内网无时间服务器,则填写ntpServer: local, bke init会在引导节点启动ntp server
491+# spec.clusterConfig:
492+cluster:
493+ ntpServer: cn.pool.ntp.org:123 # 必填
494+```
495+ 
496+#### http仓库
497+ 
498+- http仓库兼具包含yum源,apt源,以及文件下载服务器的功能
499+ 
500+```yaml
501+# spec.clusterConfig:
502+cluster:
503+ httpRepo: # 可选
504+ domain: repo.example.com # 可选 默认repo.example.com
505+ ip: 192.168.56.21
506+ port: "40080" # 可选 默认40080
507+ prefix: ""
508+# domain和ip不能为空, yum源配置为http://repo.example.com:40080, ip地址将会被写入/etc/hosts
509+```
510+ 
511+#### 镜像仓库
512+ 
513+- 该镜像仓库 `prefix:kubernetes`需要存在所有部署k8s生态需要的镜像
514+ 
515+```yaml
516+# spec.clusterConfig:
517+cluster:
518+ imageRepo: # 可选
519+ domain: repo.example.com # 可选 默认repo.example.com
520+ ip: 192.168.12.25 # 可选
521+ port: "40443" # 可选 默认40443
522+ prefix: kubernetes # 可选 默认 kubernetes
523+# 内网环境:doamin和ip不能为空, 镜像地址为repo.example.com:40443, ip地址将会被写入/etc/hosts
524+# 公网环境: domain不能为空,ip可为空,域名需要能通过镜像仓库校验
525+```
526+ 
527+#### kubernetes生态组件
528+ 
529+- 当k8s集群启动后,会按照配置顺序依次部署组件
530+- 这部分可支持的组件为高度定制化组件,每个可加入的组件均是经过测试及定制化开发
531+- 单独列出一章来讲述kubernetes生态组件配置
532+ 
533+```yaml
534+# spec.clusterConfig:
535+addons: # 可选,无默认值
536+ - name: kubeproxy
537+ version: 1.25.6
538+ block: true # 可选 默认true 阻塞,即等待该组件启动完成后才会部署下边组件
539+ param: # 部署该组件需要的参数
540+ clusterNetworkMode: calico
541+ - name: calico
542+ version: v3.25.0
543+ param:
544+ calicoMode: bgp
545+ - name: coredns
546+ version: v1.10.1
547+ - name: nfs-csi
548+ version: v4.1.0
549+ block: true
550+ param:
551+ nfsServer: 192.0.2.186
552+ # 该组件表示部署bocoperator,当bocoperator启动后部署boc产品
553+ - name: bocoperator
554+ version: latest
555+ block: true
556+ param:
557+ boc.version: v4.0
558+ boc.nfsserver: 192.0.2.186
559+```
560+ 
561+#### 容器运行时配置
562+ 
563+- 该配置将会运用到所有节点
564+ 
565+```yaml
566+# 配置容器运行时
567+containerRuntime: # 详情见下方章节 容器运行时配置
568+# 设置为containerd时请在下方customExtra字段中填写containerd版本,docker不用填写
569+ cri: containerd # 可选docker、containerd,默认containerd
570+ runtime: runc # 可选 runc、richrunc、kata,默认runc
571+ # docker、containerd配置文件额外参数
572+ # ps: 由于docker的containerd的配置文件格式不同,此处的key,value为定制参数
573+ param:
574+ # 可选,CRI数据保存目录
575+ # cri为containerd时默认为/var/lib/containerd
576+ # cri为docker时默认为/var/lib/docker
577+ # 没有填写时将会自动设置
578+ data-root: /var/lib/containerd
579+```
580+ 
581+#### 自定义扩展参数
582+ 
583+```yaml
584+# spec.clusterConfig:
585+customExtra:
586+ # contaienrd是必须的,且value需要符合命名规则^containerd-([a-z0-9\\.]+)-([a-z0-9]+)-([a-z0-9\\.\\{\\}]+).tar.gz$
587+ containerd: containerd-1.6.16-linux-{.arch}.tar.gz
588+ # 可选,bkeagent-launcher-image纳管集群时使用的bkeagent-lancher镜像,未填写时将使用imageRepo中的镜像仓库生成镜像获取地址
589+ bkeagent-launcher-image: "repo.example.com:40443/kubernetes/bkeagent-launcher:latest"
590+ # 可选,设置master vip的route ID,设置负载均衡器后,且未填写该值,控制器将随机生成1-255的数字填写
591+ masterVirtualRouterId: '60'
592+ # 可选,设置beyondELB vip的route ID,beyondELB 组件中设置lbvip后,且未填写该值,控制器将随机生成1-255的数字填写
593+ ingressVirtualRouterId: '200'
594+ # 可选, 设置boc的ci节点,并在该节点配置docker tls证书。当组件中设置bocoperator时,默认值为spec中第一个定义的master节点ip
595+ pipelineServer: ""
596+```
597+ 
598+ 
599+#### 环境初始化脚本
600+ 
601+```yaml
602+# spec.clusterConfig:
603+customExtra:
604+ # 可选 设置节点环境初始化额外执行脚本,未配置envExtraExecScripts时,默认执行以下脚本
605+ # 脚本在cluster-system namespace中以同名configmap存储,eg: cluster-system/install-lxcfs.sh
606+
607+ # boc业务集群,portal集群脚本
608+ # install-lxcfs.sh 安装lxcfs 作用于所有节点
609+ # install-nfsutils.sh 安装nfs-utils,作用于 customExtra[“pipelineServer”]中指定的节点
610+ # install-etcdctl.sh 安装etcdctl,作用于所有etcd角色的节点
611+ # install-helm.sh 安装helm 作用于所有master角色的节点
612+ # install-calicoctl.sh 安装calicoctl 作用于所有master角色的节点
613+ # update-runc.sh 升级runc版本小于1.1.12,当运行时是docker时作用于所有节点,containerd跳过
614+
615+ # aios业务集群,portal集群脚本
616+ # nfs-mount.sh 挂载nfs服务器到主机/opt/bcc/storage2目录,作用于所有节点
617+ envExtraExecScripts: "install-lxcfs.sh,install-nfsutils.sh,install-etcdctl.sh,install-helm.sh,install-calicoctl.sh,update-runc.sh"
618+```
@@ -0,0 +1,216 @@
1+### BKEConfig addons
2+ 
3+- addons中组件按照顺序进行安装,有的组件需要启动后才能进行下一步安装
4+- addons中组件均是经过定制化开发的,如下列出所有支持的组件及其参数
5+- 若需要安装非网络组件的addon,请将相关组件写在网络组件之后(网络组件填写参考下方)
6+ 
7+#### 示例
8+ 
9+```yaml
10+addons:
11+ - name: kubeproxy
12+ version: 1.25.6
13+ block: true # 阻塞一直等到该组件启动成功,再部署下边组件,默认为false,不阻塞
14+ param:
15+ xxx: xxxx # 定制化参数
16+```
17+ 
18+#### 集群网络组件配置参考
19+ 
20+注意:
21+ 
22+1. 请将网络组件根据下方示例结合实际情况选用不同组合,并将其写在addon最前方
23+2. 为了保证后续的组件能正常启动,下面所示的有关集群网络的addon均需要添加设置block: true参数
24+3. 详细的addon参数和参数说明解释,请看下方
25+ 
26+以cni划分
27+ 
28+**ipvs仅在使用calico加kubeproxy时支持,fabric不支持**
29+ 
30+- fabric(overlay模式)
31+ 
32+ 根据实际需要,调整tunnelType 来改变fabric的网络模式,支持填写 `geneve、gre、erspan、vxlan`之一
33+ 
34+ ```yaml
35+ addons:
36+ - name: fabric
37+ block: true
38+ param:
39+ fabricMode: overlay
40+ cidrBlock: "10.250.0.0/16" # 按实际情况填写,填写后同时设置bkecluster.spec.clusterConfig.cluster.networking.podSubnet与其一致
41+ excludeIps: "" # 没有则填写 "",支持ip段和单个ip,使用英文","分割。eg: "10.250.0.1-10.250.0.10,10.250.0.55"
42+ tunnelType: vxlan # geneve gre erspan vxlan
43+ subCIDRMask: "24" # 按实际情况填写
44+ version: 2.6.2
45+ - name: coredns
46+ block: true
47+ version: v1.10.1
48+ ```
49+ 
50+- fabric(underlay模式)
51+ 
52+ ```yaml
53+ addons:
54+ - name: fabric
55+ block: true
56+ param:
57+ fabricMode: underlay
58+ cidrBlock: "10.250.0.0/16" # 按实际情况填写,填写后同时设置bkecluster.spec.clusterConfig.cluster.networking.podSubnet与其一致
59+ excludeIps: "" # 没有则填写 "",支持ip段和单个ip,使用英文","分割。eg: "10.250.0.1-10.250.0.10,10.250.0.55"
60+ vlanID: "" # 按实际情况填写
61+ gateway: "10.250.0.254" # 按实际情况填写
62+ mask: "24" # 按实际情况填写
63+ dataPlaneUnified: "eth1" # 按实际情况填写
64+ version: 2.6.2
65+ - name: coredns
66+ block: true
67+ version: v1.10.1
68+ ```
69+ 
70+- calico
71+ 
72+ 根据实际需要,调整calicoMode 来改变calico的网络模式,支持填写`vxlan、bgp、ipip`之一
73+ 
74+ 根据实际需要,调整proxyMode 来设置kubeproxy转发模式,支持填写`iptables、ipvs`之一,可不填该参数
75+
76+ ```yaml
77+ addons:
78+ # kubeproxy 版本以k8s版本为准
79+ - name: kubeproxy
80+ param:
81+ proxyMode: iptables # iptables、ipvs
82+ version: v1.25.6 # 版本以spec中定义的k8s版本为准
83+ block: true
84+ - name: calico
85+ param:
86+ calicoMode: vxlan # vxlan bgp ipip
87+ version: v3.25.0
88+ block: true
89+ - name: coredns
90+ version: v1.10.1
91+ block: true
92+ ```
93+ 
94+#### 组件名称:kubeporxy
95+ 
96+根据k8s集群版本选择
97+ 
98+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
99+| -------- | -------- | ----------------- | -------------- | -------- | ---- | ---------- | ------------------------------------------------------------ |
100+| v1.21.1 | 是 | proxyMode | iptables、ipvs | iptables | 否 | v1.21.1 | 设置kubeproxy的转发模式,无ipvs使用需求时,该参数可以不用设置,默认iptables |
101+| v1.23.17 | 是 | 参数与v1.21.1一致 | | | | v1.23.17 | |
102+| v1.25.6 | 是 | 参数与v1.21.1一致 | | | | v1.25.6 | |
103+| v1.27.2 | 是 | 参数与v1.21.1一致 | | | | v1.27.2 | |
104+ 
105+#### 组件名称:calico
106+ 
107+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
108+| ------- | -------- | --------------------- | -------------- | ------ | ---- | ---------- | ------------------------------------------------------------ |
109+| v3.25.0 | 是 | calicoMode | vxlan,bgp,ipip | 无 | 是 | >1.21 | 建议优先使用vxlan |
110+| | | ipAutoDetectionMethod | "" | 无 | 否 | | all in one部署集群时需要设置该参数指定网卡,参数值设置请看该文档https://docs.tigera.io/calico/latest/reference/configure-calico-node#ip-autodetection-methods |
111+ 
112+#### 组件名称:fabirc
113+ 
114+此处参数说明仅供参考,具体配置请以对应版本的 Fabric 文档为准。
115+ 
116+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
117+| ----- | -------- | ------------------ | ----------------------- | ------ | ---- | ---------- | ------------------------------------------------------------ |
118+| 2.6.1 | 是 | 参数与2.6.2一致 | | | | | |
119+| 2.6.2 | 是 | fabricMode | overlay,underlay | 无 | 是 | >1.21 | fabirc不需要kubeproxy,支持overlay和underlay,当前版本 |
120+| | | cidrBlock | "" | 无 | 是 | | 网络范围,根据实际情况填写,填写后同时设置bkecluster.spec.clusterConfig.cluster.networking.podSubnet与其一致 |
121+| | | tunnelType | vxlan,gre,erspan,geneve | 无 | 否 | | overlay网络使用的协议,fabricMode为overlay时填写 |
122+| | | excludeIps | "" | 无 | 是 | | 排除的IP,没有则填写 "",支持ip段和单个ip,使用英文","分割。eg: "10.250.0.1-10.250.0.10,10.250.0.55" |
123+| | | subCIDRMask | "" | 无 | 否 | | overlay网络在节点划分的子网掩码,fabricMode为overlay时填写 |
124+| | | *vlanID* | "" | 无 | 否 | | vlan ID,fabricMode为underlay时填写 |
125+| | | *gateway* | "" | 无 | 否 | | 网关 ,fabricMode为underlay时填写 |
126+| | | *mask* | "" | 无 | 否 | | underlay网络在节点划分的子网掩码,fabricMode为underlay时填写 |
127+| | | *dataPlaneUnified* | "" | 无 | 否 | | underlay数据网卡,fabricMode为underlay时填写 |
128+ 
129+#### 组件名称:coredns
130+ 
131+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
132+| ------- | -------- | ------- | --------- | ------ | ---- | ---------- | -------- |
133+| v1.10.1 | 是 | 无 | 无 | 无 | 无 | >1.21 | 当前版本 |
134+ 
135+#### 组件名称:nfs-csi
136+ 
137+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
138+| ------ | -------- | --------- | --------- | ------ | ---- | ---------- | ----------- |
139+| v4.1.0 | 否 | nfsServer | "" | 无 | 是 | 无 | nfs服务器IP |
140+ 
141+#### 组件名称:bocoperator
142+ 
143+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
144+| ------ | -------- | ---------- | ---------- |------| ---- | ---------- |-----------------------------|
145+| latest | 否 | bocVersion | v4.0 | 无 | 是 | 无 | 目前只支持v4.0 |
146+| | | isLocalDB | true,false | true | 否 | | 是否本地安装mysql数据库 |
147+| | | dbHost | "" | 无 | 否 | | 外部数据库 用户提供地址,本地数据库,填写为mysql |
148+| | | dbPort | "" | 无 | 是 | | 用户提供,数据库端口 |
149+| | | dbUser | "" | 无 | 是 | | 用户提供,数据库用户 |
150+| | | dbPassword | "" | 无 | 是 | | 用户提供,数据库密码 |
151+| | | nfsServer | "" | 无 | 是 | | nfs 服务器IP |
152+ 
153+#### 组件名称:cluster-api
154+ 
155+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | kubernetes | 说明 |
156+| ------ | -------- |--------|------------|-------| ---------- |---------------------------------------|
157+| v1.4.3 | 是 | manage | true,false | false | >=v1.21 | 目标集群安装好cluster-api手是否在新集群上创建bc对集群进行纳管 |
158+ 
159+#### 组件名称:prometheus
160+ 
161+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | kubernetes | 说明 |
162+| ------- | -------- | ------- | --------- | ------ | ---------- | -------- |
163+| v2.32.1 | 否 | 无 | 无 | 无 | >=1.21 | 当前版本 |
164+ 
165+#### 组件名称:beyondac
166+ 
167+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | kubernetes | 说明 |
168+| ------ | -------- | ------- | --------- | ------ | ---------- | -------- |
169+| v2.0.2 | 否 | 无 | 无 | 无 | 无 | 无 |
170+| v2.0.4 | 否 | 无 | 无 | 无 | >=1.21 | 无 |
171+| v2.0.5 | 否 | 无 | 无 | 无 | >=1.21 | 当前版本 |
172+ 
173+#### 组件名称:beyondELB
174+ 
175+依赖prometheus,在prometheus之后安装
176+ 
177+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
178+| ------ | -------- | ------- | --------- | ------ | ---- | ---------- | ------------------------------------------------ |
179+| v2.1.5 | 否 | lbVIP | "" | 无 | 是 | >1.21 | ingress VIP,没有则填"",建议与lbNodes的ip同网段 |
180+| | | lbNodes | "" | 无 | 是 | >1.21 | ip以英文 ","分割。eg: "ip1,ip2" |
181+ 
182+#### 组件名称:kubewebshell
183+ 
184+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | kubernetes | 说明 |
185+| ----- | -------- | ------- | --------- | ------ | ---------- | -------- |
186+| 0.1.8 | 否 | 无 | 无 | 无 | >=1.21 | 当前版本 |
187+ 
188+#### 组件名称:kubehelm
189+ 
190+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | kubernetes | 说明 |
191+| ------ | -------- | ------- | --------- | ------ | ---------- | -------- |
192+| 1.6.13 | 否 | 无 | 无 | 无 | >=1.21 | 当前版本 |
193+ 
194+#### 组件名称:kubectl
195+ 
196+根据k8s集群版本选择
197+ 
198+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | kubernetes | 说明 |
199+| ----- | -------- | ------- | --------- | ------ | ---------- | -------- |
200+| v1.21 | 否 | 无 | 无 | 无 | =1.21 | 无 |
201+| v1.23 | 否 | 无 | 无 | 无 | =1.23 | 无 |
202+| v1.25 | 否 | 无 | 无 | 无 | 1.21-1.27 | 当前版本 |
203+ 
204+#### 组件名称:kubesecurity
205+ 
206+依赖prometheus,在prometheus之后安装
207+ 
208+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | kubernetes | 说明 |
209+| ------ | -------- | ------- | --------- | ------ | ------------- | -------- |
210+| v1.2.0 | 否 | 无 | 无 | 无 | >1.21当前版本 | 当前版本 |
211+ 
212+#### 组件名称:etcdbackup
213+ 
214+| 版本 | 阻塞安装 | 参数key | 参数value | 默认值 | 必填 | kubernetes | 说明 |
215+| ----- | -------- | --------- | --------- | ------ | ---- | ---------- | ------------------------------------------------------------ |
216+| 3.4.3 | 否 | backupDir | "" | 无 | 是 | >1.21 | etcd备份文件存放目录, 若主机不存在该目录将会自动创建,当前版本 |
@@ -0,0 +1,195 @@
1+### 配置文件示例
2+ 
3+#### 部署全量产品示例
4+ 
5+- 该配置为全量的高可用及生态组件,包括boc的部署配置,可根据实际情况修改
6+ 
7+```yaml
8+apiVersion: bke.bocloud.com/v1beta1
9+kind: BKECluster
10+metadata:
11+ name: bke-cluster
12+ namespace: bke-cluster
13+spec:
14+ controlPlaneEndpoint:
15+ host: x.x.x.x
16+ port: 36443
17+ clusterConfig:
18+ cluster:
19+ apiServer:
20+ port: "6443"
21+ controllerManager:
22+ etcd:
23+ dataDir: /var/lib/etcd
24+ scheduler:
25+ kubelet:
26+ manifestsDir: /etc/kubernetes/manifests
27+ kubernetesVersion: v1.25.6
28+ certificatesDir: /etc/kubernetes/pki
29+ networking:
30+ dnsDomain: cluster.local
31+ podSubnet: 192.168.0.0/16
32+ serviceSubnet: 10.96.0.0/12
33+ ntpServer: cn.pool.ntp.org:123
34+ imageRepo:
35+ domain: repo.example.com
36+ port: "40443"
37+ prefix: kubernetes
38+ httpRepo:
39+ domain: repo.example.com
40+ port: "40080"
41+ prefix: ""
42+ nodes:
43+ - hostname: master-1
44+ ip: 172.100.200.10
45+ username: root
46+ password: <ssh-password>
47+ port: "22"
48+ role:
49+ - master
50+ - etcd
51+ - hostname: master-2
52+ ip: 172.100.200.11
53+ username: root
54+ password: <ssh-password>
55+ port: "22"
56+ role:
57+ - master
58+ - etcd
59+ - hostname: master-3
60+ ip: 172.100.200.12
61+ username: root
62+ password: <ssh-password>
63+ port: "22"
64+ role:
65+ - master
66+ - etcd
67+ - hostname: worker-1
68+ ip: 172.100.200.13
69+ username: root
70+ password: <ssh-password>
71+ port: "22"
72+ role:
73+ - worker
74+ - hostname: worker-2
75+ ip: 172.100.200.14
76+ username: root
77+ password: <ssh-password>
78+ port: "22"
79+ role:
80+ - worker
81+ - hostname: worker-3
82+ ip: 172.100.200.15
83+ username: root
84+ password: <ssh-password>
85+ port: "22"
86+ role:
87+ - worker
88+ addons:
89+ - block: true
90+ name: fabric
91+ param:
92+ cidrBlock: 10.250.0.0/16
93+ excludeIps: ""
94+ fabricMode: overlay
95+ subCIDRMask: "24"
96+ tunnelType: vxlan
97+ version: 2.6.1
98+ - name: coredns
99+ version: v1.10.1
100+ - name: nfs-csi
101+ param:
102+ nfsServer: 192.168.2.221
103+ version: v4.1.0
104+ - name: prometheus
105+ version: v2.32.1
106+ - name: etcdbackup
107+ param:
108+ backupDir: /data/etcd_backup
109+ version: 3.4.3
110+ - block: true
111+ name: cluster-api
112+ version: v1.4.3
113+ - block: true
114+ name: bocoperator
115+ param:
116+ bocVersion: v4.0
117+ dbHost: mariadb
118+ dbPassword: <db-password>
119+ dbPort: "3306"
120+ dbUser: root
121+ isLocalDB: "true"
122+ nfsServer: 192.168.2.221
123+ version: latest
124+ customExtra:
125+ containerd: containerd-1.6.16-linux-{.arch}.tar.gz
126+```
127+ 
128+ 
129+ 
130+#### 仅部署k8s集群的极简配置
131+ 
132+```yaml
133+ 
134+apiVersion: bke.bocloud.com/v1beta1
135+kind: BKECluster
136+metadata:
137+ name: bke-cluster
138+ namespace: bke-cluster
139+spec:
140+ controlPlaneEndpoint:
141+ host: x.x.x.x
142+ port: 36443
143+ clusterConfig:
144+ cluster:
145+ kubernetesVersion: v1.25.6
146+ ntpServer: cn.pool.ntp.org:123
147+ imageRepo:
148+ domain: repo.example.com
149+ port: "40443"
150+ prefix: kubernetes
151+ yumRepo:
152+ domain: repo.example.com
153+ port: "40080"
154+ prefix: ""
155+ nodes:
156+ - hostname: master-1
157+ ip: 172.100.200.10
158+ username: root
159+ password: <ssh-password>
160+ port: "22"
161+ role:
162+ - master
163+ - etcd
164+ - hostname: worker-1
165+ ip: 172.100.200.13
166+ username: root
167+ password: <ssh-password>
168+ port: "22"
169+ role:
170+ - worker
171+ - hostname: worker-2
172+ ip: 172.100.200.14
173+ username: root
174+ password: <ssh-password>
175+ port: "22"
176+ role:
177+ - worker
178+ addons:
179+ - name: kubeproxy
180+ param:
181+ clusterNetworkMode: calico
182+ version: v1.25.6
183+ block: true
184+ - name: calico
185+ param:
186+ calicoMode: vxlan
187+ version: v3.25.0
188+ block: true
189+ - name: coredns
190+ version: v1.10.1
191+ block: true
192+ customExtra:
193+ containerd: containerd-1.6.16-linux-{.arch}.tar.gz
194+```
195+ 
@@ -0,0 +1,31 @@
1+### 集群检查
2+ 
3+ 
4+ 
5+#### kubernetes集群检查
6+ 
7+- 登录目标集群k8s master节点,执行如下命令
8+ 
9+```shell
10+$ kubectl get nodes
11+$ kubectl get pods -A
12+# 输出符合预期部署即完成
13+```
14+ 
15+#### boc校验
16+ 
17+- 浏览器打开boc页面
18+- 查看boc pod均running
19+ 
20+```shell
21+$ kubectl get pods -A
22+```
23+ 
24+#### 引导节点清理
25+ 
26+- 当管理集群部署完成后,引导节点执行如下清理指令
27+ 
28+```shell
29+$ bke reset
30+```
31+ 
@@ -0,0 +1,20 @@
1+ 
2+ 
3+#### KONK支持范围
4+ 
5+ 
6+ 
7+##### kubernetes版本范围
8+ 
9+- 目前支持的kubernetes范围为1.21.x-1.27.x
10+- 目前自带v1.21.1 v1.23.17 v1.25.6 版本镜像,其他的k8s版本需要自主将镜像传到镜像仓库,便可以支持部署
11+ 
12+#### 操作系统支持
13+ 
14+| 操作系统 | 架构 | 运行时 | 引导节点 |
15+| --------- | ------ | ----------------- | -------- |
16+| centos 7 | x86_64 | docker/containerd | 支持 |
17+| centos 8 | x86_64 | docker/containerd | 支持 |
18+| ubuntu 22 | x86_64 | docker/containerd | 支持 |
19+| kylin v10 | arm64 | docker/containerd | 支持 |
20+ 
@@ -0,0 +1,138 @@
1+### Kubernetes集群管理
2+ 
3+#### 集群扩容
4+ 
5+- 在集群ready状态下,才可进行扩容操作
6+ 
7+- 获取集群crd资源
8+ 
9+```shell
10+$ kubectl get bkecluster
11+```
12+ 
13+- 在bkecluster spec中存在字段 pause, 首先将其置于暂停状态
14+ 
15+```yaml
16+spec:
17+ pause: true
18+```
19+ 
20+- 然后再node中增加要添加的节点
21+- 注意该节点列表限制数为2048,当你有更多节点时可放置到和bkecluster同名的configmap中,与放在下边是一个意思
22+ 
23+```
24+spec:
25+ clusterConfig:
26+ nodes:
27+ - hostname: master-1
28+ ip: 172.100.200.10
29+ username: root
30+ password: <ssh-password>
31+ port: "22"
32+ role:
33+ - master
34+ - etcd
35+```
36+ 
37+- 恢复暂停状态,触发扩容
38+ 
39+```yaml
40+spec:
41+ pause: false
42+```
43+ 
44+ 
45+ 
46+#### 集群缩容
47+ 
48+- 在集群ready状态下,才可进行缩容操作
49+- 获取集群crd资源
50+ 
51+```shell
52+$ kubectl get bkecluster
53+```
54+ 
55+- 在bkecluster spec中存在字段 pause, 首先将其置于暂停状态
56+ 
57+```yaml
58+spec:
59+ pause: true
60+```
61+ 
62+- 设置预约删除注解
63+ 
64+```
65+metadata:
66+ annotations:
67+ # 节点预约删除,节点删除是个危险的动作故增加此注释做二次确认,默认无
68+ # 删除节点时除从spec中将节点删除,还需将要删除的节点ip填入,多个ip之间使用‘,’分割
69+ # 两步操作少之其一都不会触发节点删除
70+ bke.bocloud.com/appointment-deleted-nodes: "172.100.200.10"
71+```
72+ 
73+- 删除指定节点信息
74+ 
75+```
76+spec:
77+ clusterConfig:
78+ nodes:
79+ - hostname: master-1
80+ ip: 172.100.200.10
81+ username: root
82+ password: <ssh-password>
83+ port: "22"
84+ role:
85+ - master
86+ - etcd
87+```
88+ 
89+- 恢复暂停状态,触发缩容
90+ 
91+```yaml
92+spec:
93+ pause: false
94+```
95+ 
96+ 
97+ 
98+#### 删除集群
99+ 
100+- 设置bkecluster的spec.reset字段为true将销毁集群
101+- 在集群ready或者failed状态下,可删除集群
102+ 
103+```yaml
104+spec:
105+ reset: true # 此值为true则会销毁现有k8s集群
106+```
107+ 
108+#### DryRun
109+ 
110+- 仅仅做环境检查,并不安装集群
111+ 
112+```yaml
113+spec:
114+ dryRun: false # 此值为true则进做环境检查不安装k8s集群
115+```
116+ 
117+#### 部署暂停
118+ 
119+- 当再部署过程中,更改如下值可暂停部署
120+- 任意时刻可暂停部署
121+ 
122+```yaml
123+spec:
124+ pause: true # 将此值改为true可暂停正在部署的集群
125+```
126+ 
127+#### 集群升级
128+ 
129+- 修改bkecluster中 spce.clusterConfig.cluster.kubernetesVersion进行集群升级
130+- 只有在集群ready状态下才能升级,在升级过程中配置文件不允许改动
131+ 
132+```yaml
133+spec:
134+ clusterConfig:
135+ cluster:
136+ kubernetesVersion: v1.21.1 # 只能修改成比当前版本大的值
137+```
138+ 
@@ -0,0 +1,118 @@
1+### KONK纳管已经存在的集群,以及升级原bocloud创建的集群
2+ 
3+ 
4+ 
5+#### 升级原bocloud创建的管理集群
6+ 
7+要求
8+ 
9+- kubernetes集群使用原方式已经升级到v1.21版本
10+- 准备好管理集群的kubeconfig文件
11+- 需要一台空服务器作为引导节点
12+ 
13+第一步: 在引导节点将bke.tar.gz解压
14+ 
15+第二步:解压完成后,执行`bke init` 在本机启动k3s集群并部署cluster-api服务等
16+ 
17+第三步:准备好bkecluster.yaml文件
18+ 
19+```yaml
20+apiVersion: bke.bocloud.com/v1beta1
21+kind: BKECluster
22+metadata:
23+ name: boc-work1
24+ namespace: boc-work1
25+ annotations:
26+ # 部署新集群为"",纳管老的bocloud部署的集群值为bocloud,纳管其他来源的k8s用other
27+ bke.bocloud.com/cluster-from: "bocloud"
28+spec:
29+ # controlPlaneEndpoint 仅在使用k8s-token时填写,使用kubeconfig时不填写
30+ controlPlaneEndpoint:
31+ host: 192.0.2.101
32+ port: 6443
33+ clusterConfig:
34+ customExtra:
35+ # 指定bkeagent-launcher镜像,若未填写则使用默认值,默认值如下所示
36+ # 在进行纳管前请先确保目标集群能拉到该镜像
37+ bkeagent-launcher-image: "repo.example.com:40443/kubernetes/bkeagent-launcher:latest"
38+```
39+ 
40+第四步:然后执行 `bke cluster exist -f bkecluster.yaml -c kubeconfig` 将文件提交到集群内
41+ 
42+第五步:通过 `bke cluster list / bke cluster logs / kubectl get bkecluster -n boc-manager`等指令观察bkecluster是否已经收集完成管理集群信息
43+ 
44+第六步:等待`bkecluster`已经处于`ready`状态,然后修改`spec.clusterConfig.kubernetesVersion=v1.27.x`进行集群升级
45+ 
46+第七步:管理集群升级完成后,执行`bke reset` 删除引导节点上的k3s集群
47+ 
48+#### 管理集群纳管原bocloud部署的集群
49+ 
50+- 第一步:准备目标集群的kubeconfig文件,准备bkecluster.yaml文件
51+ 
52+```yaml
53+apiVersion: bke.bocloud.com/v1beta1
54+kind: BKECluster
55+metadata:
56+ name: boc-work1
57+ namespace: boc-work1
58+ annotations:
59+ # 部署新集群为"",纳管老的bocloud部署的集群值为bocloud,纳管其他来源的k8s用other
60+ bke.bocloud.com/cluster-from: "bocloud"
61+spec:
62+ # controlPlaneEndpoint 仅在使用k8s-token时填写,使用kubeconfig时不填写
63+ controlPlaneEndpoint:
64+ host: 192.0.2.101
65+ port: 6443
66+ clusterConfig:
67+ customExtra:
68+ # 指定bkeagent-launcher镜像,若未填写则使用默认值,默认值如下所示
69+ # 在进行纳管前请先确保目标集群能拉到该镜像
70+ bkeagent-launcher-image: "repo.example.com:40443/kubernetes/bkeagent-launcher:latest"
71+```
72+ 
73+- 第二步:将kubeconfig或k8s token作为secret提交到集群后,再将第一步的bkecluster.yaml提交到集群,
74+ 
75+ - kubeconfig secret命名规则
76+
77+ [bkecluster.name]-kubeconfig
78+
79+ kubectl创建实例:`kubectl create secret generic boc-work1-kubeconfig --namespace=boc-work1 --from-file=value=kubeconfig`
80+
81+ ```yaml
82+ apiVersion: v1
83+ kind: Secret
84+ metadata:
85+ name: boc-work1-kubeconfig
86+ namespace: boc-work1
87+ data:
88+ # 注意这里的key为value
89+ value: <kubeconfig content>
90+ ```
91+
92+ - k8s-token secret 命名规则
93+ 
94+ [bkecluster.name]-k8s-token
95+
96+ kubectl创建实例:`kubectl create secret generic boc-work1-k8s-token --namespace=boc-work1 --from-file=token=k8s-token`
97+
98+ ```yaml
99+ apiVersion: v1
100+ kind: Secret
101+ metadata:
102+ name: boc-work1-k8s-token
103+ namespace: boc-work1
104+ data:
105+ # 注意这里的key为token
106+ token: <k8s-token content>
107+ ```
108+
109+ - 创建证书时需要将相关secret创建到与bkecluster相同的namespace中
110+
111+ - 注意使用不同方式创建secret时,存储内容的的key一个为value一个为token
112+ - 注意使用token进行纳管时还要在BKECluster.spec 额外填写controlPlaneEndpoint.host和controlPlaneEndpoint.port
113+ - 注意BKE纳管集群依赖bkeagent-launcher镜像,在纳管前请先确保目标集群能拉到该镜像
114+- 第三步:等待收集完成目标集群信息
115+- 第四步:等待`bkecluster`已经处于`ready`状态,然后修改`spec.clusterConfig.kubernetesVersion=v1.27.x`进行集群升级
116+ 
117+#### 管理集群纳管其他方式创建的集群
118+ 纳管步骤与上方章节 管理集群纳管原bocloud部署的集群 一致但不支持纳管为KONK管理(对集群进行扩缩容删升级等操作)
@@ -0,0 +1,65 @@
1+## 健康集群维护注意事项
2+ 
3+当BKECluster处于Ready状态时,代表目标集群处于健康状态
4+ 
5+> Healthy和Unhealthy状态是BKECluster的最终状态。bke控制器对BKECluster的操作无异常后,最终都会处于Healthy状态(特殊的除外如暂停,集群异常,程序出错)
6+>
7+> Healthy状态由bke控制器主动检查后设置和watch远端集群节点状态被动触发检查设置,当远端集群的某一节点状态变化时,将会触发bke控制器的健康检查,任一节点Not-Ready都会让状态变为Unhealthy
8+ 
9+#### BKECluster资源修改
10+ 
11+- 注解(annotations)允许修改的key-value
12+ 
13+| key | 是否立即生效 | 修改后影响范围 | 备注 |
14+| -------------------------------------------- | ------------ | ------------------------------ | ------------------------------------------------------------ |
15+| bke.bocloud.com/bkeagent-listener | 是 | agent监听 | 切换agent监听 |
16+| bke.bocloud.com/deep-restore-node | 否 | 节点新增,节点删除,集群删除 | 节点环境初始化,节点删除,集群删除时清理容器运行时(docker containerd) |
17+| bke.bocloud.com/ignore-target-cluster-delete | 否 | 集群删除 | 删除bc时是否将集群也移除 |
18+| bke.bocloud.com/ignore-namespace-delete | 否 | 集群删除 | 删除bc时是否连同bc所在namespace一起删除 |
19+| bke.bocloud.com/node-boot-wait-timeout | 否 | 节点新增 | 节点引导timeout时间,在面对网络速度差的环境建议调大 |
20+| bke.bocloud.com/appointment-deleted-nodes | 否 | 节点预约删除 | 配合spec删除节点触发节点删除 |
21+| bke.bocloud.com/master-schedulable | 否 | 新增master节点,master节点调度 | 设置master节点能否调度,对已有master节点不生效 |
22+ 
23+- 注解(annotations)**不允许**修改的key-value
24+ 
25+| key | 是否立即生效 | 修改后影响范围 | 备注 |
26+| ---------------------------- | ------------ | -------------- | ------------------------------------------------------------ |
27+| bke.bocloud.com/cluster-from | 是 | 所有 | 该注解直接决定了bke控制器处理bc的方式,若修改将会导致Ready后的其他所有操作出错,如节点扩缩容等 |
28+ 
29+- spec允许修改的字段
30+ 
31+| 字段 | 是否立即生效 | 修改后影响范围 | 备注 |
32+| --------------------------------------- | ------------ | ------------------------------- | ------------------------------------------------------------ |
33+| pasue | 是 | 集群暂停 | |
34+| reset | 是 | 集群删除 | 等同于删除bc |
35+| clusterConfig.cluster.apiServer | 否 | 新增master节点 | 对已有master节点不生效 |
36+| clusterConfig.cluster.controllerManager | 否 | 新增master节点 | 对已有master节点不生效 |
37+| clusterConfig.cluster.etcd | 否 | 新增master节点 | 对已有master节点不生效 |
38+| clusterConfig.cluster.scheduler | 否 | 新增master节点 | 对已有master节点不生效 |
39+| clusterConfig.cluster.kubelet | 否 | 新增master节点 | 对已有master节点不生效 |
40+| clusterConfig.cluster.containerRuntime | 否 | 新增节点,节点删除,集群删除 | 修改后会影响后续的加入的节点,删除节点和集群时会影响所有节点,可能会导致容器运行时数据无法清理干净 |
41+| clusterConfig.cluster.kubernetesVersion | 是 | 集群升级 | 修改后会进行集群升级,只允许升级版本,操作不可逆!! |
42+| clusterConfig.cluster.certificatesDir | 否 | 新增节点,节点删除,集群删除 | 修改后会影响后续的加入的节点,删除节点和集群时会影响所有节点,可能会导致证书目录无法按预期清空 |
43+| clusterConfig.cluster.ntpServer | 否 | 新增节点 | 对已有节点不生效 |
44+| clusterConfig.cluster.imageRepo | 否 | 新增节点 | 对已有节点不生效 |
45+| clusterConfig.cluster.httpRepo | 否 | 新增节点 | 对已有节点不生效 |
46+| clusterConfig.nodes | 是 | 新增节点,删除节点 | 删除节点需配置bke.bocloud.com/appointment-deleted-nodes注解实现节点删除 |
47+| clusterConfig.addons | 是 | addon部署,addon卸载,addon升级 | |
48+ 
49+- spec**不允许**修改的字段
50+ 
51+| 字段 | 是否立即生效 | 影响范围 | 备注 |
52+| -------------------------------- | ------------ | -------------- | ------------------------------------------ |
53+| controlPlaneEndpoint | | | 程序限制不可修改 |
54+| clusterConfig.cluster.networking | 否 | 新增master节点 | 确保集群中各master节点网络参数一致,勿修改 |
55+ 
56+### Q&A
57+ 
58+1. 为何这么多的字段都允许修改?
59+ 
60+ 目前bke还不稳定,需求瞬息万变无法确定。所以程序在处理时尽可能的放宽松了bc的修改,后续版本中将尽可能通过webhook限制使用者的修改操作
61+ 
62+ 
63+ 
64+ 
65+ 
@@ -0,0 +1,88 @@
1+### 制作部署资源模板
2+ 
3+- 在代码仓库中,存在一个manifests项目用来专门存放k8s资源部署文件以及boc等产品的历次版本部署文件
4+ 
5+#### 项目结构
6+ 
7+- 该仓库存储结构如下所示,截取了部分展示
8+ 
9+```shell
10+$ tree -L 3
11+├── boc
12+│ ├── v3.5
13+│ │ ├── 000-block-mysql.yaml
14+│ │ ├── 010-import.yaml
15+│ │ ├── 020-pipeline.yaml
16+│ │ ├── 030-base.yaml
17+│ │ ├── 040-licenseserver.yaml
18+│ │ ├── 050-route.yaml
19+│ │ ├── 060-task.yaml
20+│ │ ├── 070-upms.yaml
21+│ │ ├── 080-web.yaml
22+│ │ ├── 090-shared.yaml
23+│ │ ├── 100-boc.yaml
24+│ │ └── deploy.yaml
25+├── kubernetes
26+│ ├── bocoperator
27+│ │ ├── beta
28+│ │ └── latest
29+│ ├── calico
30+│ │ ├── v3.14.1
31+│ │ └── v3.7.5
32+│ ├── cluster-api
33+│ │ └── v1.1.4
34+│ ├── coredns
35+│ │ └── v1.8.0
36+│ ├── efk
37+│ │ └── 7.13.1
38+│ ├── fabric
39+│ │ └── 2.12.0
40+│ ├── kubeproxy
41+│ │ └── 1.21.1
42+│ ├── logrotate
43+│ │ └── 1.2
44+│ ├── nfs-csi
45+│ │ └── v4.1.0
46+│ └── prometheus
47+│ └── v2.11.0
48+```
49+ 
50+#### 模板yaml及参数规则
51+ 
52+- 这里截取nfs-csi/v4.1.0中部分yaml展示
53+ 
54+```yaml
55+apiVersion: storage.k8s.io/v1
56+kind: StorageClass
57+metadata:
58+ name: nfs-csi
59+provisioner: nfs.csi.k8s.io
60+parameters:
61+ server: {\{ .nfsServer }\} # go template 去掉\
62+ share: /
63+ # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume
64+ # csi.storage.k8s.io/provisioner-secret-name: "mount-options"
65+ # csi.storage.k8s.io/provisioner-secret-namespace: "default"
66+reclaimPolicy: Retain
67+volumeBindingMode: Immediate
68+mountOptions:
69+ - nfsvers=4.1
70+```
71+ 
72+#### Addons
73+ 
74+- 在删除yaml中可以看到 `{\{ .nfsServer }\} (去掉\)`部分,这addons中使用如下方式替换
75+ 
76+```yaml
77+addons:
78+ - name: nfs-csi # 待部署的组件,对应kubernetes下的nfs-csi目录
79+ version: v4.1.0 # 版本,对应nfs-csi下的版本目录
80+ block: true
81+ param:
82+ nfsServer: 192.0.2.186 # 对应v4.1.0目录中yaml文件中的 {\{ .nfsServer }\} 参数
83+```
84+ 
85+#### boc相关资源文件
86+ 
87+- 在bocoperator章节介绍
88+ 
@@ -0,0 +1,247 @@
1+### 依赖包制作
2+ 
3+bke要完善运行,需要比较多的依赖包以及这些依赖包要按照规则来制作,下边我们来介绍一下各个依赖包以及制作规则
4+ 
5+#### RPM源
6+ 
7+- 首先启动一个Nginx服务,其可供下载的目录结构如下所示
8+ 
9+```shell
10+$ tree -L 4
11+├── CentOS
12+│ ├── 7
13+│ │ ├── amd64
14+│ │ │ ├── docker-ce
15+│ │ │ └── nfs-utils
16+│ │ └── arm64
17+│ └── 8
18+│ ├── amd64
19+│ │ └── docker-ce
20+│ └── arm64
21+├── files
22+│ ├── bke
23+│ ├── charts.tar.gz
24+│ ├── containerd-1.6.16-linux-amd64.tar.gz
25+│ ├── kubectl-v1.25.6-amd64
26+│ ├── kubectl-v1.25.6-arm64
27+│ └── nfsshare.tar.gz
28+└── Kylin
29+ └── V10
30+ ├── amd64
31+ └── arm64
32+```
33+ 
34+##### kubectl
35+ 
36+- kubectl文件,放置在files目录下
37+ 
38+- 命名要求
39+ 
40+```shell
41+# template: kubectl-{.version}-{.arch}
42+# example: kubectl-v1.25.6-amd64
43+```
44+ 
45+- 用途
46+ 
47+```shell
48+# 当k8s集群部署完成后,会从该目录下载和k8s版本对应的kubectl文件放到master节点,若没有则下载失败
49+```
50+ 
51+##### bke
52+ 
53+- bke文件,放置在files目录下
54+ 
55+- 命名要求
56+ 
57+```shell
58+# template: bke_{.arch}
59+# example: bke
60+# example: bke_amd64
61+# example: bke_arm64
62+```
63+ 
64+- 用途
65+ 
66+```shell
67+# 解压bke.tar.gz包时,该文件会被解压到/usr/bin目录下
68+# 对于单架构部署包,bke文件位置为/usr/bin/bke
69+# 对于多架构部署包,bke文件位置为/usr/bin/bke_amd64 和 /usr/bin/bke_arm64, 用户需要根据系统架构选择合适的bke文件
70+```
71+ 
72+##### charts
73+ 
74+- chart仓库所需要的数据文件,放置在files目录下
75+- 命名要求
76+ 
77+```shell
78+# 必须名称:charts.tar.gz
79+# 必须名称:charts.tar.gz-v4.0
80+```
81+ 
82+- charts.tar.gz内目录结构
83+ 
84+```shell
85+$ tree charts
86+charts
87+├── efk-7.3.0.tgz
88+├── elasticsearch-1.32.1.tgz
89+├── elasticsearch-1.32.2.tgz
90+├── redis-ha-4.4.2.tgz
91+├── redis-ha-4.4.3.tgz
92+├── redis-ha-4.4.4.tgz
93+└── tomcat-0.5.0.tgz
94+# 打包
95+$ tar czvf charts.tar.gz charts/
96+```
97+ 
98+- 用途
99+ 
100+```shell
101+# bke会启动chart仓库,以供k8s集群使用
102+```
103+ 
104+##### nfsshare
105+ 
106+- nfs server 数据共享所需要的数据文件
107+- 命名要求
108+ 
109+```shell
110+# 必须名称:nfsshare.tar.gz
111+# 必须名称:nfsshare.tar.gz-v4.0
112+```
113+ 
114+- nfsshare.tar.gz内目录结构
115+ 
116+```shell
117+# 注意该目录下文件是直接能挂载的目录,并不是tar包
118+# 比如jenkins_home.tar.gz需要解压放到此nfsshare目录下,然后重新打出nfsshare.tar.gz包
119+$ tree nfsshare -L 1
120+nfsshare
121+├── duoyinzi_pinyin.txt
122+├── jenkins_home
123+├── logo
124+└── postgres
125+# 打包
126+$ tar czvf nfsshare.tar.gz nfsshare/
127+```
128+ 
129+- 用途
130+ 
131+```shell
132+# 为各个业务系统提供需要的数据
133+```
134+ 
135+##### containerd
136+ 
137+- containerd是部署集群必须装的组件,放置在files下
138+- 命名要求
139+ 
140+```shell
141+# template: containerd-{.version}-linux-{.arch}.tar.gz
142+# example: containerd-1.6.16-linux-amd64.tar.gz
143+```
144+ 
145+- containerd-1.6.16-linux-amd64.tar.gz包内目录结构
146+ 
147+```shell
148+# 在该包中包含了contaienrd、ctr、crictl、nerdctl、runc、beyondvm等文件,在目标节点解压该包便完成了containerd的安装
149+$ tree
150+├── etc
151+│ ├── containerd
152+│ └── crictl.yaml
153+└── usr
154+ ├── bin
155+ │ ├── containerd
156+ │ ├── containerd-shim
157+ │ ├── containerd-shim-runc-v1
158+ │ ├── containerd-shim-runc-v2
159+ │ ├── crictl
160+ │ ├── ctr
161+ │ └── nerdctl
162+ ├── lib
163+ │ └── systemd
164+ │ └── system
165+ │ └── containerd.service
166+ └── local
167+ ├── beyondvm
168+ │ └── runc
169+ └── sbin
170+ └── runc
171+# 打包
172+$ tar czvf containerd-1.6.16-linux-amd64.tar.gz *
173+```
174+ 
175+- 用途
176+ 
177+```shell
178+# 在bkeconfig.yaml配置文件中,containerd为必填项,位置如下
179+customExtra:
180+ containerd: "containerd-1.6.16-linux-{.arch}.tar.gz"
181+# 对于不同的系统架构及containerd版本需要制作多种多样的containerd文件
182+# bkeagent会根据所在宿主机架构,下载相对应的containerd文件来安装
183+```
184+ 
185+##### docker-ce
186+ 
187+- docker的安装是完全的rpm包,该rpm包根据`系统/版本/架构/名称`的方式来存储
188+ 
189+- 命名要求
190+ 
191+```shell
192+# 必须名称: docker-ce
193+```
194+ 
195+- 存储位置及结构
196+ 
197+```shell
198+$ tree CentOS/7/amd64/docker-ce/
199+CentOS/7/amd64/docker-ce/
200+├── acl-2.2.51-15.el7.x86_64.rpm
201+├── audit-libs-2.8.5-4.el7.i686.rpm
202+...
203+# docker-ce 20, 共计200+rpm包,容量略大于200M
204+```
205+ 
206+- 用途
207+ 
208+```shell
209+# 目前引导节点已使用containerd, docker server 可不收集
210+```
211+ 
212+##### 麒麟系统docker安装包制作
213+ 
214+- 麒麟系统需要升级docker到24.0.7,docker24.0.7可以通过解压压缩包的方式安装和containerd安装类似
215+ 
216+- 命名要求
217+ 
218+```shell
219+# 必须名称: docker-24.0.7-kylin-arm64.tar.gz
220+```
221+ 
222+- docker-24.0.7-kylin-arm64.tar.gz 目录内结构
223+ 
224+```shell
225+# tree
226+└── usr
227+ ├── bin
228+ │ ├── containerd
229+ │ ├── containerd-shim-runc-v2
230+ │ ├── ctr
231+ │ ├── docker
232+ │ ├── dockerd
233+ │ ├── docker-init
234+ │ ├── docker-proxy
235+ │ └── runc
236+ └── lib
237+ └── systemd
238+ └── system
239+ └── docker.service
240+```
241+ 
242+- 用途
243+ 
244+```shell
245+# 在麒麟系统中安装的docker
246+```
247+ 
@@ -0,0 +1,143 @@
1+### 构建部署包
2+ 
3+ 
4+ 
5+#### 前提条件
6+ 
7+- 准备一台服务器,在其上安装镜像仓库以及Nginx服务
8+- 镜像仓库收集了所有镜像包
9+- Nginx服务下已经安装依赖组件准备好所有文件
10+- 构建服务器存在docker环境
11+- 构建服务需要安装pigz,加快打包速度
12+ 
13+#### 构建部署包
14+ 
15+- 构建部署包,根据构建部署包的大小构建时间不同
16+ 
17+- 建议在镜像仓库所在服务器进行,大大加快构建速度
18+ 
19+```shell
20+$ bke build -f build.yaml
21+```
22+ 
23+- 生成部署包命名规则
24+ 
25+```shell
26+# template: bke-{.version}-{.filename}-{.arch}-{.timestamp}.tar.gz
27+# example: bke-v1.0.0-build-amd64-20221111151806.tar.gz
28+```
29+ 
30+#### 部署包结构
31+ 
32+```shell
33+$ tree
34+├── bke
35+│ ├── manifests.yaml # 该部署包的配置文件
36+│ └── volumes
37+│ ├── image.tar.gz # 镜像仓库的数据包,包含大量的镜像文件
38+│ ├── registry.image-amd64 # 镜像仓库的镜像,通过类docker load 指令还原为镜像
39+│ └── source.tar.gz # 数据包,包含rpm源数据、nfsshare数据等等
40+└── usr
41+ └── bin
42+ └── bke # bke文件,多架构情况下会展示为bke_adm64 bke_arm64 俩文件
43+```
44+ 
45+ 
46+ 
47+#### 配置文件
48+ 
49+- 该配置文件是一个混合架构配置文件,仅做演示
50+ 
51+```yaml
52+# 必须内容,该镜像会被收集为部署包中的bke/volumes/registry.image-amd64
53+registry:
54+ imageAddress: registry.example.com/kubernetes/registry:2.8.1
55+ architecture:
56+ - amd64
57+# 镜像列表,收集为部署包中的bke/volumes/image.tar.gz
58+repos:
59+ - architecture:
60+ - amd64
61+ - arm64
62+ sourceRepo: registry.example.com/carina
63+ targetRepo: carina
64+ images:
65+ - name: carina-scheduler
66+ tag:
67+ - v0.11.1
68+ - name: kube-webhook-certgen
69+ tag:
70+ - v1.1.1
71+ - name: csi-resizer
72+ tag:
73+ - v1.5.0
74+ - name: csi-node-driver-registrar
75+ tag:
76+ - v2.0.1
77+ - name: livenessprobe
78+ tag:
79+ - v2.7.0
80+ - architecture:
81+ - amd64
82+ sourceRepo: registry.example.com/kubernetes
83+ targetRepo: kubernetes
84+ images:
85+ - name: nfs-server-alpine # 必须存在
86+ tag:
87+ - 0.9.0
88+ - name: nginx_yum_repo # 必须存在
89+ tag:
90+ - 1.23.0-alpine
91+ - name: chartmuseum # 必须存在
92+ tag:
93+ - v0.12.0
94+ - name: k3s # 必须存在
95+ tag:
96+ - v1.25.6-k3s1
97+ - name: mirrored-pause # 必须存在
98+ tag:
99+ - 3.6
100+# 源文件,收集为部署包中的bke/volumes/source.tar.gz
101+# 目前部署k8s集群不需要docker
102+rpms:
103+ - address: http://registry.example.com:40080/
104+ system:
105+ - CentOS
106+ systemVersion:
107+ - "7"
108+ systemArchitecture:
109+ - amd64
110+ directory:
111+ - docker-ce
112+files:
113+ - address: http://registry.example.com:40080/files/
114+ files:
115+ - bke # 必须存在 或者 bke_amd64/bke_arm64
116+ - containerd-1.6.16-linux-amd64.tar.gz # 必须存在
117+ - charts.tar.gz # 必须存在 或者 charts.tar.gz-v4.0
118+ - nfsshare.tar.gz # 必须存在 或者 charts.tar.gz-v4.0
119+ - kubectl-v1.25.6-amd64 # 必须存在
120+ - cni-plugins-linux-amd64-v1.2.0.tgz # 必须存在
121+```
122+ 
123+- 备注①: 该配置文件各个组件均支持多架构收集,一旦出现某个收集包不存在即会构建失败
124+- 备注②:rpms是目录文件,会收集对应包下的所有rpm包
125+- 备注③:files是一些需要下载的数据包
126+- 备注④:有一些配置文件中必须存在的内容,不存在则无法构建
127+- 备注⑤:特殊一点的bke在拉取镜像时,会尝试拉取目标镜像(image-name:tag)以及镜像(image-name:tag-arch),当这两个镜像均不存在时,则会构建失败
128+ 
129+| 类型 | 名称 | 校验 | 必须存在 |
130+| ---- | -------------------------------------------------- | -------- | -------- |
131+| 镜像 | nfs-server-alpine:0.9.0 | 精确匹配 | 是 |
132+| 镜像 | nginx_yum_repo:1.23.0-alpine | 精确匹配 | 是 |
133+| 镜像 | chartmuseum:v0.12.0 | 精确匹配 | 是 |
134+| 镜像 | k3s:v1.25.7-k3s1 | 精确匹配 | 是 |
135+| 镜像 | mirrored-pause:3.6 | 精确匹配 | 是 |
136+| 文件 | bke \| bke_amd64 \| bke_arm64 | 前缀匹配 | 是 |
137+| 文件 | charts.tar.gz \| charts.tar.gz-v4.0 | 前缀匹配 | 是 |
138+| 文件 | nfsshare.tar.gz \| charts.tar.gz-v4.0 | 前缀匹配 | 是 |
139+| 文件 | containerd \| containerd-1.6.16-linux-amd64.tar.gz | 前缀匹配 | 是 |
140+| 文件 | cni-plugins-linux-amd64-v1.2.0.tgz | 前缀匹配 | 是 |
141+| 文件 | kubectl | 未校验 | 是 |
142+| rpm | docker-ce | 未校验 | 否 |
143+