安装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 服务将被配置为在节点重启后或进程崩溃或被杀死时自动重启。
- 将安装其他实用程序,包括
kubectl
、crictl
、ctr
、k3s-killall.sh
和k3s-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 代替 containerdINSTALL_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)