系列概述

Kubernetes 是高度可扩展的。即 Kubernetes 可以在不修改 Kubernetes 源码的情况下,提供 Kubernetes 原生不具备的能力。

Kubernetes 扩展点众多,本系列无法一一枚举,因此本系列将从具体场景和实践出发,介绍 Kubernetes 的部分扩展点。

本系列未提到的 Kubernetes 扩展能力,可以参见 Kubernetes 官方文档:扩展 Kubernetes

本系列假设读者了解 Kubernetes 的基本使用,理解 Kubernetes 的基本概念,如 Pod、Deployment、PV、PVC 等。

k3s 简述

要对 Kubernetes 进行扩展开发,需要搭建一个 Kubernetes 测试环境,本系列将在一台 Linux 虚拟机上使用 k3s 搭建一个 Kubernetes 测试集群。

选择 k3s 的原因是:

  • 完全兼容 Kubernetes。
  • 生产就绪,轻量级。
  • CNCF Sandbox 项目。
  • 维护者是 Rancher Labs (创始人为华人 Sheng Liang(梁胜)),2020 被 SUSE (号称全球最大的独立开源公司)收购。

关于 k3s 的简述,参见: K3s - 轻量级 Kubernetes

k3s 除了支持单机部署一个集群外,还支持如下场景,比如:

更多参见:官方文档

安装 k3s

version: v1.26.3+k3s1

在使用 systemd 或 openrc 的 Linux x86_64 或 amd 操作系统 (kernal version >= 5.1) 中执行如下安装命令(详细要求参见:官方文档 - 要求):

# curl -sfL https://get.k3s.io | sh -
# 中国大陆
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
sudo chmod 666 /etc/rancher/k3s/k3s.yaml # 仅测试,让当前机器其他用户可以直接通过 kubectl 操作集群。

输出如下:

[INFO]  Finding release for channel stable
[INFO]  Using v1.26.3+k3s1 as release
[INFO]  Downloading hash rancher-mirror.rancher.cn/k3s/v1.26.3-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary rancher-mirror.rancher.cn/k3s/v1.26.3-k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

脚本主要行为 (分析 get.k3s.io 脚本):

  • 校验系统:确保当前系统存在 systemd 或 openrc。
  • 下载安装 k3s 二进制文件到 /usr/local/bin/ 目录。
  • /usr/local/bin 创建软链 kubectl crictl ctr 指向 k3s 二进制文件。
  • /usr/local/bin 创建 k3s-killall.shk3s-uninstall.sh 脚本。
  • 创建环境变量文件 /etc/systemd/system/k3s.service.env
  • 安装 systemd service 到 /etc/systemd/system/k3s.service,并启动该 service。

在安装阶段,安装脚本安装的文件如下所示:

/usr/local/bin/
  k3s                # 唯一的可执行文件
  kubectl -> k3s
  crictl -> k3s
  ctr -> k3s
  k3s-killall.sh     # 停止服务的脚本
  k3s-uninstall.sh   # 卸载 k3s 的脚本

/etc/systemd/system/
  k3s.service.env    # 环境变量
  k3s.service

运行分析

配置和数据目录

在运行,k3s 会产生如下目录和文件。

/etc/rancher/
  k3s/k3s.yaml           # kubectl
  node/password          # 节点秘钥
/run/
  k3s/containerd/        # containerd 相关文件目录
  flannel/subnet.env     # flannel 网络配置
/var/lib/
  rancher/k3s/           # k3s 数据目录
  kubelet/               # kubelet 数据目录

进程和架构分析

ps -ef -w w

image

  • /usr/local/bin/k3s server k3s server 进程,包含:

    可以看出,all in one,这就是 k3s 和标准 Kubernetes 的核心区别

  • containerd -c /var/lib/rancher/k3s/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var/lib/rancher/k3s/agent/containerd containerd 进程,默认会启动如下容器(k3s 称为封装的组件):

    • traefik 默认 ingress controller。
    • metrics-server 容器。
    • local-path-provisioner 利用本地磁盘实现 pvc 的一个存储类。
    • coredns core dns。

安装 Kubernetes 仪表板

参见:官方文档

注意,如果浏览器和 k3s server 不在同一设备执行如下命令:

# k3s 所在设备执行
kubectl proxy
# 浏览器所在设备执行
ssh -L localhost:8001:localhost:8001 -NT dev # dev 为 k3s 所在设备的 host

打开浏览器,访问: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

token 通过如下方式获取:

kubectl -n kubernetes-dashboard create token admin-user

k3s 集群操作

停止和启动

k3s 提供了两种停止 k3s 集群的方式:

  • sudo systemctl stop k3s.service 仅停止 k3s server 服务,已运行的容器仍然运行。
  • sudo k3s-killall.sh 停止 k3s server 服务,同时停止所有运行中的容器、网络、iptables、并重置 containerd 的状态。集群数据不会删除,在启动后,k3s 会重新拉起对应的 Pod。

针对以上两种,重新启动的方式都是一样的:

sudo systemctl start k3s.service

卸载

k3s-uninstall.sh