K3s 的安装

警告
本文最后更新于 2023-03-07,文中内容可能已过时。

K3s 通过 环境变量选项 来定制安装。当然也支持配置文件方式

对于 /var/lib/rancher/k3s/server/manifests 下的任何 yaml 文件(coredns、traefik、local-storeage 等),您可以添加一个 .skip 文件,这将导致 K3s 不应用关联的 yaml 文件。例如,在 manifests 目录中添加 traefik.yaml.skip 会导致 K3s 跳过 traefik.yaml 。

如果网络有问题需要配置 http_proxy,如果使用 docker 运行时需要通过 docker 设置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 由于直接下载镜像很慢,通过代理下载
export HTTP_PROXY=http://10.0.0.8:10809
export HTTPS_PROXY=http://10.0.0.8:10809
export NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
export CONTAINERD_HTTP_PROXY=http://10.0.0.8:10809
export CONTAINERD_HTTPS_PROXY=http://10.0.0.8:10809
export CONTAINERD_NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

# 安装主节点的 K3s
export INSTALL_K3S_VERSION="v1.27.4+k3s1"
export INSTALL_K3S_EXEC="server \
--write-kubeconfig ~/.kube/config \
--node-ip <内网IP地址> \
--node-external-ip <外网IP地址> \
--advertise-address <内网IP> \
--data-dir /data/k3s \
--default-local-storage-path /data/local-storage \
--tls-san <外网IP地址或者DNS名> \
--protect-kernel-defaults \
--secrets-encryption \
--disable servicelb,traefik \
--kubelet-arg='eviction-hard=imagefs.available<5%,nodefs.available<5%' \
--kubelet-arg='eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10%' \
--kubelet-arg='image-gc-high-threshold=85' \
--kubelet-arg='image-gc-low-threshold=80' \
--kubelet-arg='eviction-hard=imagefs.available<15%' \
--kubelet-arg='eviction-soft=imagefs.available<20%' \
--kubelet-arg='eviction-soft-grace-period=imagefs.available=1m'"

# 安装
curl -sfL https://get.k3s.io | sh -

# 确认版本 和 节点
kubectl version --short
kubectl get nodes

# Kubernetes 集群中所有命名空间(namespaces)的所有资源(resources),列出当前集群中各个命名空间的 Pod、Service、Deployment、ReplicaSet 等元素的详细信息
kubectl get all -A
  • --write-kubeconfig value, -o value:(client)将管理员客户端的 kubeconfig 写入到此文件。这是一个重要的选项,它控制 K3s 如何生成 kubeconfig 文件,该文件用于 kubectl 和其他 Kubernetes 客户端与集群通信。如果你没有提供这个选项,K3s 将在默认位置(/etc/rancher/k3s/k3s.yaml)生成 kubeconfig 文件。

  • --node-ip value, -i value:(agent/networking)为节点通告的 IPv4/IPv6 地址。这个参数定义了节点在集群内部的 IP 地址。这个地址用于集群内部的通信,比如 Pod 之间的网络流量。如果你的节点有多个网络接口,或者有多个 IP 地址,那么可以使用这个参数来指定 Kubernetes 应该使用哪个地址。如果你没有提供这个参数,Kubernetes 将自动选择一个地址。 ==如果您的节点都在同一个内网环境中,并且可以通过内网 IP 地址进行通信,那么我建议您只设置 --node-ip,而不设置 --node-external-ip。==

  • --node-external-ip value:(agent/networking)用于通告节点的 IPv4/IPv6 外部 IP 地址。这个参数定义了节点的外部 IP 地址,即在集群之外可以用来访问该节点的地址。这个地址主要用于从集群外部访问集群中的服务。例如,如果你配置了一个 NodePort 服务,那么可以通过节点的外部 IP 地址和服务的 NodePort 来访问该服务。这个参数通常在节点部署在公共云或者其他可以提供外部 IP 地址的环境中使用。如果你没有提供这个参数,外部 IP 地址通常会默认为节点的主 IP 地址。

  • --advertise-address value:(listener) 对于云环境中的节点,通常来说,节点的内网 IP 地址将被用作宣告地址。这是因为集群内部的通信通常都是在云提供商的内网环境中进行的,使用内网 IP 地址可以提供更好的性能和安全性。当节点分布在不同的网络环境中并且无法通过内网 IP 地址进行通信时,我们可能需要使用外网 IP 地址。在这种情况下,我们可以通过设置 --node-external-ip 参数来提供一个可以从集群外部访问的 IP 地址。

  • --data-dir value, -d value:(data)用于存放状态的文件夹(默认:/var/lib/rancher/k3s 或者如果不是 root 用户,则是 ${HOME}/.rancher/k3s)。这个选项定义了 K3s 存储其内部数据的位置,包括用于运行集群所需的各种状态信息,如 etcd 数据库(如果使用内置的 etcd)、Kubernetes 资源对象、服务帐户密钥等。如果你希望将 K3s 的数据存储在不同的位置,你可以使用这个选项来改变默认的数据目录。

  • --default-local-storage-path value:(storage)本地存储提供者存储类的默认本地存储路径。这个选项定义了 K3s 为 PersistentVolumes 创建的本地存储的默认路径。当你创建一个使用 local-storage 存储类的 PersistentVolumeClaim 时,对应的 PersistentVolume 将在这个路径下创建。如果你希望改变默认的存储路径,你可以使用这个选项来设置一个新的路径。

  • --tls-san:(listener)是一个 K3s 启动参数,用于添加额外的主机名或 IP 地址作为服务器 TLS 证书的 Subject Alternative Names (SANs)。Subject Alternative Names 是一个 X.509 v3 (TLS/SSL 证书的版本) 的扩展属性,允许您指定额外的验证主机名或 IP 地址。在 TLS/SSL 握手过程中,客户端会检查服务器的证书是否包含请求的主机名。如果请求的主机名既不是证书的主题名称 (CN),也不在 SANs 列表中,客户端将无法验证服务器的身份,从而导致 TLS/SSL 握手失败。 例如:--tls-san my-k3s-server1.example.com --tls-san my-k3s-server2.example.com --tls-san 192.0.2.1my-k3s-server1.example.commy-k3s-server2.example.com192.0.2.1 都将被添加到 K3s 服务器的 TLS 证书的 SANs 中。

  • --protect-kernel-defaults:(agent/node) 该参数告诉 K3s 是否应该在启动时检查和保护内核默认值。这有助于确保 Kubernetes 在运行期间不会对主机系统做出可能不安全的更改。如果您的环境需要严格的安全性,或者您不希望 Kubernetes 更改主机系统的任何设置,那么应该使用此参数。

  • --secrets-encryption:该参数告诉 K3s 是否应该在存储时加密 Kubernetes Secrets。如果启用,K3s 将使用内置的加密提供程序自动加密所有的 Kubernetes Secret,这将增强存储时的安全性。这是一个非常有用的功能,尤其是在需要严格遵守数据保护和隐私法规的环境中。

  • --disable servicelb,traefik:(components) 不要部署打包的组件,并删除任何已部署的组件(有效项:coredns、servicelb、traefik、local-storage、metrics-server)

    • Servicelb 是一个简单的负载均衡器,它为 K3s 提供了 Service of type LoadBalancer 的支持。在某些环境中,您可能希望使用不同的负载均衡解决方案,比如云提供商的负载均衡器或者像 MetalLB 这样的项目。在这种情况下,您可以禁用 servicelb。
    • Traefik 是一个反向代理和负载均衡器,K3s 使用它为 Ingress 提供支持。同样,如果您想使用不同的 Ingress 控制器(例如 Nginx Ingress 或 Contour),您可以禁用 Traefik。
    • 这样做的主要原因是灵活性和控制性。在生产环境中,您可能已经有了自己选择的、经过严格测试和调优的负载均衡和 Ingress 解决方案,而不希望使用 K3s 默认的选项。此时,可以通过禁用这些组件来自定义您的 K3s 安装。
  • --kubelet-arg value:(agent/flags) kubelet 进程的定制标志,在启动 K3s 时使用 --kubelet-arg 参数来直接设置 Kubelet 参数,就像你之前做的那样。尽管 Kubernetes 官方文档中标记了这些参数为 “DEPRECATED”,但在 K3s 中,你仍然可以通过这种方式来设置它们。 如果你想要遵循 Kubernetes 的最新推荐,使用 Kubelet 配置文件来设置这些参数,那么你可能需要对 K3s 进行一些特殊配置。对于 K3s,你可以创建一个名为 kubelet-config.yaml 的文件(或者任何你喜欢的名字),其中包含 Kubelet 配置。然后,你可以将这个文件放置在 /var/lib/rancher/k3s/agent/etc 目录下。在启动 K3s 时,K3s 将会自动读取这个目录下的配置文件。

    以下是一个 kubelet-config.yaml 文件的示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    evictionHard:
      imagefs.available: "5%"
      nodefs.available: "5%"
    evictionMinimumReclaim:
      imagefs.available: "10%"
      nodefs.available: "10%"
    imageGCHighThresholdPercent: 85
    imageGCLowThresholdPercent: 80
    

    然后,你可以使用以下命令将这个文件放置到适当的位置:cp kubelet-config.yaml /var/lib/rancher/k3s/agent/etc/之后,每次启动 K3s 时,K3s 将会自动读取这个配置文件,并应用到 Kubelet。

  • --flannel-backend value:(networking)用于 flannel 的后端。此选项允许你选择 K3s 使用的网络插件。默认情况下,K3s 使用 flannel。但是,你可以使用这个选项来改变这个设置。例如,如果你想使用 Calico,你可以设置 --flannel-backend=none 并手动部署 Calico。

<node-token> 在服务节点的 /var/lib/rancher/k3s/server/node-token 文件中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 由于直接下载镜像很慢,通过代理下载
export HTTP_PROXY=http://10.0.0.8:10809
export HTTPS_PROXY=http://10.0.0.8:10809
export NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
export CONTAINERD_HTTP_PROXY=http://10.0.0.8:10809
export CONTAINERD_HTTPS_PROXY=http://10.0.0.8:10809
export CONTAINERD_NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

# 配置参数
export INSTALL_K3S_EXEC="agent \
--token <node-token> \
--server https://<server端advertise-address的地址>:6443 \
--data-dir /data/k3s \
--node-ip <内网IP地址> \
--node-external-ip <内网IP> \
--kubelet-arg='eviction-hard=imagefs.available<5%,nodefs.available<5%' \
--kubelet-arg='eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10%' \
--kubelet-arg='image-gc-high-threshold=85' \
--kubelet-arg='image-gc-low-threshold=80' \
--kubelet-arg='eviction-hard=imagefs.available<15%' \
--kubelet-arg='eviction-soft=imagefs.available<20%' \
--kubelet-arg='eviction-soft-grace-period=imagefs.available=1m' \
--protect-kernel-defaults \
--flannel-iface <Pod间的网络通信的接口> \
--node-label k3s.io/hostname=$(hostname)"

# 安装
curl -sfL https://get.k3s.io | sh -

以下是 K3s 离线安装的步骤:

  1. 镜像准备:在安装 K3s 之前,你需要预先准备好 K3s 所需的所有镜像。这可以通过两种方法来完成:

    • 私有镜像仓库方法:将 K3s 所需的镜像上传到私有镜像仓库,在安装时配置 K3s 使用这个私有镜像仓库来拉取镜像。
    • 手动部署镜像方法:直接下载 K3s 所需的镜像的 tar 文件,然后在每个需要安装 K3s 的节点上手动加载这些镜像。
  2. 下载 K3s 二进制文件:从 K3s 的 GitHub 发布页面下载与你获取 airgap 镜像相同版本的 K3s 二进制文件。然后将这个二进制文件放到每个 air-gapped 节点的 /usr/local/bin 目录下,并确保它是可执行的。

  3. 下载 K3s 安装脚本:从 get.k3s.io 下载 K3s 的安装脚本。然后将这个安装脚本放到每个 air-gapped 节点的任意位置,并命名为 install.sh

  4. 配置默认路由:如果你的节点没有具有默认路由的接口,那么必须配置一个默认路由;即使是通过虚拟接口的黑洞路由也可以。要添加一个虚拟路由,可以执行以下命令:

    1
    2
    3
    4
    
    ip link add dummy0 type dummy
    ip link set dummy0 up
    ip addr add 169.254.255.254/31 dev dummy0
    ip route add default via 169.254.255.255 dev dummy0 metric 1000
    
  5. 运行 K3s 安装脚本:使用 INSTALL_K3S_SKIP_DOWNLOAD 环境变量运行 K3s 安装脚本。在这种情况下,K3s 将使用本地版本的脚本和二进制文件进行安装。

创建一个 k3s 的文件夹,将 K3s 二进制文件K3s 安装脚本K3s 的镜像的 tar 文件 放在目录中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ tree
.
├── install.sh
├── k3s
├── k3s-airgap-images-amd64.tar.gz
└── run.sh

$ cat run.sh
#!/bin/bash
set -e

# Check if the script is run as a root user, if not prepend every command with sudo
if [ "$EUID" -ne 0 ]; then
    SUDO='sudo'
else
    SUDO=''
fi

# Move the airgap images to the appropriate directory
${SUDO} mkdir -p /var/lib/rancher/k3s/agent/images/
${SUDO} \cp k3s-airgap-images-amd64.tar.gz /var/lib/rancher/k3s/agent/images/

# Move the k3s binary to the appropriate directory
${SUDO} \cp k3s /usr/local/bin/
${SUDO} chmod +x /usr/local/bin/k3s

# Execute the install script
export INSTALL_K3S_SKIP_DOWNLOAD=true
1
2
3
4
5
6
7
8
9
# 设置参数
export INSTALL_K3S_EXEC="server \
--write-kubeconfig ~/.kube/config \
--node-ip 10.0.0.132 \
--advertise-address 10.0.0.132 \
--default-local-storage-path /data/local-storage"

# 安装
bash run.sh
1
2
3
4
5
6
7
8
# 设置参数
export INSTALL_K3S_EXEC="agent \
--token <token> \
--server https://<主节点IP>:6443 \
--node-label k3s.io/hostname=$(hostname)"

# 安装
bash run.sh
1
2
3
4
5
# 主节点删除方式
/usr/local/bin/k3s-uninstall.sh

# 工作节点删除方式
/usr/local/bin/k3s-agent-uninstall.sh