玩转 Kubernetes(一):离线安装 Kubernetes 2

玩转 Kubernetes(一):离线安装 Kubernetes 2

玩转 Kubernetes(一):离线安装 Kubernetes 1 中,D瓜哥基于 Kubespray 进行魔改的脚本搭建起来容器镜像仓库。但是,每次都魔改着实麻烦,所以,探索 Kubespray 原生支持才是更为委托的长久之计。

经过多次探索,终于,可以几乎无需魔改就可以利用 Kubespray 原生支持进行 Kubernetes 的离线安装。

以下是在 Mac 上的操作,在 Linux 等系统上操作类似。

按照 Python 依赖

在 Mac 的虚拟机离线安装 Kubernetes,使用 Mac 当做容器镜像服务器和二进制安装文件下载服务器是一个非常好的选择。为此,需要在完成一些基本的操作。

由于运行 Kubespray,需要一个 Python 环境以及相关依赖,所以,就需要先安装相关依赖。

# 配置 Python 镜像
pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

# 进入 Kubespray 的上层目录
cd /PATH/TO/kubespray/..

# 按照 Python 相关依赖
VENVDIR=kubespray-venv
KUBESPRAYDIR=kubespray
python3 -m venv $VENVDIR
source $VENVDIR/bin/activate
cd $KUBESPRAYDIR
pip install -U -r requirements.txt

生成镜像列表及二进制文件列表

安装完相关依赖,就需要生成相关文件列表:

# 生成镜像列表以及相关二进制文件列表
cd /PATH/TO/kubespray/contrib/offline

./generate_list.sh
注意:大多数情况下,我们的安装目标是 Linux。所以,建议这步操作在 Linux 上完成,这样得到的下载文件列表是 Linux 格式的。在 Mac 上完成,那么部分文件的格式就是 Mac 的,不能用于 Linux 的安装。

执行完如下命令,则会在 /PATH/TO/kubespray/contrib/offline/temp 生成出来两个文件:

  1. files.list — 这是安装 Kubernetes 的二进制文件列表

  2. images.list — 这是安装 Kubernetes 所需要的镜像列表

images.list 中找到 external_storage/cephfs-provisioner:v2.1.0-k8s1.11external_storage/rbd-provisioner:v2.1.1-k8s1.11 两行,并将其删除。 这两个镜像太旧了,已经不支持了,留着会影响程序执行

下载相关镜像

有了镜像列表和二进制文件列表,就可以下载相关镜像了:

# 下载相关镜像
export IMAGES_FROM_FILE=/PATH/TO/kubespray/contrib/offline/temp/images.list

./manage-offline-container-images.sh create

由于国内众所周知的网络原因,大家下载影响时,可能不是很顺利,可以尝试使用镜像源,下面是目前找到的一些可用镜像源:

搭建容器镜像源

下载好镜像文件,就可以使用镜像文件搭建镜像源服务:

# 加载相关镜像。
# Setup the registry service
docker run --restart=always -d -p 5000:5000 --name registry registry:latest

export DESTINATION_REGISTRY=localhost:5000  # 如果不设置,默认生成的网址会失败

export IMAGE_TAR_FILE=/PATH/TO/container-images.tar.gz

# Registering images
./manage-offline-container-images.sh register

执行完成后,可以访问 http://localhost:5000/v2/_catalog ,查看已经加载的镜像列表

这节的操作与 玩转 Kubernetes(一):离线安装 Kubernetes 1 中的“搭建容器镜像仓库”节是一样的。上文使用的是魔改脚本,这节直接基于 Kubespray 的原生支持来搞,后续升级更方便。

另外,还有一点需要说明:在 Kubespray 的原生脚本中,不支持 Mac 系统,所以,D瓜哥将脚本做了微调,并向 Kubespray 发起了一个 PR: Kubespray: registry support Mac

下载 registry.k8s.io 镜像

对于保存在 registry.k8s.io 的 Kubernetes 最核心的镜像,可以使用国内的镜像源下载,然后再重新打标签的方式来完成下载。

# 可以使用 DaoCloud 提供的镜像,直接在原网址的前面加 m.daocloud.io/ 即可
docker pull m.daocloud.io/registry.k8s.io/kube-scheduler:v1.31.4

docker tag m.daocloud.io/registry.k8s.io/kube-scheduler:v1.31.4 \
       registry.k8s.io/kube-scheduler:v1.31.4

docker rmi m.daocloud.io/registry.k8s.io/kube-scheduler:v1.31.4

下载二进制文件

上面生成了二进制文件列表,可以根据列表下载所有相关文件:

# 下载二进制文件
cd /PATH/TO/kubespray/contrib/offline

wget -c -x -P temp/files -i temp/files.list
注意:如果是在 Mac 上生成的相关文件列表,那么部分文件是 Mac 系统上的安装文件。所以,需要调整这些文件的地址。建议在 Linux 系统中生成相关文件列表。

HTTP 服务器

在 Caddy 2.9.1 中,Caddy 似乎打开了自动将 HTTP 请求重定向为 HTTPS 请求,另外,使用 caddy run 启动时,似乎会自动监听 80 端口,这两个改变给安装带来了一些小麻烦。所以,重新配置了一下 Caddyfile 文件:

# @author D瓜哥 · https://www.diguage.com/

# 下载二进制文件
{
	debug
	auto_https off
	log {
		output stdout
	}
}

docker.example.com:443 {
	# 网站的域名信息
	tls fullchain3.pem privkey3.pem # 证书和密钥的 PEM 格式的文件路径
	reverse_proxy localhost:5000 # 反向代理
}

app.example.com:80 {
	root * /PATH/TO/binary-installer
	file_server
}

更多 Web Server 的搭建办法见: Big list of http static server one-liners(可能需要科学上网)。

再谈 Kubespray

在 kubespray v2.27 中,把生成节点配置的脚本给删除了。尝试了一下官方文档的配置,结果提示没有配置 Host,把 v2.26 生成的配置 hosts.yaml 拷贝过来,放在 KUBESPRAY/inventory/kubestar/ 之下,顺利完成安装:

# @author D瓜哥 · https://www.diguage.com/

all:
  hosts:
    node1:
      ansible_host: 10.0.2.21
      ip: 10.0.2.21
      access_ip: 10.0.2.21
    node2:
      ansible_host: 10.0.2.22
      ip: 10.0.2.22
      access_ip: 10.0.2.22
    node3:
      ansible_host: 10.0.2.23
      ip: 10.0.2.23
      access_ip: 10.0.2.23
#    node4: (1)
#      ansible_host: 10.0.2.24
#      ip: 10.0.2.24
#      access_ip: 10.0.2.24
#    node5:
#      ansible_host: 10.0.2.25
#      ip: 10.0.2.25
#      access_ip: 10.0.2.25
  children:
    kube_control_plane:
      hosts:
        node1:
        node2:
    kube_node:
      hosts:
        node1:
        node2:
        node3:
#        node4:
#        node5:
    etcd:
      hosts:
        node1:
        node2:
        node3:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}
1原本自动生成的是三个节点,注释掉的节点是D瓜哥后续自己手动加的。

执行如下命令,即可完成安装:

cd /PATH/TO/kubespray/..

ansible-playbook -i inventory/kubestar/ cluster.yml -b -v
五个节点的安装时间明显大于三个节点。如果平时做实验,建议三个节点即可。

小结

使用本文内容,再结合 玩转 Kubernetes(一):离线安装 Kubernetes 1 中的内容,就可以非常方便地完成 Kubernetes 的离线安装。