
前几天,美国工程师Andrew Rynhard
提出了一个有趣的项目:专门用于运行Kubernetes集群的紧凑型Linux发行版。 它取自古希腊神话中的名字
-Talos 。
该项目的出现是受到
Kelsey Hightower在2015年发布的一条
推文启发的,他在那条
推文中说,我们只需要等待有条件的KubeOS出现(在此之后,多云环境的生活就会变得非常美好):
顺便说一句,随着Talos的出现,这个故事还在继续 :有人回答了一条历史推文,说这样的系统已经出现了,Talos的作者说,如果凯尔西研究这个项目,他将很高兴。 但是,尚未跟踪后者的反应。显然,Talos的开发是由一个人
(代表自己在整个公司内 -Autonomy)完成的,他花了一年多的时间。 现在,当达到最低可用性的状态时,作者希望Kubernetes /云原生社区的其他代表也会加入他的行列。 那么该项目的本质是什么?
Talos的原理和特点
Talos被定位为专门为Kubernetes创建的现代Linux发行版。 为了实现其目标,请遵循以下方法:
极简主义
无处不在的极简主义是Talos建筑的基石之一。 这里的一个引人注目的示例是
所使用
的初始化服务 ,该
服务 (与该领域的现代趋势相反)遵循UNIX的哲学,即“每个程序都做一件事,但是很好”:
我们希望让init专注于一项任务-启动Kubernetes。 它根本没有任何其他动作的机制。
开发人员走得更远,剥夺了他们的操作系统对系统管理员熟悉的主机的用户访问权限:
Talos既没有命令外壳,也没有SSH守护程序,甚至没有能力在主机上
启动自己的进程 。 真的:如果需要运行Kubernetes以及其他功能,为什么还要花所有这些钱? Talos中的几乎所有流程都在容器内运行。
但是,由于世界还不是那么完美(为了使OS能够“单独”完全运行),因此仍然有一些用于操作OS的工具:
- osd守护程序,其实现原理是提供最低限度的必要特权(最低特权原则)并提供用于管理节点的API(基于gRPC);
- osctl CLI实用程序允许您与在每个节点上运行的osd服务进行通信。
因此,已实现了一组基本操作功能:重新启动服务和群集节点,从容器接收内核日志(dmesg)和从容器接收数据,将数据插入节点配置文件等。
所有这些组件(init,osd,osctl ...)以及分发工具包中的
其他一些组件
都用Go编写 。 顺便说一句,所有源代码均根据开放源代码许可Mozilla Public License 2.0的条款进行分发。
安全性
上面描述的极简主义方法(
仅运行Kubernetes所需的所有方法)+本身仅颁发最小特权的原理减少了潜在的攻击面。 同样在塔洛斯:
- 所包含的内核是根据内核自我保护项目( KSSP )的建议配置的,该项目重点在于内核独立保护免受潜在错误和漏洞的能力(而不是出于相同目的使用用户空间实用程序);
- 根文件系统以只读方式挂载,再加上缺少shell / SSH,使系统不可变;
- 使用双向TLS(mTLS)与API进行交互;
- Kubernetes设置和配置是根据CIS (Internet安全中心) 准则应用的 。
极简主义和专注于不变性的另一个优势是系统行为的
可预测性 (因为影响环境的因素数量减少了)。
相关性
作者承诺Talos将基于Kubernetes的倒数第二个上游发行版(但是现在
支持 K8s 1.13.3)和最新的可用LTS Linux内核发行版(现在使用4.19.10)。
系统组成
该发行版的主要组件(除了内核和“专有”实用程序之外)是:
- musl-libc-作为标准C库;
- golang-用于
init
及其其他工具; - gRPC-用于API;
- 容器化-在容器中启动系统服务(与Kubernetes的CRI插件一起使用);
- kubeadm-用于部署集群。
与Talos合作
项目文档中提供了适用于AWS,KVM和Xen部署的Talos部署示例。 为了快速说明外观,以下是Linux KVM虚拟机的安装算法:
1.在主机上安装主节点:
docker run --rm --privileged --volume /dev:/dev \ autonomy/talos:latest image -b /dev/sdb -f -p bare-metal \ -u http://${IP}:8080/master.yaml
2.创建虚拟机:
virt-install -n master --description "Kubernetes master node." \ --os-type=Linux --os-variant=generic --virt-type=kvm --cpu=host \ --vcpus=2 --ram=4096 --disk path=/dev/sdb \ --network bridge=br0,model=e1000,mac=52:54:00:A8:4C:E1 \ --graphics none --boot hd --rng /dev/random
3.创建工作节点的类似操作:
docker run --rm --privileged --volume /dev:/dev \ autonomy/talos:latest image -b /dev/sdc -f -p bare-metal \ -u http://${IP}:8080/worker.yaml virt-install -n master --description "Kubernetes worker node." \ --os-type=Linux --os-variant=generic --virt-type=kvm --cpu=host \ --vcpus=2 --ram=4096 --disk path=/dev/sdc \ --network bridge=br0,model=e1000,mac=52:54:00:B9:5D:F2 \ --graphics none --boot hd --rng /dev/random
配置osd和osctl之间的交互基本上可以归结为生成用于身份验证的密钥(已经提到了mTLS),并
在此处进行了描述。
与它们的进一步合作归结为诸如
osctl reboot
,
osctl stats
和
osctl logs
。 演示
k8s.io
命名空间中容器的输出:
$ osctl ps -k NAMESPACE ID IMAGE PID STATUS k8s.io 0ca1… sha256:da86… 2341 RUNNING k8s.io 356f… sha256:da86… 2342 RUNNING … k8s.io e42e… sha256:4ff8… 2508 RUNNING k8s.io kubelet k8s.gcr.io/… 2068 RUNNING
使用Talos配置Kubernetes集群的过程在
此处 (关键节点)和
此处 (工作人员)可用。
现状与前景
该项目处于alpha版本阶段(最新版本为
v0.1.0-alpha.18 ),当然,在此阶段,它看起来像是一个有趣的实验,而不是真正接近生产的任何项目。
但是,最近Talos发布之后(在GitHub上已经有600颗星),对Talos的兴趣激增,并且唯一的作者呼吁共同创造,可以极大地刺激其发展。
Talos最近几天的项目活动至少,发行版包含与世界相关的云原生想法,其质量实现是时间问题。
聚苯乙烯
另请参阅我们的博客: