k3s 简介

K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化。K3s 有以下增强功能:

  • 打包为单个二进制文件。
  • 使用基于 sqlite3 的轻量级存储后端作为默认存储机制。同时支持使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。
  • 封装在简单的启动程序中,通过该启动程序处理很多复杂的 TLS 和选项。
  • 默认情况下是安全的,对轻量级环境有合理的默认值。
  • 添加了简单但功能强大的batteries-included功能,例如:本地存储提供程序,服务负载均衡器,Helm controller 和 Traefik Ingress controller。
  • 所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。
  • 最大程度减轻了外部依赖性,K3s 仅需要 kernel 和 cgroup 挂载。 K3s 软件包需要的依赖项包括:
    • containerd
    • Flannel
    • CoreDNS
    • CNI
    • 主机实用程序(iptables、socat 等)
    • Ingress controller(Traefik)
    • 嵌入式服务负载均衡器(service load balancer)
    • 嵌入式网络策略控制器(network policy controller)

适用场景

K3s 适用于以下场景:

  • 边缘计算-Edge
  • 物联网-IoT
  • CI
  • Development
  • ARM
  • 嵌入 K8s

由于运行 K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。

Red Hat/CentOS Enterprise Linux 的额外准备工作

建议关闭 firewalld:

systemctl disable firewalld --now

安装

安装过程极其简单,不需要提前安装 runtime,安装 k3s 的时候会自动安装默认的 containerd。也不需要提前安装数据库,默认使用 sqlite3 做后端数据库,当然也可以手动指定使用其他数据库。国内也有相应的镜像加速,只需要通过指定INSTALL_K3S_MIRROR=cn即可,比如:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_CHANNEL=v1.31 K3S_KUBECONFIG_OUTPUT=/root/.kube/config sh -s - \
    --node-name=k3s-master \
    --cluster-cidr=10.3.0.0/16 \
    --service-cidr=172.16.0.0/16 \
    --service-node-port-range=30000-40000 \
    --default-local-storage-path=/data/k3s-storage \
    --system-default-registry=registry.cn-hangzhou.aliyuncs.com
  • INSTALL_K3S_CHANNEL=v1.31:国内镜像指定安装 1.31 版本。
  • INSTALL_K3S_MIRROR=cn:指定 K3s 的二进制文件从国内的阿里云对象存储上去拉取。
  • --node-name: 手动设定节点名称
  • --cluster-cidr:用于 Pod IP 的网络 CIDR
  • --service-cidr:用于 service IP 的网络 CIDR
  • --service-node-port-range:为具有 NodePort 可见性的服务保留的端口范围
  • --default-local-storage-path:本地存储类的默认存储路径
  • --system-default-registry:指定 K3s 的系统镜像从国内的阿里云镜像仓库

更多安装参数参考:https://docs.rancher.cn/docs/k3s/installation/install-options/server-config/_index

最后如出现以下提示则安装成功:

Complete!
[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

初步使用

设定补全:

source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包
echo "source <(kubectl completion bash)" >> ~/.bashrc # 在你的 bash shell 中永久地添加自动补全

查看节点信息:

# kubectl get nodes -o wide
NAME         STATUS   ROLES                  AGE   VERSION         INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                           KERNEL-VERSION              CONTAINER-RUNTIME
k3s-master   Ready    control-plane,master   14m   v1.31.10+k3s1   192.168.4.6   <none>        Rocky Linux 8.7 (Green Obsidian)   4.18.0-425.3.1.el8.x86_64   containerd://2.0.5-k3s1.32
# 
# kubectl get pods -A -o wide
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE   IP         NODE         NOMINATED NODE   READINESS GATES
kube-system   coredns-69b4d6d85c-dcf79                  1/1     Running     0          16m   10.3.0.4   k3s-master   <none>           <none>
kube-system   helm-install-traefik-crd-9lpls            0/1     Completed   0          16m   10.3.0.5   k3s-master   <none>           <none>
kube-system   helm-install-traefik-z9frf                0/1     Completed   1          16m   10.3.0.6   k3s-master   <none>           <none>
kube-system   local-path-provisioner-864d7dff5d-kwwfb   1/1     Running     0          16m   10.3.0.2   k3s-master   <none>           <none>
kube-system   metrics-server-69969b57cb-grgm7           1/1     Running     0          16m   10.3.0.3   k3s-master   <none>           <none>
kube-system   svclb-traefik-321df4cf-9qvmh              2/2     Running     0          10m   10.3.0.7   k3s-master   <none>           <none>
kube-system   traefik-5755fb5747-trfwm                  1/1     Running     0          10m   10.3.0.8   k3s-master   <none>           <none>
# 
# kubectl get svc -A -o wide
NAMESPACE     NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
default       kubernetes       ClusterIP      172.16.0.1       <none>        443/TCP                      17m   <none>
kube-system   kube-dns         ClusterIP      172.16.0.10      <none>        53/UDP,53/TCP,9153/TCP       17m   k8s-app=kube-dns
kube-system   metrics-server   ClusterIP      172.16.156.146   <none>        443/TCP                      17m   k8s-app=metrics-server
kube-system   traefik          LoadBalancer   172.16.173.64    192.168.4.6   80:37204/TCP,443:36021/TCP   10m   app.kubernetes.io/instance=traefik-kube-system,app.kubernetes.io/name=traefik

k3s 维护

如果想停止 k3s,只需执行systemctl stop k3s即可。

删除 k3s

在 server 节点执行:

/usr/local/bin/k3s-killall.sh
/usr/local/bin/k3s-uninstall.sh

更多 k3s 文档查看:https://docs.rancher.cn/docs/k3s/_index