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

实践环境

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

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

安装 Docker

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

# 更新软件源
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 拉取(国内网络不通),所以需具备外网访问的环境,适用于服务器均在国外的环境选用,简单粗暴一键安装。

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

方案二:一键安装(国内源)推荐

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

# 指定 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 将使用本地的脚本和二进制。

手动部署镜像

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

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

  2. 将 tar 文件放在images目录下,例如:

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

    # $ARCH 是当前服务器的 CPU 架构
    sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
  3. 需手动将镜像部署到每个节点,在每个节点执行上述操作。

下载 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.shGitHub 地址,同官方源
# 下载脚本
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

检查集群

# 查看集群的运行情况
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 服务

# 快速部署 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 的请求链路:

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

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

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

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

# 自行替换 <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

快速清理实验环境

kubectl delete all --all

卸载 K3s

# 一键卸载 server
k3s-uninstall.sh

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

参考链接

感谢您的阅读,本文由 杨斌的博客 版权所有。如若转载,请注明出处:杨斌的博客(https://y0ngb1n.github.io/a/setup-k3s-cluster-with-docker.html
使用 Docker 快速搭建单机版的 Kubernetes 集群
Kubernetes 入门到实践:借助 WireGuard 跨云搭建 K3s 集群环境