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 部署

跨云厂商部署 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

集群访问


posted @ 2022-06-21 19:39  公博义  阅读(531)  评论(0编辑  收藏  举报