使用Kubespray在离线代理环境中构建Kubernetes
简而言之
在将Kubernetes引入裸金属远程服务器时,需要确保目标主机已
-
- Ansible の要件 (SSH 接続可能 + Python3 導入済み) は満たしている
- HTTP/HTTPS で外部に接続できない
请按照官方文档 kubespray/docs/offline-environment.md,解释在类似情况下应用 kubespray 的方法。
大致的步骤如下:
-
- 在客户端上启动HTTP服务器/容器注册表来分发kubespray的依赖项
-
- 通过SSH远程转发从服务器端访问客户端的HTTP服务器/容器注册表
- 执行kubespray
示例代码:
前提 – qian2 ti2
操作系统
-
- Continer engine (docker, podman, nerdctl, etc.)
-
- Client: MacOS (Ventura 13.5)
- Server: (RHEL 8.8)
本文假设使用的操作系统是MacOS,并且使用Podman作为容器引擎,但如果使用Docker或者nerdctl,需要适当地进行替换。
本文中使用以下命令创建podman machine:
$ podman machine init \
–volume /Users:/mnt/Users \
–volume /Volumes:/mnt/Volumes \
–volume /private:/mnt/private \
–volume /tmp:/mnt/tmp \
–volume /var/folders:/mnt/var/folders
操作步驟
服务器的准备工作
在执行 Kubespray 之前,请先安装好 conntrack、socat 和 ipvsadm。
# On remote
$ dnf update -y
$ dnf install -y conntrack-tools socat ipvsadm
停用并禁用 firewalld
$ systemctl stop firewalld
$ systemctl disable firewalld
准备 Kubespray
从GitHub克隆Kubespray。
# On client
$ git clone https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray/contrib/offline
建立HTTP服务器
当在客户端上执行Kubespray中的./contrib/offline/generate_list.sh脚本时,将生成所需文件/镜像的列表。
需要注意的是,该脚本会根据执行机器的操作系统进行文件的下载,因此如果像本文所示在Mac上执行,将获取到依赖于darwin而不是linux的文件。为了防止这种情况发生,在执行generate_list.sh脚本的最后一行:ansible-playbook命令时,需添加-e “ansible_system=linux”选项。
(cd ${REPO_ROOT_DIR} && ansible-playbook $* generate_list.yml && /bin/rm generate_list.yml) || exit 1
(cd ${REPO_ROOT_DIR} && ansible-playbook -e "ansible_system=linux" $* generate_list.yml && /bin/rm generate_list.yml) || exit 1
执行修改后的 generate_list.sh 脚本,并确认生成的列表已经存在于 temp/ 目录中。
$ ./generate_list.sh
...
$ ls temp/
files.list files.list.template images.list images.list.template
在接下来的步骤中,运行./contrib/offline/manage-offline-files.sh命令,将会下载所需的文件并自动启动包含这些文件的HTTP服务器(nginx容器)。然而,需要注意的是,当像本文中的实例一样,使用Mac上的podman用户并且将本地路径挂载到/mnt目录并运行podman machine init时,需要在挂载路径的开头加上/mnt/。由于manage-offline-files.sh最后的代码块没有考虑到这一点,所以需要进行以下修正。
--volume "${OFFLINE_FILES_DIR}:/usr/share/nginx/html/download" \
--volume "$(pwd)"/nginx.conf:/etc/nginx/nginx.conf \
--volume /mnt/"${OFFLINE_FILES_DIR}:/usr/share/nginx/html/download" \
--volume /mnt/"$(pwd)"/nginx.conf:/etc/nginx/nginx.conf \
执行修正后的generate_list.sh脚本,并确认nginx容器已启动。
# 既存の `nginx` という名のコンテナを削除
$ podman kill nginx; podman rm nginx
$ ./manage-offline-files.sh
...
$ curl localhost:8080
<!DOCTYPE http>
<http>
<head>
<title>Welcome to nginx!</title>
...
建立容器注册表
执行./contrib/offline/manage_offline_images.sh命令,将下载所需的images,并启动包含所有这些images的容器注册表。
远程转发
通过SSH远程转发,允许从远程服务器访问本地启动的HTTP服务器和容器注册表(: 8080将转发到HTTP服务器,: 5000将转发到容器注册表)。
# On client
$ ssh -R 8080:localhost:8080 -R 5000:localhost:5000 user@remote_host
# On remote
$ curl localhost:8080
$ curl -X GET http://localhost:5000/v2/_catalogs
请保持在这里建立的SSH会话。
库存的修改
(撰写中。。。)
修改 inventory 的 groups_vars/all/offline.yml。
将 files_repo 设为 http://localhost:8080/download。
files_repo: "http://localhost:8080/download"
同時候,將yaml檔案內所有引用{{ files_repo }}的地方的註釋全部取消。
执行Kubespray
在远程主机上运行 kubespray。
補充
如果在连接远程服务器时需要通过跳板服务器(代理跳转),则需要向inventory/mycluster/host.yml的ansible_ssh_common_args中添加类似以下的SSH命令选项。
all:
hosts:
host_hoge:
ansible_ssh_common_args: '-J <user>@<proxy_host>:<port>'
相关文章 (Guanlian wenzhang)