使用Kubespray在离线代理环境中构建Kubernetes

简而言之

在将Kubernetes引入裸金属远程服务器时,需要确保目标主机已

    • Ansible の要件 (SSH 接続可能 + Python3 導入済み) は満たしている

 

    HTTP/HTTPS で外部に接続できない

请按照官方文档 kubespray/docs/offline-environment.md,解释在类似情况下应用 kubespray 的方法。

大致的步骤如下:

    1. 在客户端上启动HTTP服务器/容器注册表来分发kubespray的依赖项

 

    1. 通过SSH远程转发从服务器端访问客户端的HTTP服务器/容器注册表

 

    执行kubespray
kubespray-offline.drawio.png

示例代码:

 

前提 – 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

操作步驟

在这篇文章中,我正在撰写关于配置离线 yum 仓库的设置。但是关于离线 HTTP 服务器的操作是有效的,因此可以在“HTTP/HTTPS 无法连接但可以使用 yum 仓库”的情况下使用。(我将在不久的将来解释如何搭建离线 yum 仓库的方法?)

服务器的准备工作

在执行 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)

 

广告
将在 10 秒后关闭
bannerAds