1. 版本申明

版本 修改内容 修改时间
v1.0 初始版本 3/26/2024
v1.1 更新文档内容 4/17/2024
v1.2 优化一些内容 6/12/2024

2. 简介

k8s-installer基于sealer构建的用于k8s集群快速部署的工具,同时基于sealer可以实现将整个K8S集群制作成镜像,从而提供一种“开箱即用”的应用封装技术。 更多详细内容请参考sealer官网文档http://sealer.cool/docs/introduction/introduction.html

3. 前置准备

3.1. 系统基本设置

  • 所有节点操作系统均为ubuntu 系统,当前暂不支持centos/redhat 系列;

  • 具备root用户权限;

  • 所有节点部署同一套ssh公钥,私钥部署在k8s-installer所在机器上/root/.ssh/id_rsa下;

  • 如果是部署单机伪集群,本机需要同时部署公钥和私钥;

  • 保证所有节点对外暴露IP互通(单机伪集群忽略);

3.2. 安装包准备

当前发布的安装包内容如下:

k8s-installer_<VERSION>/
├── bin
│   ├── helm
│   ├── podman
│   ├── sealer
│   └── _VERSION_.txt
├── enflame_k8s_installer_user_guide.md
├── k8s-installer.sh
├── LICENSE
├── preinstall.sh
├── README.md
└── rootfs
    ├── bin
    ├── build-image.sh
    ├── cri
    ├── etc
    ├── images
    ├── Kubefile
    └── scripts

其中:

  • bin, 前置依赖包安装文件

  • enflame_k8s_installer_user_guide.md,用户使用手册

  • k8s-installer.sh,k8s集群安装示例

  • LICENSE,协议文件

  • preinstall.sh,前置依赖包一键安装脚本

  • README.md , 简单的README文档

  • rootfs, k8s镜像构建模版文件

4. 安装依赖包

注: 如果sealer, helm 已安装这一步跳过。

k8s-installer的使用依赖于sealer,helm 这两个工具,在构建 k8s集群镜像以及使用之前需要先安装这两个工具,安装步骤如下:

cd k8s-installer_<VERSION>
./preinstall.sh

# 或者 配置/bin/_VERSION_.txt内的版本后,重新下载 helm sealer以及podman
./preinstall.sh download

5. 使用示例

5.1. 下载并安装sealer

如果通过 pre-install.sh 安装的sealer 版本不满足要求,可以从官网手工下载安装。 查看可以下载的sealer版本,路径:https://github.com/sealerio/sealer/releases (复制到浏览器查看)。

# 下载和安装sealer二进制
wget https://github.com/sealerio/sealer/releases/download/v0.11.0/sealer-v0.11.0-linux-amd64.tar.gz && \
tar zxvf sealer-v0.11.0-linux-amd64.tar.gz && mv sealer /usr/bin

5.2. 已支持的镜像列表

当前支持的 K8S sealer 镜像版本见列表 : https://hub.docker.com/r/sealerio/kubernetes/tags(复制到浏览器查看)。

5.3. 创建一个单机K8S集群示例

sealer run docker.io/sealerio/kubernetes:v1-22-15-sealerio-2 \
  --masters 192.168.0.1

5.4. 创建一个多机K8S集群示例

sealer run docker.io/sealerio/kubernetes:v1-22-15-sealerio-2 \
  --masters 192.168.0.2,192.168.0.3,192.168.0.4 \
  --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd xxx

Node信息查看:

# kubectl get node
NAME                    STATUS ROLES AGE VERSION
host-name Ready master 18h v1.22.15
host-name Ready master 18h v1.22.15
host-name Ready master 18h v1.22.15
host-name Ready <none> 18h v1.22.15
host-name Ready <none> 18h v1.22.15
host-name Ready <none> 18h v1.22.15

5.5. k8s集群安装脚本示例

可以根据需要修改k8s-installer.sh内容,自定义K8S集群安装脚本,示例如下:

#!/bin/bash
#
# Copyright 2024 Enflame. All Rights Reserved.
#

# 单机部署示例
sealer run docker.io/sealerio/kubernetes:v1-22-15-sealerio-2 --masters 127.0.0.1

# # 多机部署示例:3个master节点,3个node 节点
# sealer run docker.io/sealerio/kubernetes:v1-22-15-sealerio-2 \
#   --masters 192.168.0.2,192.168.0.3,192.168.0.4 \
#   --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd xxx

5.6. 增加节点

sealer join --masters 192.168.0.2,192.168.0.3,192.168.0.4
sealer join --nodes 192.168.0.5,192.168.0.6,192.168.0.7

5.7. 清理集群

创建集群会默认创建一个Clusterfile存储在 /root/.sealer/[cluster-name]/Clusterfile, 里面包含集群元数据信息.

删除集群:

sealer delete -f /root/.sealer/my-cluster/Clusterfile
# 或者
sealer delete --all

5.8. 其他sealer命令

其他sealer命令参考 sealer --help, 如下:

root@host-name# sealer --help
sealer is a tool to seal application's all dependencies and Kubernetes
into sealer image by Kubefile, distribute this application anywhere via sealer image,
and run it within any cluster with Clusterfile in one command.

Usage:
  sealer [command]

Available Commands:
  alpha       sealer experimental sub-commands
  apply       apply a Kubernetes cluster via specified Clusterfile
  build       build a sealer image from a Kubefile
  cert        Update Kubernetes API server's cert
  completion  generate autocompletion script for bash
  delete      delete an existing cluster
  gen-doc     generate document for sealer CLI with MarkDown format
  help        Help about any command
  images      list all sealer images on the local node
  inspect     print the image information or Clusterfile
  join        join new master or worker node to specified cluster
  load        load a sealer image from a tar file
  login       login image registry
  logout      logout from image registry
  pull        pull sealer image from a registry to local
  push        push sealer image to remote registry
  rmi         remove local images
  rollback    rollback a Kubernetes cluster via specified Clusterfile
  run         start to run a cluster from a sealer image
  save        save sealer image to a tar file
  scale-up    scale-up new master or worker node to specified cluster
  tag         create one or more tags for local sealer image
  upgrade     upgrade a Kubernetes cluster via specified Clusterfile
  version     show sealer and related versions

Flags:
      --color string               set the log color mode, the possible values can be [never always] (default "always")
      --config string              config file of sealer tool (default is $HOME/.sealer.json)
  -d, --debug                      turn on debug mode
  -h, --help                       help for sealer
      --hide-path                  hide the log path
      --hide-time                  hide the log time
      --log-to-file                write log message to disk (default true)
  -q, --quiet                      silence the usage when fail
      --remote-logger-url string   remote logger url, if not empty, will send log to this url
      --task-name string           task name which will embedded in the remote logger header, only valid when --remote-logger-url is set
  -t, --toggle                     Help message for toggle

Use "sealer [command] --help" for more information about a command.

此外,快速使用也可以参考官方文档:http://sealer.cool/docs/getting-started/quick-start.html

6. 高级功能 - 自定义K8S镜像参考

如果所需要的 K8S 版本不在支持列表里: https://hub.docker.com/r/sealerio/kubernetes/tags 可以参考文档:http://sealer.cool/docs/advanced/customize-cluster-image.html#customize-the-basefs 自定义一个K8S镜像。

6.1. 基于K8S基础版本制作新版本镜像(v1.24.0之前的版本)

由于sealer官方已经提供了绝大多数v1.24之前的镜像版本,我们只需要对二进制和相关镜像进行覆盖,就可以制作对应的k8s镜像

6.2. 基于K8S基础版本制作新版本镜像(v1.24.0之后的版本)

1)准备 rootfs

在k8s-installer 目录下已准备好一个 rootfs模板:

k8s-installer_<VERSION>/rootfs/
├── bin
├── build-image.sh
├── cri
├── etc
│   ├── config.toml
│   └── kubeadm.yml.tmpl
├── images
├── Kubefile
└── scripts
    ├── containerd.sh
    ├── uninstall-containerd.sh
    └── init-registry.sh

2)准备 Kubefile

rootfs/Kubefile准备如下:

FROM docker.io/sealerio/kubernetes:v1-22-15-sealerio-2
COPY bin/* /bin/
COPY cri /
COPY etc/* /etc/
COPY images/* /images/
COPY scripts/* /scripts/
LABEL "cluster.alpha.sealer.io/container-runtime-type"="containerd"
LAUNCH ["calico"]

3)准备 daemon.json

由于我们需要使用docker搭建私有registry仓库,我们需要一个可以正常运行的docker服务,并支持导入镜像。

{
    "default-runtime": "enflame",
    "runtimes": {
        "enflame": {
            "path": "/usr/bin/enflame-container-runtime",
            "runtimeArgs": []
        }
    },
    "registry-mirrors": ["https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn"],
    "insecure-registries": ["127.0.0.1/8", "artifact.enflame.cn", "sea.hub:5000"],
    "max-concurrent-downloads": 10,
    "log-driver": "json-file",
    "log-level": "warn",
    "log-opts": {
        "max-size": "30m",
        "max-file": "3"
    },
    "default-shm-size": "1G",
    "default-ulimits": {
         "memlock": { "name": "memlock", "soft": -1, "hard": -1 },
         "stack": { "name": "stack", "soft": 67108864, "hard": 67108864 },
         "nofile": { "name": "nofile", "soft": 65536, "hard": 65536 }
    },
    "data-root": "/var/lib/docker"
}

如上面示例所示,我们在insecure-registries中加入了sealer默认的私有仓库地址sea.hub:5000

4)准备 kubeadm.yml.tmpl

如果需要自定义kubeadm.yml.tmpl配置,那么需要将修改的 kubeadm.yml.tmpl 放到rootfs/etc目录下。kubeadm.yml.tmpl 的内容示例参考k8s-installer的 rootfs/etc/kubeadm.yml.tmpl文件。 其中该文件会在kubernetesVersion项中指定k8s版本,需要指定自己需要的k8s版本,目前默认为v1.24.4

5)准备主要的二进制以及镜像文件

下载 Kubernetes 代码并编译,在工作目录下执行以下命令下载 Kubernetes 源代码并编译:

git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
git checkout v1.24.4
make

镜像获取:

docker pull k8s.gcr.io/kube-controller-manager:v1.24.4
docker pull k8s.gcr.io/kube-proxy:v1.24.4
docker pull k8s.gcr.io/kube-apiserver:v1.24.4
docker pull k8s.gcr.io/kube-scheduler:v1.24.4

docker pull k8s.gcr.io/pause:3.7
docker pull k8s.gcr.io/etcd:3.5.3-0
docker pull k8s.gcr.io/coredns/coredns:v1.8.6


docker tag k8s.gcr.io/kube-controller-manager:v1.24.4 sea.hub:5000/kube-controller-manager:v1.24.4
docker tag k8s.gcr.io/kube-proxy:v1.24.4 sea.hub:5000/kube-proxy:v1.24.4
docker tag k8s.gcr.io/kube-apiserver:v1.24.4 sea.hub:5000/kube-apiserver:v1.24.4
docker tag k8s.gcr.io/kube-scheduler:v1.24.4 sea.hub:5000/kube-scheduler:v1.24.4
docker tag k8s.gcr.io/pause:3.7 sea.hub:5000/pause:3.7
docker tag k8s.gcr.io/etcd:3.5.3-0 sea.hub:5000/etcd:3.5.3-0
docker tag k8s.gcr.io/coredns/coredns:v1.8.6 sea.hub:5000/coredns/coredns:v1.8.6

其中etcd, pause, coredns的版本可以查阅对应k8s版本的文档

6)将二进制程序放置在 rootfs/bin 目录下

cp kubernetes/_output/bin/kubeadm rootfs/bin/
cp kubernetes/_output/bin/kubelet rootfs/bin/
cp kubernetes/_output/bin/kubectl rootfs/bin/
  1. 准备容器运行时初始化

对于 v1.24 以后的版本,因为废弃了 Docker 支持,需要修改运行时为 containerd。需要准备脚本 containerd.sh ,并放到 scripts 目录下。

  1. 准备containerd配置 见rootfs下 etc/config.toml

6.3. 完成镜像的构建

最后,在k8s-installer_{VERSION}/rootfs目录下执行以下命令以构建和保存新的 Kubernetes 镜像:

cd k8s-installer_{VERSION}/rootfs
./build-image.sh

其中build-image.sh内容如下,镜像名称根据需要自定义。

#!/bin/bash
#
# Copyright 2024 Enflame. All Rights Reserved.
#

# 参考 <<enflame_k8s_installer_user_guide.md>> 之 高级功能 - 自定义K8S镜像参考
sealer build -t user-defined-kubernetes:v1.24.4 .

7. 常见问题

1)其他参考资料

  1. k8s 1.24以上版本对containerd版本有要求,默认版本应大于1.6.9 3)相对于sealer原有镜像,这里自定义镜像省去了docker和containerd的安装和卸载,用户需要自行安装和配置符合要求的docker和containerd

  2. 如果是单机集群,需要执行kubectl taint node node-role.kubernetes.io/control-plane-去除控制面污点