# 非典型K8s入门指南：搭建本地练习环境

其实想写 K8s 很久了，但老是担心自己功力不够，写不好，另一方面又觉得现在教程这么多，官方中文版也蛮好的，再去写一版似乎也没啥意义，再说 K8s 里面的知识点也挺多的，也不知道要写多久。

初衷来源于当前的工作环境，周边一些同事在啃大部头书《Kubernetes权威指南》，一年了，也没啥进展，也没有看完，心中着实着急。作为曾经的一名 CRUD 工程师，我以为，普通开发者，完全没有必要一开始就看这么厚的书。同事既没独立部署过 K8s，也没有玩过minikube，平时想要练习 kubectl, 还得 ssh 登录到公司到的 k8s master 节点上操作……

当然，每个人都有自己的学习习惯，以我的观察，除了工作及面试需求，大部分应用开发者，都不会主动去学习 K8s 的相关知识的，更不用提实操了。

再者，从笔者的经历来看：对于应用开发工程师面言，了解 K8s 基本概念，知道如何使用即可，这样有助于跨部门的协作与沟通。因为软件工程是分好多种角色，譬如：开发、测试、运维等，在大部分公司， 一个人不可能胜任所有角色，特别是在中大型公司，对权限管控较严的，普通开发可能完全接触不到运维的工作，更别说操作 K8s 了。

不知是走运还是不幸，笔者兼任过开发、测试、运维，还有 PM，在跨部门协作方面，还是有一些浅薄的经验的，懂的多一点，沟通上会省心不少。

回归正题，想要学习 K8s，除了耐心阅读***官方***文档之外，还得有一个友好、可快速启动的实操学习环境。为了写这篇文章，笔者根据自己过往的学习路径的经验，经过一系列调研(包括但不限于minkube、kind、k3d、k3s等），选择了一套最易于本地学习K8s，同时又比较省资源的一套方案(想起当年为了学习 K8s，那叫一个折腾)。

## K8s 本地练习环境选型

所谓练习方案要考虑要网络环境(科学上网)、资源占用量、启动和销毁的难易，考虑到有不少人还在使用 windows 开发，所以选型也需要尽量跨平台体验的一致性，所以，我选用的方案是：multipass+k3s，下面逐一进行介绍。

#### Multipass

> Multipass 是由Ubuntu官方提供，在Linux，MacOS和Windows上快速生成 *Ubuntu虚拟机* 的工具。它提供了一个简单但功能强大的CLI，可让我们在本地快速进入Ubuntu系统环境并使用Linux命令，亦可以在本地计算机创建自己的迷你型云服务器。总的来说就是在本地创建Ubuntu虚拟机，可以获得云端Ubuntu服务器般的体验。

选它是因为入门友好，且够轻量，参照安装文档即可：[https://multipass.run/install](https://multipass.run/install)，笔者使用的是苹果电脑，安装命令如下所示：

```bash
brew install --cask multipass
```

简单一条命令就行启动一个 ubuntu 虚拟机，为了加速首次创建虚拟机时的镜像下载速度，可以设置国内镜像如下所示：

```bash
multipass set local.image.mirror=https://mirrors.cloud.tencent.com/ubuntu-cloud-images/
```

创建虚拟机机

```bash
multipass launch 22.04 --name ik8s
```

如何简单就创建好了一个ubuntu:22.04、名为 ik8s 的虚拟机，使用命令 multipass list 查看刚刚创建好的虚拟机

```bash
multipass list
Name                    State             IPv4             Image
ik8s                    Running           192.168.106.20   Ubuntu 22.04 LTS
```

使用命令 multipass shell ik8s 进入虚拟机里命令行

```bash
multipass shell ik8s
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-101-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro
  ……
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ik8s:~$
```

常用命令如下所示

```bash
# 停止ik8s
multipass stop ik8s
# 启动ik8s
multipass start ik8s
# 删除ik8s
multipass delete ik8s
```

### K3s

> K3s 是一个轻量级的 Kubernetes 发行版，它针对边缘计算、物联网等场景进行了高度优化

轻巧，到什么程度呢，启动起来只用不到 0.5G 内存，没法不爱。而且，对国内用户的支持也是相当友好，这么说吧，在线安装 K8s 的用户体验，我就没见过比 K3s 更友好的了，一条命令拿下

```bash
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
```

`INSTALL_K3S_MIRROR=cn` 充分考虑到了国内用户的使用体验，对主流操作系统如 centos、debian 等，以及各种架构如 arm64、amd64 的支持也是相当友好。

## K8s本地练习环境搭建

前面介绍了一些技术选型，下面开始正式搭建本地 K8s 了

### 安装 docker

对于这一步，自然是可以参照 docker 的官方文档启动并安装，这里我提供一个更简单、通用在线安装 docker 的方法，进入 ik8s ，在线安装 25.0.5 版本的 docker，如下所示

```bash
ubuntu@ik8s:~$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun --version 25.0.5
# Executing docker install script, commit: e5543d473431b782227f8908005543bb4389b8de
+ sudo -E sh -c 'apt-get update -qq >/dev/null'
+ sudo -E sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null'
+ sudo -E sh -c 'install -m 0755 -d /etc/apt/keyrings'
+ sudo -E sh -c 'curl -fsSL "https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg'
+ sudo -E sh -c 'chmod a+r /etc/apt/keyrings/docker.gpg'
+ sudo -E sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu jammy stable" > /etc/apt/sources.list.d/docker.list'
+ sudo -E sh -c 'apt-get update -qq >/dev/null'
INFO: Searching repository for VERSION '25.0.5'
INFO: apt-cache madison docker-ce | grep '25.0.5' | head -1 | awk '{$1=$1};1' | cut -d' ' -f 3
INFO: apt-cache madison docker-ce-cli | grep '25.0.5' | head -1 | awk '{$1=$1};1' | cut -d' ' -f 3
+ sudo -E sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce=5:25.0.5-1~ubuntu.22.04~jammy docker-ce-cli=5:25.0.5-1~ubuntu.22.04~jammy containerd.io docker-compose-plugin docker-ce-rootless-extras=5:25.0.5-1~ubuntu.22.04~jammy docker-buildx-plugin >/dev/null'
……
To run the Docker daemon as a fully privileged service, but granting non-root
users access, refer to https://docs.docker.com/go/daemon-access/

WARNING: Access to the remote API on a privileged Docker daemon is equivalent
         to root access on the host. Refer to the 'Docker daemon attack surface'
         documentation for details: https://docs.docker.com/go/attack-surface/

================================================================================
```

### 安装 k3s

容器运行时为 docker, k8s 版本为 v1.26.7，以下是安装示例

```bash
ubuntu@ik8s:~$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_VERSION=v1.26.7+k3s1 INSTALL_K3S_MIRROR=cn sh -s - --docker
[INFO]  Using v1.26.7+k3s1 as release
[INFO]  Downloading hash rancher-mirror.rancher.cn/k3s/v1.26.7-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary rancher-mirror.rancher.cn/k3s/v1.26.7-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]  Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[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
```

快到离谱，快到不可思议，如果你有更快的方法，一定要告诉我。

查看 K3s 状态

```bash
ubuntu@ik8s:~$ sudo k3s kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE   ERROR
controller-manager   Healthy   ok
etcd-0               Healthy
scheduler            Healthy   ok
```

好了，现在你拥有一个本地的 K8s 练习环境，可以尽情折腾了。

---

参考：

* [https://www.cnblogs.com/iorson/p/16927992.html](https://www.cnblogs.com/iorson/p/16927992.html)
    
* [https://docs.rancher.cn/docs/k3s/\_index/](https://docs.rancher.cn/docs/k3s/_index/)
    
* [https://k3d.io](https://k3d.io/v5.2.0/usage/registries/)
    
* [https://github.com/k3d-io/k3d/releases](https://github.com/k3d-io/k3d/releases)
    
* [https://developer.aliyun.com/article/110806](https://developer.aliyun.com/article/110806)
    
* [https://multipass.run/](https://multipass.run/)
