Kubernetes 入门到实践：搭建 K3s 集群初体验

实践环境

Ubuntu 22.04

Docker 20.10.13

K3s v1.23.13+k3s1

本文将使用 Ubuntu 系统，如选择 Centos 系统，亦可作为参考，其步骤与命令大同小异，万变不离其宗。

本文首发于：https://github.com/y0ngb1n/y0ngb1n.github.io

安装 Docker

K3s 包含并默认为 containerd， 一个行业标准的容器运行时。本文将使用 Docker 作为容器运行时，需要提前安装 Docker 环境。

Copy
# 更新软件源
sudo apt update

# 切换 root 用户
sudo su -

# 安装 docker
apt install docker.io

# 启动 docker daemon
systemctl enable --now docker
systemctl status docker

# 验证 docker 环境
docker version && docker info
docker ps

后续启动 K3s 时使用--docker 选项激活。参考使用 Docker 作为容器运行时文档。

安装 K3s

Lightweight Kubernetes. Production ready, easy to install, half the memory, all in a binary less than 100 MB.

K3s 是一个高可用的、经过 CNCF 认证的轻量级 Kubernetes 发行版，专为物联网及边缘计算设计。

k3s 将安装 Kubernetes 所需的一切打包进仅有 60MB 大小的二进制文件中，并且完全实现了 Kubernetes API。为了减少运行 Kubernetes 所需的内存，k3s 删除了很多不必要的驱动程序，并用附加组件对其进行替换。由于它只需要极低的资源就可以运行，因此它能够在任何 512MB 内存以上的设备上运行集群。

我们先从简单的 K3s 上手，体验下 K8s 的一半 K3s。待 K3s 大法修炼成功后，我们再采用 kubeadm 进行部署高可用 Kubernetes 集群，其部署架构几乎一样，只是个别核心组件的变化，万变不离其宗，可依葫芦画瓢。

方案一：一键安装（官方源，需外网）

因 K3s 的核心组件镜像需从 gcr.io 拉取（国内网络不通），所以需具备外网访问的环境，适用于服务器均在国外的环境选用，简单粗暴一键安装。

Copy
# 一键默认安装
curl -sfL https://get.k3s.io | sh -

方案二：一键安装（国内源）推荐

国内用户，可以使用以下方法加速安装，内置阿里云镜像源：

https://docs.rancher.cn/docs/k3s/installation/install-options/_index

https://b23.tv/iGpYZQn

Copy
# 指定 K3s 版本
export INSTALL_K3S_VERSION=v1.23.13+k3s1

# 自定义启动执行命令
export INSTALL_K3S_EXEC="--docker"

# 只安装不启动
export INSTALL_K3S_SKIP_START=true

# https://docs.rancher.cn/docs/k3s/installation/installation-requirements/_index#先决条件
# 为您添加到集群的每个节点设计一个独特的名称
export K3S_NODE_NAME=k3s-node-01

###
# agent 需加上，其他保持一致
###
# 设置了 K3S_URL，它将默认为“agent”。如果未设置K3S_URL，它将默认为“server”
export K3S_URL=
# 用于将 server 或 agent 加入集群的共享 secret
export K3S_TOKEN=

# 使用阿里云镜像源安装
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

# 启动 K3s 服务
systemctl enable --now k3s

# 查看 K3s 服务状态
systemctl status k3s

方案三：离线安装

前提条件

在安装 K3s 之前，完成上面的部署私有镜像仓库或手动部署镜像，导入安装 K3s 所需要的镜像。本小节将演示手动部署镜像的方式。

从 K3s GitHub Release 页面下载 K3s v1.23.13+k3s1 二进制文件，K3s 二进制文件需要与离线镜像的版本匹配。将二进制文件放在每个离线节点的 /usr/local/bin 中，并确保这个二进制文件是可执行的。

下载 K3s 安装脚本，将安装脚本放在每个离线节点的任意地方，并命名为 install.sh。

当使用 INSTALL_K3S_SKIP_DOWNLOAD 环境变量运行 K3s 脚本时，K3s 将使用本地的脚本和二进制。

手动部署镜像

假设您已经在离线 / 国内环境中创建了节点。这种方法需要您手动将必要的镜像部署到每个节点，适用于运行无法部署镜像仓库的边缘部署场景。参考官方手动部署镜像文档。

从 K3s GitHub Release 页面获取需安装的 K3s v1.23.13+k3s1 的镜像 tar 文件。

将 tar 文件放在images目录下，例如：

Copy
# 为每个节点创建离线镜像的存储文件夹
sudo mkdir -p /var/lib/rancher/k3s/agent/images/

# $ARCH 是当前服务器的 CPU 架构
sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/

需手动将镜像部署到每个节点，在每个节点执行上述操作。

下载 K3s v1.23.13+k3s1 二进制文件

从 K3s GitHub Release 页面下载 K3s v1.23.13+k3s1 二进制文件，K3s 二进制文件需要与离线镜像的版本匹配。将二进制文件放在每个离线节点的 /usr/local/bin 中，并确保这个二进制文件是可执行的。

使用脚本安装

安装脚本可从下面任一地址下载：

脚本地址 | 说明
https://get.k3s.io/ | 官方地址，需要外网环境
https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | 阿里源，内置阿里云镜像源
https://raw.githubusercontent.com/k3s-io/k3s/master/install.sh | GitHub 地址，同官方源

Copy
# 下载脚本
curl -sfL https://get.k3s.io > install.sh

# 切换 root 用户
sudo su -

# 赋予执行权限
chmod +x install.sh

# 安装 K3s，跳过下载二进制文件，只安装，不启动
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_SKIP_START=true ./install.sh

# 启动 K3s
systemctl enable --now k3s

验证 K3s

检查集群

Copy
# 查看集群的运行情况
kubectl get nodes -owide
kubectl get all -A -owide
kubectl describe nodes k3s-node-01
kubectl -n kube-system describe deploy coredns

# 使用 Docker 作为运行时，会使用 docker 拉取镜像与运行容器
docker images
docker ps

牛刀小试

启动 whoami 服务

Copy
# 快速部署 whoami 应用，指定副本为 2，默认副本为 1
kubectl create deploy whoami --image=traefik/whoami --replicas=2
kubectl describe deploy whoami
# 监控 pod 状态，通过扩缩容可直观看到 pod 的调度情况
kubectl get pods --watch
# 尝试下对 whoami 应用进行扩缩容
kubectl scale deploy whoami --replicas=5

请求链路说明

让我们尝试着理解下 k8s 的请求链路：

Copy
request public-ip -> node-port -> svc-port -> pod-port -> container

通过 Service 暴露给集群内部访问

默认为 NodePort 模式，会在每个节点监听

Copy
kubectl expose deploy whoami --port=80
kubectl get svc -owide
kubectl describe svc whoami

# 在本地通过 service 多访问几次，出轮询访问 container
# curl http://<external-ip>:<port>
$ curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
Hostname: whoami-84d974bbd6-shqsr
IP: 127.0.0.1
IP: 10.42.0.13
RemoteAddr: 10.42.0.1:42158
GET / HTTP/1.1
Host: 10.43.181.167
User-Agent: curl/7.68.0
Accept: */*

通过 Service 暴露给集群外网访问

指定 LoadBalancer 模式并指定公网 IP

Copy
# 自行替换 <PUBLIC_IP> 为当前节点的公网 IP
kubectl expose deploy whoami --type=LoadBalancer --port=80 --external-ip <PUBLIC_IP>

$ kubectl get svc whoami -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
whoami LoadBalancer 10.43.77.116 123.123.123.123 80:32101/TCP 16s app=whoami

# 集群内部仍可正常访问
curl 10.43.77.116
curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`

# 通过外网浏览器访问，需要开启云服务商的防火墙配置
# Ctrl + F5 多刷新几次查看效果
http://123.123.123.123:32101

快速清理实验环境

Copy
kubectl delete all --all

卸载 K3s

https://docs.rancher.cn/docs/k3s/installation/uninstall/_index/

Copy
# 一键卸载 server
k3s-uninstall.sh

# 一键卸载 agent
k3s-agent-uninstall.sh

参考链接