k3s代理重构安装方案

背景

rancher官方通常使用autok3s来安装,管理k3s。

可以使用autok3s来一次过安装k3s

1
autok3s create --provider native --cluster --k3s-channel stable --k3s-install-script http://xxx.xxx.xx.201:31080/install.sh --k3s-version v1.19.5+k3s2 --master-extra-args '--docker' --name test --ssh-key-path ~/.ssh/id_rsa --ssh-port 22088 --ssh-user root --worker-extra-args '--docker' --master-ips xxx.xxx.xx.205 --worker-ips xxx.xxx.xx.213

autok3s本质是通过ssh配置跳到对应节点执行k3s的安装命令,适用于云间可以直接访问的情况

1
2
3
4
5
6
7
8
9
10
11
var (
	initCommand            = "curl -sLS %s | %s K3S_TOKEN='%s' INSTALL_K3S_EXEC='server %s --node-external-ip %s %s' %s sh -"
	joinCommand            = "curl -sLS %s | %s K3S_URL='https://%s:6443' K3S_TOKEN='%s' INSTALL_K3S_EXEC='%s' %s sh -"
	getTokenCommand        = "sudo cat /var/lib/rancher/k3s/server/node-token"
	catCfgCommand          = "sudo cat /etc/rancher/k3s/k3s.yaml"
	dockerCommand          = "if ! type docker; then curl -sSL %s | sh - %s; fi"
	deployUICommand        = "echo \"%s\" | base64 -d | sudo tee \"%s/ui.yaml\""
	masterUninstallCommand = "sh /usr/local/bin/k3s-uninstall.sh"
	workerUninstallCommand = "sh /usr/local/bin/k3s-agent-uninstall.sh"
	registryPath           = "/etc/rancher/k3s"
)

但是实际情况有点复杂,出于安全考虑中心云和边缘云之间,会有需要代理的情况,这样的情况autok3s没有办法解决。目前的情况只能手动解决,去到机器上面执行命令(安装集群,添加节点,纳管集群)。而且还有需要离线安装,安装k3s的install.sh也需要修改

image-20211210100932751

autok3s安装k3s流程详解

安装代码详解

k3s ssh工具类

总流程

autok3s通过k3s-install-script下载install.sh,install.sh会下载k3s-version指定的k3s二进制程序,通过参数执行命令。

详细

  • 安装集群或者添加节点都需要k3s token,所以安装时候会先生成,添加节点时候,会从主节点获取token。

安装

  • 会挑master ip第一个ip先安装成功一个,循环安装其他的master,worker使用协程异步安装
  • merge kube cofig

添加节点使用流程和安装差不多,就是命令不一样,没有改kube config。

改造方案

会区分是否使用代理,install.sh和k3s二进制应用会放到对象存储服务器。通过k3s version找到对应的k3s,install.sh就不需要处理版本问题。程序部署到主节点k8s上面

install.sh也要做对应修改,主要是里面下载k3s的方法download_and_verify和注释掉处理selinux的setup_selinux方法(yum install packeage,离线安装有问题)。

不使用代理的话,和直接autok3s差不多。

  • 检验ssh连通性(k8s pod上面也可以连到不同节点)

  • 选master一个节点A,通过sftp传输autok3s到节点A
  • 在A上面执行autok3s命令

使用代理

  • 会sftp发送sshtest到通过代理机器到达节点A
    • ssh不支持使用密码参数
    • 离线安装sshpass麻烦需要前置工作or使用代码安装,也不知道会遇到什么诡异问题
    • 程序只接受代理到节点A的配置,降低代码复杂度(不会直接在部署机直接验证ssh,应为需要知道所有代理方案)
  • 在A上面验证检验ssh连通性(执行的是sshtest 命令)
  • 通过sftp传输autok3s到节点A
  • 在A上面执行autok3s命令