使用 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 下载对应的离线安装包

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 体系架构

解压

$ 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
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
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 格式
# 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 格式
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 格式
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
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

部署集群

$ bash install.sh

增加节点

$ bash install.sh add-node $NODE_NAMES

删除节点

$ bash install.sh remove-node $NODE_NAME

移除集群

$ bash install.sh remove-cluster

移除所有组件

$ bash install.sh remove

未完后续补充