通过 Vagrant 一键初始化 K8S 集群

起因

去年初我开始系统学习 K8S,就想能生成一个集群环境。查看了一下官方文档,步骤很多。网上的一些资源已经过期或者不可用,再加上各种资源的变更和国内不可访问。

不得不说,在家按照官方文档搭建一个标准的 K8S 集群真是太难了!

所以我就自己构建了一个最小的 K8S 集群环境,放在了我的 provisioner 代码库里。现在这个开源代码库可以自动一键建立一个拥有一个控制节点和两个工作节点的最小K8S集群,可以反复销毁和启动。

过年在家的时间就对相关的脚本进行了完善,项目地址可参考:https://github.com/wizardbyron/provisioners,本文是对相关脚本的说明。

关于 Provisioner 项目

Provisioners 是我个人用于构建“最小可用集群”的一站式自动化脚本库。是我练习构建各种系统工具的一站式脚本收集仓库。它默认会通过 vagrant启动三个虚拟机,分别是管理节点(admin)和两个工作节点(node-1和node-2,最大支持到node-9)。管理节点的 IP 是192.168.56.10。工作节点是192.68.56.11~192.168.56.19。你可以通过修改Vagrantfile调整数量。

Provisioners 分为solution(解决方案)和facility(设施)两个脚本目录。

facility 里面则是单个工具的初始化脚本,包含各个工具的一键式初始化脚本。

solution 则是利用facility里的工具脚本组合成的解决方案,包括管理节点和工作节点。

此外,essential里包含了init.sh脚本,这是用于统一初始化 Linux 节点的统一基础脚本。而对于管理节点和工作节点的自动化初始配置则在solution目录里每个解决方案下的admin/setup.shworker/setup.sh里。

Vagrantfile 配置说明

这个 Vagrantfile 的核心配置都写在了文件的前面。修改其中的参数可以改变集群相关配置。

SOLUTION = "k8s" # default/devops/k8s
BOXES ={
  "ubuntu" => "ubuntu/focal64",
  "centos" => "centos/7"
}

# 支持BOXES里面列出的 vbox 虚拟机镜像
DISTRO = "centos" 

# Linux 发行版软件镜像源:空(官方)/tencent(腾讯软件源)/aliyun(阿里云软件源)
MIRROR = "aliyun" 

# 最新的 Vagrant 版本强制了 CIDR,我保留了 1-9 的IP,并且将这个初始IP作为管理节点IP
ADMIN_IP = "192.168.56.10" 

# 调整工作节点数,根据你的资源增加,一般学习的话两个够了。
NODES = 2 

# 用于登录 Docker 镜像仓库,默认为docker.io
DOCKER_REGISTRY = "<>"
DOCKER_USERNAME = "<username for docker registry>"
DOCKER_PASSWORD = "<password for docker registry>"

默认控制面的主机名是admin,IP 是192.168.56.10。工作节点是node-<数字>,根据你的内存资源,你可以增加节点的数量。

最后只要运行vagrant up就可以启动你的集群,如果因为下载某些东西超时(比如镜像或者安装包),可以切换镜像重新试一下。

如果虚拟机全部初始化完成,你可以通过kubectl get nodes看到多个集群。

我一般会在搭建完控制面之后用watch kubectl get ndoes持续跟踪集群的搭建情况。

还是再说一句,在家按照官方文档搭建一个标准的 K8S 集群真是太难了!

K8S 解决方案配置脚本说明

K8S 解决方案脚本主要分控制面配置和工作节点配置两个脚本,每个脚本都需要安装 kubeadm,kubeletkubectl

控制面配置完成以后才可以配置工作节点,因为需要加入控制面的token等一些信息。

控制面节点配置脚本 solution/k8s/admin.sh 说明

控制面安装要在管理节点上先通过/facility/k8s/install.sh安装安装 kubeadm 再进行通过 kubeadm配置。

#!/usr/bin/env bash
PATH=$PATH:/home/$(whoami)/.local/bin
export CONTROL_PANEL_IP=$1
echo "CONTROL PANEL IP: $CONTROL_PANEL_IP"

MIRROR="aliyun" # <empty>/aliyun
KUBE_VERSION="1.23.0-0"
sh -c "/vagrant/facility/k8s/install.sh $KUBE_VERSION $MIRROR"
sh -c "/vagrant/facility/k8s/setup-control-panel.sh $CONTROL_PANEL_IP $MIRROR"

参数说明:

  • CONTROL_PANEL_IP: K8S控制面的IP地址,由外部传入。
  • MIRROR: K8S所用的A镜像,除了apt源和yum源,还有k8s集群所需要的docker镜像,目前仅支持阿里云(唯一提供免费k8s镜像源)。如果为空,则会去查找官方镜像。
  • KUBE_VERSION: K8S 的版本,可以指定版本版本。

工作节点脚本配置脚本 /solution/k8s/node.sh 说明

工作节点配置脚本和控制面配置脚本类似,都是先通过/facility/k8s/install.sh安装kubeadm,然后才进行配置。只是工作节点要在控制面配置完之后启动。

#!/usr/bin/env bash
PATH=$PATH:/home/$(whoami)/.local/bin
export CONTROL_PANEL_IP=$1
echo "CONTROL PANEL IP: $CONTROL_PANEL_IP"

MIRROR="aliyun" # <empty>/aliyun
KUBE_VERSION="1.23.0-0"

sh -c "/vagrant/facility/k8s/install.sh $KUBE_VERSION $MIRROR"
sh -c "/vagrant/facility/k8s/setup-worker-node.sh $CONTROL_PANEL_IP"

参数说明:

  • CONTROL_PANEL_IP: K8S控制面的IP地址,由外部传入。
  • MIRROR: K8S所用的A镜像,除了apt源和yum源,还有k8s集群所需要的docker镜像,目前仅支持阿里云(唯一提供免费k8s镜像源)。如果为空,则会去查找官方镜像。
  • KUBE_VERSION: K8S 的版本,可以指定版本,但要和控制面的版本一致,否则会出问题。

K8S facility 脚本说明

K8S facility 脚本包括三个脚本:

初始安装脚本 /facility/k8s/install.sh 说明

install.sh是初始化 linux 配置并安装 kubeadm,kubeletkubectl 的脚本。完全按照官方kubeadm 安装文档执行。

install.sh有两个参数:K8S 版本和安装包镜像。安装包镜像可以为空,采用默认的packages.k8s.io或阿里云镜像源。

install.sh的执行步骤如下:

  1. 修改 docker 的配置,使用 systemd 来管理容器的 cgroup。
  2. 配置网络, 允许 iptables 检查桥接流量。
  3. 关闭系统交换区(swap area)。
  4. 自动识别aptyum并安装kubeadm相关软件包。

控制面配置脚本 /facility/k8s/setup-control-panel.sh 说明

setup-control-panel.sh是用来配置控制面的脚本。必须在/facility/k8s/install.sh安装之后执行。

setup-control-panel.sh主要做以下几件事:

  1. 通过firewall-cmd配置k8s 集群所用端口。
  2. 安装配置 K8S 等控制面组件:kube-apiserver
  3. 安装配置 Pod 网络插件。支持calicofannel,默认选择calico
  4. 生成自动加入集群的脚本join-cluster.sh并通过8000端口暴露出来,让工作节点可以启动后自动加入集群。
  5. 安装 helm。

工作节点配置脚本 /facility/k8s/setup-work-node.sh 说明

setup-work-node.sh的脚本比较简单,除了通过firewall-cmd打开所需端口以外,就是下载并执行控制面上的加入集群脚本。

从 MVP 开始

由于目前这是最小可用集群,如果你想增加自定义脚本可以在facility里自动化安装增加并且在solution自动化配置。

下一步可能会减少参数配置,尽量用内部的 DNS 服务取代 IP 的配置。

欢迎来https://github.com/wizardbyron/provisioners提 Issue 和 PR!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容