K3S v1.17.6集群安装文档
1. 简介
官网:
K3s | 轻量级 Kubernetes | 物联网及边缘计算 K8S 解决方案 | Rancher
AutoK3s:快速创建 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)
2. 集群环境
节点 | 角色 | IP |
---|---|---|
master | master | 192.168.10.20 |
node01 | node01 | 192.168.10.30 |
node02 | node02 | 192.168.10.40 |
K3S 安装初始化操作和 K8S 一样: |
关闭 fw,se
关闭 NetworkManager
关闭 Swap
yum -y install ntpdate && ntpdate time.windows.com
修改主机名
添加 hosts
3. K3S 部署
3.1 升级内核(所有节点)
- k3s 的默认网络插件是
flannel
,默认模式是vxlan
模式,建议使用wireguard
模式。- wireguard 对内核的要求比较高,而
CentOS 7.x
的默认内核是不满足要求的,需要升级内核(如果你的操作系统是 CentOS 7.x 的话)。- CentOS7 升级内核
3.2 所有节点下载 k3s 文件
# 需要在所有节点中下载该二进制文件
wget http://49.232.8.65/k3s/k3s -O /usr/local/bin/k3s
chmod +x /usr/local/bin/k3s
3.3 所有节点安装 wireguard
yum -y install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum -y install yum-plugin-elrepo
yum -y install kmod-wireguard wireguard-tools
3.4 master 部署控制平面
创建一个 Service Unit 文件
- 将
<public_ip>
替换成控制节点的公网 IP。- flannel 使用
wireguard
协议来跨主机通信。- kube-proxy 使用
ipvs
模式。
touch /etc/systemd/system/k3s.service.env
cat > /etc/systemd/system/k3s.service <<EOF
[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
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
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 \
--tls-san <public_ip> \
--node-ip <public_ip> \
--node-external-ip <public_ip> \
--no-deploy servicelb \
--flannel-backend wireguard \
--kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" \
--kube-proxy-arg "metrics-bind-address=0.0.0.0"
EOF
启动 k3s 控制平面并设置开机自启
systemctl enable k3s --now
使用 kubectl
[root@c7-1 /usr/local/bin]#find / -name containerd
/run/containerd
/run/k3s/containerd
/var/lib/rancher/k3s/data/744a8a403c240a6fbd91df8ded5090391c52d7c7d12bcb1437b0a67b281d58ae/bin/containerd
/var/lib/rancher/k3s/agent/etc/containerd
/var/lib/rancher/k3s/agent/containerd
/usr/local/bin/containerd
[root@c7-1 /usr/local/bin]#ln -s ./containerd ./kubectl
查看集群组件健康状况
[root@c7-1 ~]#kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
这里的输出没有
etcd
,因为 k3s 的默认数据存储是Sqlite
,对于小型数据库十分友好。Kubernetes 控制平面中发生的更改更多是与频繁更新部署、调度 Pod 等有关,因此对于几个节点的小型集群而言,数据库不会造成太大负载,能省下不少资源。
3.5 加入计算节点
创建环境变量文件
$ touch /etc/systemd/system/k3s-agent.service.env
# 加入两个环境变量
K3S_URL=https://192.168.10.20:6443
K3S_TOKEN=K10f74cfb2bc766f3674659630fc3c01482db5fd1e06b9e38a117038de4f0660aac::server:9a67adc15a897502e22f7a11c446f460
# ----------------------- #
K3S_URL : API Server 的 URL,一般格式为:https://<master_ip>:6443。其中 <master_ip> 是控制节点的公网 IP。
K3S_TOKEN : 加入集群所需的 token,可以在控制节点上查看 /var/lib/rancher/k3s/server/node-token 文件。
在计算节点上创建 Service Unit 文件
# <public_ip> 替换成 master IP
$ cat > /etc/systemd/system/k3s-agent.service <<EOF
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
Type=exec
EnvironmentFile=/etc/systemd/system/k3s-agent.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 agent \
--node-external-ip <public_ip> \
--node-ip <public_ip> \
--kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" \
--kube-proxy-arg "metrics-bind-address=0.0.0.0"
EOF
启动 k3s-agent 并设置开启自启
systemctl enable k3s-agent --now
systemctl status k3s-agent
# 失败了 systemctl restart k3s-agent,等待一会再看
master 查看集群
[root@c7-1 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
c7-3 Ready <none> 3m50s v1.17.6+k3s1
c7-1 Ready master 29m v1.17.6+k3s1
c7-2 Ready <none> 3m53s v1.17.6+k3s1
3.6 使用 containerd
[root@c7-1 ~]#cd /usr/local/bin/
[root@c7-1 /usr/local/bin]#ls
containerd k3s kubectl
[root@c7-1 /usr/local/bin]#ll -h
总用量 157M
-rwxr-xr-x 1 root root 106M 6月 21 18:27 containerd
-rwxr-xr-x 1 root root 51M 6月 21 17:31 k3s
lrwxrwxrwx 1 root root 12 6月 21 18:27 kubectl -> ./containerd
[root@c7-1 /usr/local/bin]#find / -name ctr
/var/lib/rancher/k3s/data/744a8a403c240a6fbd91df8ded5090391c52d7c7d12bcb1437b0a67b281d58ae/bin/ctr
[root@c7-1 /usr/local/bin]#ln -s containerd ctr
[root@c7-1 /usr/local/bin]#ls
containerd ctr k3s kubectl
[root@c7-1 /usr/local/bin]#ctr
......
[root@c7-1 /usr/local/bin]#ctr image ls
......
[root@c7-1 /usr/local/bin]#ctr container ls
......
containerd使用 - 码农教程 (manongjc.com)
4. 配置集群访问
存储在 /etc/rancher/k3s/k3s.yaml
的 kubeconfig 文件用于对 K8S/K3S 集群的访问。如果你已经安装了上游的 Kubernetes 命令行工具,如 kubectl 或 helm,你需要用正确的 kubeconfig 路径配置它们。这可以通过导出 KUBECONFIG 环境变量或调用 --kubeconfig
命令行标志来完成。详情请参考下面的例子。
利用 KUBECONFIG 环境变量:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config # k8s 集群文件叫 admin.conf
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml # 写进 /etc/profile 文件,source 一下,生产环境要退出重进
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
。然后用你的 K3s 服务器的 IP 或名称替换 "localhost"。kubectl 现在可以管理你的 K3s 集群了。
[root@master ~]#chmod g-rw ~/.kube/config
[root@master ~]#chmod o-r ~/.kube/config