前言
当前腾讯云 TKE 提供了一个内测功能,允许接入第三方服务器进行管理。
我司由于某些特殊原因,不得不在某厂商购买云服务器。为了把这部分资源盘活,我临危受命研究如何利用腾讯云 TKE 的这个新功能,将某厂商的云服务器接入腾讯云 TKE 管理。
与边缘集群不同,TKE 提供的第三方节点池功能,是必须要走内网的。
也就意味着,当前腾讯云 VPC 必须要通过云联网 + VPN 的方式,和待接入厂商的内网打通,这一点已经事先处理好了。
我把第三方节点池接入脚本复制到服务器上执行,到处报错。由于是内测功能,文档一塌糊涂,各处语焉不详。
我仔细读了下脚本内容,发现这个坑爹的第三方节点池居然强制要求当前操作系统是 Tencent Linux 3.x 版本。
于是就引出了今天的主题,如何将坑爹的 Tencent Linux 3.x 部署到其他云厂商
第一次尝试
我的想法很简单,找到 VMDK 或者 QCOW2 镜像,导入第三方厂商,直接启动一气呵成。
然而事情并没有这么简单。
我在腾讯云文档的犄角旮旯里面找到了镜像下载地址
https://cloud.tencent.com/document/product/213/53540
将 QCOW2 导入到第三方厂商,启动服务器,然后 SSH 连接毫无反应。
非常诡异的是,SSH 连接并没有报告“被拒绝”,而是长时间卡死,最终超时。
这意味着服务器启动了,但是没有完全启动,有什么问题阻止了系统启动流程。
尝试使用 ISO
俺寻思 QCOW2 不行,大不了我使用 ISO 镜像嘛。把系统安装到 Vmware 虚拟机内,然后把 VMDK 导入到第三方厂商,也能启动服务器。
然而这个 ISO 镜像的使用,让我一眼难尽。各种报错,各种找不到命令,我试了好几个版本,愣是没有找到一个能成功在虚拟机里面完成安装的。
再战 QCOW2
我使用 qemu-img
工具,把 QCOW2 转换为 VMDK 镜像,在 VMWare 上启动后,终于找到了之前镜像无法启动的原因了。
Tencent Linux 镜像的 cloud-init
脚本依赖了腾讯云内部的一个固定的 metadata 服务器地址,在腾讯云外执行会出现连接错误,反复重试,进而导致启动无法完成。
那么答案只有一个,就是魔改 QCOW2
使用 guestfs-tools
工具,把 QCOW2 镜像挂载到本地目录,直接在 etc/cloud
里面进行一个 touch cloud-init.disabled
禁用掉 cloud-init
cloud-init
禁用掉后,云厂商进行密码/秘钥注入的功能就不起效了,只能手动修改 etc/shadow
和 root/.ssh/authorized_keys
文件,进行密码/秘钥配置。(注意设置正确的文件权限)
卸载本地目录,将魔改后的 QCOW2 文件导入第三方厂商,启动服务器。
成功使用 SSH 进入控制台后,检查了一下,网络各方面功能正常,第三方厂商分配的内网 IP 也能够正确获取。
经过一晚上的摸索,终于大功告成。
其他问题
修复软件源地址
默认的软件源假定服务器位于腾讯云内部,在腾讯云外部使用需要修改软件源
cd /etc/yum.repo.d
ls -1 | grep repo | xargs -I {} sed -i 's/mirrors.tencentyun.com/mirrors.tencent.com/g' {}
使用 cgroups v1
在使用魔改版镜像启动的服务器上执行 TKE 第三方节点池接入命令后,会报告
WARN >> The machine not enabled cgroup memory. Please enable!
导致无法安装,原因是腾讯云 TKE 组件只支持 cgroups v1
,而 Tencent Linux 3.1 默认启用的是 cgroups v2
处理方法很简单:
- 修改
/etc/default/grub
找到systemd.unified_cgroup_hierarchy=1
,将值改成0
- 执行
grub2-mkconfig -o /boot/grub2/grub.cfg
,然后reboot
重启服务器即可
禁用 IPv6
cat <<-EOF >> /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
EOF
sysctl --system
磁盘扩容
可以参考这个文档进行磁盘在线扩容\
https://ahelpme.com/linux/online-resize-of-a-root-ext4-file-system-increase-the-space/