惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
量子位
博客园_首页
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Forbes - Security
Forbes - Security
IT之家
IT之家
N
News and Events Feed by Topic
S
Security Affairs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Webroot Blog
Webroot Blog
Recorded Future
Recorded Future
L
LangChain Blog
Y
Y Combinator Blog
AI
AI
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google Online Security Blog
Google Online Security Blog
V2EX - 技术
V2EX - 技术
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
I
Intezer
T
Tenable Blog
G
Google Developers Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
C
CXSECURITY Database RSS Feed - CXSecurity.com
有赞技术团队
有赞技术团队
O
OpenAI News
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
S
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
Blog — PlanetScale
Blog — PlanetScale

顾宇的博客

用 AI 重启生活 初始化 MacOS 关于我 再次见面,期待相遇 演讲和分享 如何通过政策红利获利?——海南发展(SZ.002163)交易复盘 2025年的总结 2024年的总结 2023年的总结 2022年的总结 《敏捷测试价值观、方法与实践》序 【翻译】函数式编程中的领域驱动设计 【翻译】通过跟踪技术债来改进你的开发实践 【翻译】不要把测试用例自动化 【翻译】持续部署 vs 持续交付 【翻译】测试替身 【翻译】做多少测试才足够 【翻译】蓝绿部署的起源 【翻译】持续部署 【翻译】作为演进式架构的微服务架构 【翻译】gRPC 的动机和设计原则 【翻译】分布式计算谬误 【翻译】微服务和分布式对象第一法则 采用 Multipass 管理本机虚拟 K8S 集群 博客主题升级到 Congo 2.0 【翻译】Terraform 最佳实践:模块组合 【翻译】Kubernetes 部署语言(Kubernetes Deployment Language) 2021年的总结 通过 Github Actions 部署 Mkdocs 文档 博客迁移到了新的 Hugo 主题 2020年的总结 2019年的总结 千人规模组织级 DevOps 演进的 9 个实践技巧 从技术雷达看 DevOps 的十年——容器技术与微服务 DevOps 模式 - 引入 DevOps 顾问 DevOps 模式 - 索引 DevOps 模式 - 定义你的DevOps 从技术雷达看 DevOps 的十年——基础设施即代码与云计算 DevOps 模式 - 采用模式语言讨论 DevOps 从星巴克店面运营学习 DevOps 从技术雷达看 DevOps 的十年——DevOps与持续交付 【翻译】微服务安全:所有应该被问到的问题 云原生下的 DevSecOps 实践 【翻译】软件定义交付宣言 微服务演进中的经验和反思 迟到的 2018 年终总结 成功微服务实施的组织演进 从第19期技术雷达看 DevOps 的发展趋势 成功微服务实施的技术演进 我们如何衡量微服务的成功? 关于四周四 AWS 架构工作坊的设计和实践 讨论微服务之前,你知道微服务的 4 个定义吗? 公有云(AWS)上的生产环境架构优化案例和迁移套路总结 公有云(AWS)上的生产环境性能分析案例 一怒之下,我又写了一个开源流量测试工具 采用 DevOps 故事落地 DevOps 测试驱动开发 Nginx 配置 云原生 DevOps 翻译-混沌工程的原则 Serverless 风格的微服务的持续交付 从最新一期技术雷达看 DevOps 的发展 关于 DevOps ,咱们聊的可能不是一回事 Serverless 风格的微服务的架构案例 提升微服务实施效率的 7 个步骤 微服务实施常被忽视的 5 个难点 你的 CI 在挖矿吗? DevOps前世今生 - 4. DevOps 的文化 DevOps发展的九个趋势 不要让你的持续集成服务器成为安全隐患 DevOps 前世今生 - 3. DevOps 的目标和核心 DevOps 前世今生 - 2. DevOps 矛盾从何而来 DevOps 前世今生 - 1. DevOps 编年史
通过 Vagrant 一键初始化 K8S 集群
顾宇 · 2022-02-08 · via 顾宇的博客
  1. 顾宇的博客/
  2. Blogs/
  3. 通过 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 的核心配置都写在了文件的前面。修改其中的参数可以改变集群相关配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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配置。

1
2
3
4
5
6
7
8
9
#!/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,然后才进行配置。只是工作节点要在控制面配置完之后启动。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/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!