使用 kubeplay 来离线部署 kubernetes 集群

简介

kubeplay 是基于 kubespray 实现的离线部署 kuberneres 集群的工具

特性

  • 包含所有依赖,一条命令即可完成离线安装
  • 支持 amd64 和 arm64 CPU 架构
  • kubeadm 生成的证书有效期调整为 10 年
  • 去 docker 化部署,无缝迁移至 containerd 作为容器运行时
  • 适用于 toB 私有化场景,可离线安装平台所依赖的 rpm/deb 包(如存储客户端)
  • 多集群部署,支持在 kubernetes 集群中以 Job Pod 方式部署 kubernetes 集群
  • 使用 GitHub Actions 构建离线安装包,无需充值会员,100% 开源 100% 免费

组件版本

addon version 用途
kubernetes v1.21.3 kubernetes
containerd v1.4.6 容器运行时
etcd v3.4.13 etcd 服务
crictl v1.21.0 CRI CLI 工具
pause 3.3 pause 容器镜像
cni-plugins v0.9.1 CNI 插件
calico v3.18.4 calico
autoscaler 1.8.3 DNS 自动扩缩容
coredns v1.8.0 集群 DNS 服务
flannel v0.14.0 flannel
nginx 1.19 node 节点反向代理 APIserver
canel calico/flannel 集成 calico 和 flannel
helm v3.6.3 helm CLI 工具
nerdctl 0.8.0 containerd CLI 工具
nerdctl-full 0.11.0 containerd 工具全家桶
registry v2.7.1 提供镜像下载服务
skopeo v1.4.0 镜像搬运工具

支持 OS

distribution version arch
CentOS 7.9 amd64/arm64
Debian 10 amd64/arm64
Ubuntu 20.04 amd64/arm6

compose

在部署工具运行节点使用 nerdctl compose 启动 nginx 和 registry 容器,分别提供离线资源下载和镜像分发服务。

kubespray

使用 kubernetes 社区的 kubespray 作为集群部署的功能,部署过程中所依赖的资源从 compose 节点获取。

部署

下载

在 GitHub 的 release 页面 k8sli/kubeplay/releases 下载对应的离线安装包

1
2
3
sha256sum                                    # 安装包 sha256sum 校验文件
kubeplay-v0.1.0-alpha.1-linux-amd64.tar.gz # 适用于 amd64 CPU 体系架构
kubeplay-v0.1.0-alpha.1-linux-arm64.tar.gz # 适用于 arm64 CPU 体系架构

解压

1
2
3
$ tar -xpf kubeplay-v0.1.0-alpha.1-linux-amd64.tar.gz
$ cd kubeplay
$ vi config.yaml

配置

config.yaml 配置文件主要分为如下几个部分

  • compose:nginx 和 registry 部署节点信息
  • kubespray:kubespray 部署配置
  • invenory:kubernetes 集群节点 ssh 登录信息
  • default:一些默认的参数

compose

参数 说明 示例
internal_ip 部署节点内网访问 IP 192.168.10.11
nginx_http_port 部署 nginx 服务暴露的端口 8080
registry_domain 部署 registry 镜像仓库服务的域名 kube.registry.local
1
2
3
4
5
6
7
compose:
# Compose bootstrap node ip, default is local internal ip
internal_ip: 172.20.0.25
# Nginx http server bind port for download files and packages
nginx_http_port: 8080
# Registry domain for CRI runtime download images
registry_domain: kube.registry.local

kubespray

参数 说明 示例
kube_version kubernetes 版本号 v1.21.3
external_apiserver_access_ip 集群APIserver外部访问 IP 192.168.10.100
kube_network_plugin 选用 CNI 网络插件名称 calico
container_manager 容器运行时 containerd
etcd_deployment_type etcd 部署方式 host
1
2
3
4
5
6
7
8
9
10
11
12
13
14
kubespray:
# Kubernetes version by default, only support v1.20.6
kube_version: v1.21.3
# For deploy HA cluster you must configure a external apiserver access ip
external_apiserver_access_ip: 127.0.0.1
# Set network plugin to calico with vxlan mode by default
kube_network_plugin: calico
#Container runtime, only support containerd if offline deploy
container_manager: containerd
# Now only support host if use containerd as CRI runtime
etcd_deployment_type: host
# Settings for etcd event server
etcd_events_cluster_setup: true
etcd_events_cluster_enabled: true

inventory

inventory 为 kubernetes 集群节点的 ssh 登录配置,支持 yaml, json, ini 三种格式。

参数 说明 示例
ansible_port 主机 ssh 登录端口号 22
ansible_user 主机 ssh 登录用户名
ansible_ssh_pass 主机 ssh 登录密码
ansible_ssh_private_key_file 如果使用 private key 登录 必须为/kubespray/config/id_rsa
ansible_host 节点 IP
  • yaml 格式
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
# Cluster nodes inventory info
inventory:
all:
vars:
ansible_port: 22
ansible_user: root
ansible_ssh_pass: Password
# ansible_ssh_private_key_file: /kubespray/config/id_rsa
hosts:
node1:
ansible_host: 172.20.0.21
node2:
ansible_host: 172.20.0.22
node3:
ansible_host: 172.20.0.23
node4:
ansible_host: 172.20.0.24
children:
kube_control_plane:
hosts:
node1:
node2:
node3:
kube_node:
hosts:
node1:
node2:
node3:
node4:
etcd:
hosts:
node1:
node2:
node3:
k8s_cluster:
children:
kube_control_plane:
kube_node:
gpu:
hosts: {}
calico_rr:
hosts: {}
  • json 格式
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
inventory: |
{
"all": {
"vars": {
"ansible_port": 22,
"ansible_user": "root",
"ansible_ssh_pass": "Password"
},
"hosts": {
"node1": {
"ansible_host": "172.20.0.21"
},
"node2": {
"ansible_host": "172.20.0.22"
},
"node3": {
"ansible_host": "172.20.0.23"
},
"node4": {
"ansible_host": "172.20.0.24"
}
},
"children": {
"kube_control_plane": {
"hosts": {
"node1": null,
"node2": null,
"node3": null
}
},
"kube_node": {
"hosts": {
"node1": null,
"node2": null,
"node3": null,
"node4": null
}
},
"etcd": {
"hosts": {
"node1": null,
"node2": null,
"node3": null
}
},
"k8s_cluster": {
"children": {
"kube_control_plane": null,
"kube_node": null
}
},
"gpu": {
"hosts": {}
},
"calico_rr": {
"hosts": {}
}
}
}
}
  • ini 格式
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
inventory: |
[all:vars]
ansible_port=22
ansible_user=root
ansible_ssh_pass=Password
#ansible_ssh_private_key_file=/kubespray/config/id_rsa

[all]
kube-control-01 ansible_host=172.20.0.21
kube-control-02 ansible_host=172.20.0.23
kube-control-03 ansible_host=172.20.0.22
kube-node-01 ansible_host=172.20.0.24

[bastion]
# bastion-01 ansible_host=x.x.x.x ansible_user=some_user

[kube_control_plane]
kube-control-01
kube-control-02
kube-control-03

[etcd]
kube-control-01
kube-control-02
kube-control-03


[kube_node]
kube-control-01
kube-control-02
kube-control-03
kube-node-01

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

default

以下几个默认的参数在没有特殊要求的情况下不建议修改,直接保持默认即可。ntp_server 参数为默认值时会自动替换成 compose 中的 internal_ip 值;registry_ipoffline_resources_url 这两个参数会根据 compose 中的参数自动生成无需修改。

参数 说明 示例
ntp_server ntp 时钟同步服务器域名或 IP -
registry_ip 镜像仓库节点 IP -
offline_resources_url 提供离线资源下载的 URL 地址 -
offline_resources_enabled 是否为离线部署 true
generate_domain_crt 是否为镜像仓库域名生成自签证书 true
image_repository 镜像仓库的 repo 或 project library
registry_https_port 镜像仓库的端口号,该端口已禁止 PUSH 镜像 443
registry_push_port 用于 PUSH 镜像的 registry 端口号 5000
download_container 是否在所有节点 pull 下所有组件的镜像 false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
default:
# NTP server ip address or domain, default is internal_ip
ntp_server:
- internal_ip
# Registry ip address, default is internal_ip
registry_ip: internal_ip
# Offline resource url for download files, default is internal_ip:nginx_http_port
offline_resources_url: internal_ip:nginx_http_port
# Use nginx and registry provide all offline resources
offline_resources_enabled: true
# Image repo in registry
image_repository: library
# Kubespray container image for deploy user cluster or scale
kubespray_image: "kubespray"
# Auto generate self-signed certificate for registry domain
generate_domain_crt: true
# For nodes pull image, use 443 as default
registry_https_port: 443
# For push image to this registry, use 5000 as default, and only bind at 127.0.0.1
registry_push_port: 5000
# Set false to disable download all container images on all nodes
download_container: false

部署集群

1
$ bash install.sh

增加节点

1
$ bash install.sh add-node $NODE_NAMES

删除节点

1
$ bash install.sh remove-node $NODE_NAME

移除集群

1
$ bash install.sh remove-cluster

移除所有组件

1
$ bash install.sh remove

未完后续补充