安装k3s

K3s 是轻量级的 Kubernetes。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。

k3s 文档:https://docs.rancher.cn/docs/k3s/_index

K3s介绍

什么是 K3s?

K3s 是一个完全兼容的 Kubernetes 发行版,具有以下增强功能:

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

为什么叫 K3s?

我们希望安装的 Kubernetes 只占用一半的内存。Kubernetes 是一个 10 个字母的单词,简写为 K8s。Kubernetes 的一半就是一个 5 个字母的单词,因此简写为 K3s。K3s 没有全称,也没有官方的发音。

适用场景

K3s 适用于以下场景:

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

由于运行 K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。在这些场景中,如果开发或测试人员需要对某些功能进行验证,或对某些问题进行重现,那么使用 K3s 不仅能够缩短启动集群的时间,还能够减少集群需要消耗的资源。与此同时,Rancher 中国团队推出了一款针对 K3s 的效率提升工具:AutoK3s。只需要输入一行命令,即可快速创建 K3s 集群并添加指定数量的 master 节点和 worker 节点。如需详细了解 AutoK3s,请参考AutoK3s 功能介绍

安装Docker

使用 docker 官方安装脚本:

$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

$ usermod -aG docker `whoami`

另一种方式是使用 Rancher 的 Docker 安装脚本,该脚本可用于较新的 Docker 版本。

curl https://releases.rancher.com/install-docker/<version-number>.sh | sh

version-number 可以在查看:https://github.com/rancher/install-docker/blob/master/dist/ ,比如:

curl https://releases.rancher.com/install-docker/25.0.sh | sh

请注意,必须应用以下 /etc/sysctl.conf 设置:

net.bridge.bridge-nf-call-iptables=1

启动 docker

$ systemctl enable docker && systemctl start docker

在线安装

K3s 提供了一个安装脚本,可以方便地将其作为服务安装在基于 systemd 或 openrc 的系统上。该脚本可在 https://get.k3s.io 获得。要使用这种方法安装 K3s,只需运行:

$ curl -sfL https://get.k3s.io | sh - --docker

备注:

中国用户,可以使用以下方法加速安装:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

运行此安装后:

  • K3s 服务将被配置为在节点重启后或进程崩溃或被杀死时自动重启。
  • 将安装其他实用程序,包括 kubectlcrictlctrk3s-killall.shk3s-uninstall.sh
  • kubeconfig 文件将写入到 /etc/rancher/k3s/k3s.yaml,由 K3s 安装的 kubectl 将自动使用该文件。
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.28.7+k3s1 sh -s - --docker
  • --docker:K3s 包含并默认为 containerd ,使用 docker 代替 containerd
  • INSTALL_K3S_VERSION=v1.28.7+k3s1:指定版本,rancher 需要 k3s 版本小于 1.29.0。

稍等片刻,查看 docker 容器:

$ sudo docker ps

查看安装k3s可以配置的参数:

$ k3s server -h

当k3s安装成功之后,我们也可以修改 /etc/systemd/system/k3s.service 中的启动参数

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s \
    server \
	'--docker' \

根据需要,可以调整下 K3s 的服务配置文件,以将 K3s 的默认容器引擎从 Containerd 切换到 Docker,或者不部署 traefik

ExecStart=/usr/local/bin/k3s server --docker --no-deploy traefik

之后保存退出,执行命令重新加载新的服务配置文件:

systemctl daemon-reload
systemctl restart k3s 

集群访问

/etc/rancher/k3s/k3s.yaml 中存储的 kubeconfig 文件用于配置对 Kubernetes 集群的访问。如果你已经安装了上游的 Kubernetes 命令行工具(如 kubectl 或 helm),你需要用正确的 kubeconfig 路径配置它们。这可以通过导出 KUBECONFIG 环境变量或调用 --kubeconfig 命令行标志来完成。有关详细信息,请参阅以下示例。

使用 KUBECONFIG 环境变量:

export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get pods --all-namespaces
helm ls --all-namespaces

或者在命令中指定 kubeconfig 文件的位置:

kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get pods --all-namespaces
helm --kubeconfig /etc/rancher/k3s/k3s.yaml ls --all-namespaces

使用 kubectl 从外部访问集群

/etc/rancher/k3s/k3s.yaml 复制到位于集群外部的主机上的 ~/.kube/config。然后,将 server 字段的值替换为你 K3s Server 的 IP 或名称。现在,你可以使用 kubectl 来管理 K3s 集群。

cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config

检查状态

查看kubectl是否安装:

$ which kubectl

$ kubectl version
Client Version: v1.29.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.29.4+k3s1

查看k3s版本和服务运行状态:

$ k3s --version
k3s version v1.29.4+k3s1 (94e29e2e)
go version go1.21.9

$ systemctl status k3s

查看节点状态:

$ kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
doris-01   Ready    control-plane,master   91m   v1.29.4+k3s1

$ kubectl get node -o wide
NAME       STATUS   ROLES                  AGE   VERSION        INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
doris-01   Ready    control-plane,master   92m   v1.29.4+k3s1   192.168.1.107   <none>        CentOS Linux 7 (Core)   3.10.0-1160.71.1.el7.x86_64   containerd://1.7.15-k3s1

查看命名空间:

$ kubectl get ns
NAME              STATUS   AGE
kube-system       Active   92m
kube-public       Active   92m
kube-node-lease   Active   92m
default           Active   92m

查看运行状态:

$ kubectl get all -n kube-system
NAME                                          READY   STATUS      RESTARTS   AGE
pod/coredns-6799fbcd5-gjl6m                   1/1     Running     0          92m
pod/local-path-provisioner-6c86858495-l29k2   1/1     Running     0          92m
pod/helm-install-traefik-crd-4gsfn            0/1     Completed   0          92m
pod/helm-install-traefik-6j2ch                0/1     Completed   1          92m
pod/metrics-server-54fd9b65b-98rld            1/1     Running     0          92m
pod/svclb-traefik-231ab742-j2qfs              2/2     Running     0          91m
pod/traefik-7d5f6474df-s6srn                  1/1     Running     0          91m

NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
service/kube-dns         ClusterIP      10.43.0.10     <none>          53/UDP,53/TCP,9153/TCP       92m
service/metrics-server   ClusterIP      10.43.120.4    <none>          443/TCP                      92m
service/traefik          LoadBalancer   10.43.104.97   192.168.1.107   80:30484/TCP,443:32566/TCP   91m

NAME                                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/svclb-traefik-231ab742   1         1         1       1            1           <none>          91m

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns                  1/1     1            1           92m
deployment.apps/local-path-provisioner   1/1     1            1           92m
deployment.apps/metrics-server           1/1     1            1           92m
deployment.apps/traefik                  1/1     1            1           91m

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-6799fbcd5                   1         1         1       92m
replicaset.apps/local-path-provisioner-6c86858495   1         1         1       92m
replicaset.apps/metrics-server-54fd9b65b            1         1         1       92m
replicaset.apps/traefik-7d5f6474df                  1         1         1       91m

NAME                                 COMPLETIONS   DURATION   AGE
job.batch/helm-install-traefik-crd   1/1           32s        92m
job.batch/helm-install-traefik       1/1           34s        92m
  • 可以看到 service/traefik 类型为 LoadBalancer,EXTERNAL-IP 为 192.168.1.107 。

配置集群

添加 worker 节点

在master节点查看_K3S_TOKEN_:

$ cat /var/lib/rancher/k3s/server/node-token
K1069e97c40ac7433f5e4ca318e3945d2684fcc58813588305743a9bc17582f160e::server:ca28a1e542ce5030bcf6031d0c4c8ef4

在worker节点安装,这里使用 192.168.1.109 节点安装:

注意:192.168.1.109 节点 需要先安装好 docker。

k3s_url="https://192.168.1.107:6443"
k3s_token="K1069e97c40ac7433f5e4ca318e3945d2684fcc58813588305743a9bc17582f160e::server:ca28a1e542ce5030bcf6031d0c4c8ef4"

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=${k3s_url} K3S_TOKEN=${k3s_token} sh -s - --docker 

在 master 节点(192.168.1.107)查看节点:

$ kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
doris-01   Ready    control-plane,master   50m   v1.29.4+k3s1
doris-03   Ready    <none>                 67s   v1.29.4+k3s1

卸载

卸载 k3s:

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

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

清理 docker 容器:

docker rm -f $(docker ps -aq)
Share this post:

Related content