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/
准备容器运行时初始化
对于 v1.24 以后的版本,因为废弃了 Docker 支持,需要修改运行时为 containerd。需要准备脚本 containerd.sh
,并放到 scripts
目录下。
准备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)其他参考资料
k8s 1.24以上版本对containerd版本有要求,默认版本应大于1.6.9 3)相对于sealer原有镜像,这里自定义镜像省去了docker和containerd的安装和卸载,用户需要自行安装和配置符合要求的docker和containerd
如果是单机集群,需要执行kubectl taint node
node-role.kubernetes.io/control-plane-去除控制面污点