y0ngb1n

Aben Blog

欢迎来到我的技术小黑屋ヾ(◍°∇°◍)ノ゙
github

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 发行版,专为物联网及边缘计算设计。

image

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

参考链接#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。