实践环境#
- Ubuntu 22.04
- Docker 20.10.13
- K3s v1.23.13+k3s1
本文将使用 Ubuntu 系统,如选择 Centos 系统,亦可作为参考,其步骤与命令大同小异,万变不离其宗。
安装 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#
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 将使用本地的脚本和二进制。
手动部署镜像#
假设您已经在离线 / 国内环境中创建了节点。这种方法需要您手动将必要的镜像部署到每个节点,适用于运行无法部署镜像仓库的边缘部署场景。参考官方手动部署镜像文档。
-
从 K3s GitHub Release 页面获取需安装的 K3s v1.23.13+k3s1 的镜像 tar 文件。
-
将 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/
-
需手动将镜像部署到每个节点,在每个节点执行上述操作。
下载 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 地址,同官方源 |
# 下载脚本
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