- 云原生
- 教程
【免费下载链接】kubernetes-handbook
Kubernetes Handbook (Kubernetes指南) https://kubernetes.feisky.xyz
LinuxKit 是 Docker 生态中以容器方式构建"最小、不可变 Linux 系统"的框架,本指南基于 kubernetes-handbook 部署章节,演示如何在 Mac OS X 上借助 LinuxKit 工具链打包一个内置 Kubernetes 的虚拟机镜像,并用 kubeadm 初始化 Master、批量加入 Worker 节点,最后通过 NodePort 暴露一个 Nginx 服务完成端到端验证。读完本文,你将掌握 LinuxKit 工具链的构建方法、Kubernetes 集群镜像的产出物结构,以及一套可在本地复现的"镜像化 Kubernetes 集群"部署流程。
LinuxKit 与 Moby 生态背景
LinuxKit 是一种用于构建最小化、不可变 Linux 系统的框架,其核心思路是:把系统组件(init、内核、容器运行时、各类服务)全部打包为 Container,最终产出一个包含内核、initrd 与启动参数的最小可启动镜像。由于系统以容器为最小单元组织,镜像天然具备体积小、可复现、易审计的特性,非常适合作为运行 Kubernetes 各组件(kubelet、kubeadm、etcd 等)的底层虚拟机系统。
在 LinuxKit 项目中,Moby与LinuxKit是两个配套工具:moby负责根据 YAML 定义组装系统镜像,linuxkit负责对镜像执行运行与生命周期管理。本指南构建出的 Kubernetes 节点镜像,正是用这套工具链从零组装起来的。
kubernetes-handbook 将本文档收录在 部署指南 的"集群部署"章节中(见 SUMMARY.md),与 kubeadm、kops、Kubespray、Azure、Windows 等方法并列,作为"在本地用 LinuxKit 起一套 K8s 集群"的补充方案。
部署环境与版本约定
本指南在Mac OS X系统上进行,涉及的核心组件版本如下:
| 组件 | 版本 |
|---|---|
| Kubernetes | v1.7.2 |
| Etcd | v3 |
| Weave | 最新版(集群网络插件) |
| Docker | v17.06.0-ce |
说明:上述版本是本文档编写时的实测环境。kubernetes-handbook 的版本依赖表显示,v1.13/v1.12 均支持 Docker 17.06 这一版本,可见 17.06 在 Kubernetes 社区中是长期受支持的 Docker 版本。若你在更新的环境(如更高版本 Kubernetes 或新版本 Docker)中复现,建议先核对 kubeadm 与 kubelet 的版本兼容性。
其中 Weave 作为集群 Pod 网络方案出现,仓库 extension/network/weave.md 提供了 Weave 网络插件的更多原理与配置参考,可配合阅读。
预先准备
开始之前,主机需要满足以下条件:
- 已安装并启动
Docker工具; - 已安装
Git工具; - 已下载 LinuxKit 项目,并完成
Moby与LinuxKit两个工具的构建。
拉取并构建 LinuxKit 工具链
$ git clone https://github.com/linuxkit/linuxkit.git $ cd linuxkit $ make $ ./bin/moby version moby version 0.0 commit: c2b081ed8a9f690820cc0c0568238e641848f58f $ ./bin/linuxkit version linuxkit version 0.0 commit: 0e3ca695d07d1c9870eca71fb7dd9ede31a38380执行make后,会在bin/目录下生成moby与linuxkit两个可执行文件。moby version与linuxkit version输出的commit哈希可用于确认工具链来源与一致性,便于复现和排查问题。
建构 Kubernetes 系统映像档
LinuxKit 官方仓库中已经内置了 Kubernetes 的示例工程,位于linuxkit/projects/kubernetes/。进入该目录后执行:
$ cd linuxkit/projects/kubernetes/ $ make build-vm-images ... Create outputs: kube-node-kernel kube-node-initrd.img kube-node-cmdlinebuild-vm-images目标会完成 Kubernetes 节点系统的组装,最终生成三份产出物:
kube-node-kernel:节点虚拟机使用的内核镜像;kube-node-initrd.img:包含 kubelet、kubeadm 等 Kubernetes 组件与运行时依赖的 initrd(初始内存盘)镜像;kube-node-cmdline:虚拟机启动时传递给内核的命令行参数。
这三者正是 LinuxKit 启动一个最小 Kubernetes 虚拟机所需的全部要素:内核负责硬件抽象与系统启动,initrd 承载 Kubernetes 组件,cmdline 提供启动配置。后续部署中的boot.sh脚本就是基于这三份产出物来创建 Master 与 Worker 虚拟机的。
部署 Kubernetes 集群
启动 Master 并获取节点 IP
完成映像建构后,先启动 Master OS:
$ ./boot.sh启动完成后,在虚拟机内查看网络接口以获取节点 IP:
(ns: getty) linuxkit-025000000002:~\# ip addr show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 02:50:00:00:00:02 brd ff:ff:ff:ff:ff:ff inet 192.168.65.3/24 brd 192.168.65.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::abf0:9fa4:d0f4:8da2/64 scope link valid_lft forever preferred_lft forever本例中 Master 的 IP 为192.168.65.3。可以看到 LinuxKit 虚拟机的 MAC 地址与主机名linuxkit-025000000002一一对应(02:50:00:00:00:02),这为后续在集群中识别节点提供了线索。
SSH 进入 Master 并初始化 kubeadm
在宿主机上开启一个新的 Console,通过ssh_into_kubelet.sh脚本 SSH 进入 Master,然后执行 kubeadm 初始化:
$ cd linuxkit/projects/kubernetes/ $ ./ssh_into_kubelet.sh 192.168.65.3 linuxkit-025000000002:/\# kubeadm-init.sh ... kubeadm join --token 4236d3.29f61af661c49dbf 192.168.65.3:6443kubeadm-init.sh是 LinuxKit 工程预置的 Master 初始化脚本,内部封装了kubeadm init流程。当 kubeadm 完成后,控制台会打印类似kubeadm join --token 4236d3.29f61af661c49dbf 192.168.65.3:6443的加入指令,其中的 Token(如4236d3.29f61af661c49dbf)与 API Server 地址(192.168.65.3:6443)是后续 Worker 节点加入集群的凭证,请务必记录。
启动并加入 Worker 节点
开启新的 Console,用 boot 脚本启动 Node 并传入 kubeadm join 参数:
console1>$ ./boot.sh 1 --token 4236d3.29f61af661c49dbf 192.168.65.3:6443P.S. 开启节点的格式为
./boot.sh <n> [<join_args> ...],其中<n>是节点编号,<join_args>直接透传给 kubeadm join。
继续开启两个 Console,分别启动节点 2 与节点 3 加入集群:
console2> $ ./boot.sh 2 --token 4236d3.29f61af661c49dbf 192.168.65.3:6443 console3> $ ./boot.sh 3 --token 4236d3.29f61af661c49dbf 192.168.65.3:6443查看集群节点状态
回到 Master 节点,执行kubectl get no查看节点加入情况:
$ kubectl get no NAME STATUS AGE VERSION linuxkit-025000000002 Ready 16m v1.7.2 linuxkit-025000000003 Ready 6m v1.7.2 linuxkit-025000000004 Ready 1m v1.7.2 linuxkit-025000000005 Ready 1m v1.7.2可以看到 4 个节点(1 个 Master + 3 个 Worker)均已就绪,且主机名延续了linuxkit-025000000002的命名规律——每新增一个节点,编号依次递增。至此,一个由 4 台 LinuxKit 虚拟机组成的 Kubernetes v1.7.2 集群已经成功建立。
简单部署 Nginx 服务
Kubernetes 支持两种应用部署方式:一是直接用kubectl run命令创建 Deployment,二是编写 YAML/JSON 清单文件描述部署配置。下面用命令行的方式部署一个简单的 Nginx 服务。
创建 Pod
$ kubectl run nginx --image=nginx --replicas=1 --port=80 $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-1423793266-v0hpb 1/1 Running 0 38s 10.42.0.1 linuxkit-025000000004kubectl run创建了一个名为nginx的 Deployment,Pod 运行在linuxkit-025000000004节点上,分配到的集群内 IP 为10.42.0.1。其中10.42.0.0/16网段即由 Weave 网络插件负责分配。
暴露 Service
接着创建 Service,将 Nginx 应用以 NodePort 方式暴露到宿主机网络:
$ kubectl expose deploy nginx --port=80 --type=NodePort $ kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.96.0.1 <none> 443/TCP 19m nginx 10.108.41.230 <nodes> 80:31773/TCP 5s输出中nginx服务的80:31773/TCP表示集群内端口 80 被映射到了宿主机上的 31773 端口,EXTERNAL-IP显示为<nodes>,即所有节点都可访问该 NodePort。
通过 VNC 桌面访问 Nginx
由于本集群运行在 LinuxKit 虚拟机中、并非物理机部署,网络使用的是 Docker 的 namespace 网络,因此需要借助ubuntu-desktop-lxde-vnc容器提供一个浏览器环境来访问 Nginx 应用:
$ docker run -it --rm -p 6080:80 dorowu/ubuntu-desktop-lxde-vnc完成后通过浏览器访问
http://localhost:6080连接 HTML VNC,即可在虚拟桌面中打开浏览器访问集群中的 Nginx 服务。
关闭节点
验证结束后,在对应节点上执行halt即可关闭该 LinuxKit 虚拟机:
$ halt [1503.034689] reboot: Power down小结与扩展阅读
本文完整走通了"LinuxKit 构建 Kubernetes 镜像 → 启动 Master → kubeadm 初始化 → 批量加入 Worker → 部署 Nginx 服务"的全流程。这种方式的典型价值在于:Kubernetes 节点系统被固化为不可变镜像,任何节点都是同一镜像的拷贝,具备一致性与可复现性,非常适合教学演示、本地开发与 CI 环境。
若希望进一步深入,可在本仓库中继续阅读以下内容:
- 部署指南(setup/index.md):查看 LinuxKit 在整个部署方法体系中的定位,以及各组件版本依赖表;
- Weave 网络插件(extension/network/weave.md):了解集群 Pod 网络 Weave 的实现原理与配置;
- 集群部署总览(setup/cluster/README.md):对比 kubeadm、kops、Kubespray 等其他集群部署方式的适用场景;
- Kubernetes-The-Hard-Way(setup/k8s-hard-way/):如需在云上从零手工部署高可用集群,可参考这套更底层的实操教程。
注意:本文档演示环境为 Kubernetes v1.7.2 与 Docker v17.06.0-ce,属于较早期版本。在现代 Kubernetes 版本中,kubeadm 的初始化参数、Token 格式与 CNI 插件要求均有变化,实际复现时请以当前使用的版本为准。
- 云原生
- 教程
【免费下载链接】kubernetes-handbook
Kubernetes Handbook (Kubernetes指南) https://kubernetes.feisky.xyz
相关推荐
LinuxKit 在 Microsoft Azure 上的镜像构建与虚拟机部署实战指南
LinuxKit 在 Microsoft Azure 上的镜像构建与虚拟机部署实战指南 本文以 docs/platform azure.md https://l
操作系统云原生容器运行时Patroni 容器化快速上手:用 Docker 构建镜像并部署三节点高可用集群与 Citus 集群
Patroni 容器化快速上手:用 Docker 构建镜像并部署三节点高可用集群与 Citus 集群 Patroni 仓库在 docker/ 目录下提供了两个
数据库高可用集群管理运维后端SMS Backup+自动备份配置教程:确保Android短信数据永不丢失的终极指南
SMS Backup+自动备份配置教程:确保Android短信数据永不丢失的终极指南 SMS Backup+是一款功能强大的Android短信、MMS和通话记录
移动开发即时通讯
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考