一、安装准备

在开始安装K3之前,请确保满足节点要求

1、节点要求

K3s非常轻巧,但具有一些最低要求,如下所述。

无论是将K3s集群配置为在单节点安装还是在高可用性(HA)设置中运行,每个运行K3s的节点都应满足以下最低要求。您可能需要更多资源以满足您的需求。

  • 先决条件

两个节点不能具有相同的主机名。如果所有节点都具有相同的主机名,请为添加到集群的每个节点传递--node-name或设置$K3S_NODE_NAME一个唯一的名称。

  • 操作系统

K3几乎可以在任何Linux上运行。但是,K3s已在以下操作系统及其后续非主要版本中进行了测试。

  • Ubuntu 16.04(amd64)

  • Ubuntu 18.04(amd64)

  • Raspbian Buster(armhf)

  • 硬件

硬件需求根据部署的大小进行扩展。这里概述了最低限度的建议。

硬件 最低要求
内存 最小512MB
CPU 最低1
  • 存储

K3的性能取决于数据库的性能。为了确保最佳速度,我们建议尽可能使用SSD。在使用SD卡或eMMC的ARM设备上,磁盘性能会有所不同。

  • 网络

K3s服务器需要端口6443可供节点访问。这些节点需要能够通过UDP端口8472(Flannel VXLAN)到达其他节点。如果您不使用法兰绒并提供自己的自定义CNI,则K3不需要端口8472。该节点不应在任何其他端口上侦听。K3使用反向隧道,以便节点建立与服务器的出站连接,所有kubelet通信都通过该隧道运行。

重要信息:节点上的VXLAN端口不应暴露给世界,因为它打开了群集网络,任何人都可以访问它。在禁止访问端口8472的防火墙/安全组后面运行节点。

如果希望使用指标服务器,则需要在每个节点上打开端口10250。

2、最低配置要求:

Linux 3.10+
每台服务器512MBRAM
每个节点75MBRAM
200MB的磁盘空间
x86_64, ARMv7, ARM64

二、服务安装

1、通过脚本安装K3s(如果使用此方式安装,请忽略后面的二进制文件安装方式)

《快速入门指南》中所述,你可以使用https://get.k3s.io 上提供的安装脚本将K3s作为服务安装在systemd和基于openrc的系统上。

1.1、安装命令

此命令的最简单形式如下:

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

运行此安装后:

  • K3s服务将配置为在节点重新启动后或进程崩溃或终止时自动重新启动
  • 附加的实用将被安装,其中包括 kubectlcrictlctrk3s-killall.sh,和 k3s-uninstall.sh
  • 一个kubeconfig文件将被写入/etc/rancher/k3s/k3s.yaml,在K3s自动安装完成kubectl后,使用这个配置文件

如果期望要在工作节点上安装K3s并将它们添加到集群中,请使用K3S_URL和K3S_TOKEN环境变量运行安装脚本。

下面给出如何加入工作节点的示例:

curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
  • 设置K3S_URL参数会导致K3在工作模式下运行。K3s代理会自动注册K3s服务到提供的URL。
  • 要使用的值K3S_TOKEN存储在/var/lib/rancher/k3s/server/node–token服务器节点上。

注意:每台计算机必须具有唯一的主机名。如果您的计算机没有唯一的主机名,请传递K3S_NODE_NAME环境变量,并为每个节点提供一个带有有效且唯一的主机名的值。

使用此方法安装K3时,还可以使用以下环境变量来配置安装:

  • INSTALL_K3S_SKIP_DOWNLOAD

    如果设置为true,则不会下载K3s哈希或二进制文件。
  • INSTALL_K3S_SYMLINK

    是否创建K3s服务软连接,如果设置为“skip”将不会创建软连接,“force” 将被覆盖,如果未指定,则默认创建K3s服务软连接。
  • INSTALL_K3S_SKIP_START

    指定是否安装完成后启动K3s服务,如果设置为true,将不会启动K3s服务。
  • INSTALL_K3S_VERSION

    将要从github下载的K3s版本。如果未指定,将尝试下载最新版本。
  • INSTALL_K3S_BIN_DIR

    K3s的二进制文件,链接和卸载脚本的安装目录,如果未指定,将使用`"/usr/local/bin"` 用作默认目录。
  • INSTALL_K3S_BIN_DIR_READ_ONLY

    如果设置为true,则不会写入文件 `"INSTALL_K3S_BIN_DIR"`变量指定的目录,强制设置 INSTALL_K3S_SKIP_DOWNLOAD=true
  • INSTALL_K3S_SYSTEMD_DIR

将systemd服务和环境文件安装到的目录,如果未指定,将使用 `"/etc/systemd/system"` 用作默认目录。
  • INSTALL_K3S_EXEC

    带有标志的命令,用于在服务中启动K3s。如果未指定命令,则默认为 “agent” (如果K3S_URL已设置)或“server”(未设置)。

    最后的systemd命令解析为该环境变量和脚本args的组合。
    为了说明这一点,以下命令导致注册没有flannel的服务器的行为相同:

 curl ... | INSTALL_K3S_EXEC="--no-flannel" sh -s -
 curl ... | INSTALL_K3S_EXEC="server --no-flannel" sh -s -
 curl ... | INSTALL_K3S_EXEC="server" sh -s - --no-flannel
 curl ... | sh -s - server --no-flannel
 curl ... | sh -s - --no-flannel
  • INSTALL_K3S_NAME

    要创建的systemd服务的名称,如果未指定,将使用 K3s exec 命令获取默认值。如果指定,名称应该以`k3s-`为前缀。
  • INSTALL_K3S_TYPE

    要创建的systemd服务类型,如果未指定,将默认使用K3s exec 命令获取默认值。

注意:
1、以“K3S_”开头的环境变量将保留给systemdopenrc服务使用。
2、在不显式设置exec命令的情况下设置K3S_URL将默认命令为“agent”
3、运行代理程序时,还必须设置 K3S_TOKEN 参数。

1.2、版本更新

要从旧版本升级K3s,可以使用相同的标志重新运行安装脚本,例如:

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

如果要升级到特定版本,可以运行以下命令:

curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -

2、从二进制文件安装K3s

2.1、二进制文件安装

如果你选择使用从二进制文件安装K3s,则只需从Rancher官方的发行页面下载二进制文件,将其放在路径中并执行它即可运行K3s。

K3s二进制文件支持以下命令:

命令 描述
k3s server 运行K3s管理服务器,该服务器还将启动Kubernetes控制平面组件,例如API服务器,控制器管理器和调度程序。
k3s agent 运行K3s节点代理。这将导致K3作为工作节点运行,启动Kubernetes节点服务kubeletkube-proxy
k3s kubectl 运行嵌入式kubectl CLI。如果KUBECONFIG未设置环境变量,它将自动尝试使用/etc/rancher/k3s/k3s.yaml启动K3s服务器节点时创建的配置文件。
k3s crictl 运行嵌入式crictl。这是一个用于与Kubernetes的容器运行时接口(CRI)进行交互的CLI。对于调试很有用。
k3s ctr 运行嵌入式ctr。这是用于容器化的CLI,是K3s使用的容器守护程序。对于调试很有用。
k3s help 显示命令列表或一个命令的帮助

k3s server 和 k3s agent 命令 可通过 k3s server –help 或 k3s agent –help 进行查看。为方便起见,该帮助文本在此处显示:

  • K3s服务器的注册选项
NAME:
   k3s server - Run management server

USAGE:
   k3s server [OPTIONS]

OPTIONS:
   -v value                                   (logging) Number for the log level verbosity (default: 0)
   --vmodule value                            (logging) Comma-separated list of pattern=N settings for file-filtered logging
   --log value, -l value                      (logging) Log to file
   --alsologtostderr                          (logging) Log to standard error as well as file (if set)
   --bind-address value                       (listener) k3s bind address (default: 0.0.0.0)
   --https-listen-port value                  (listener) HTTPS listen port (default: 6443)
   --advertise-address value                  (listener) IP address that apiserver uses to advertise to members of the cluster (default: node-external-ip/node-ip)
   --advertise-port value                     (listener) Port that apiserver uses to advertise to members of the cluster (default: listen-port) (default: 0)
   --tls-san value                            (listener) Add additional hostname or IP as a Subject Alternative Name in the TLS cert
   --data-dir value, -d value                 (data) Folder to hold state default /var/lib/rancher/k3s or ${HOME}/.rancher/k3s if not root
   --cluster-cidr value                       (networking) Network CIDR to use for pod IPs (default: "10.42.0.0/16")
   --service-cidr value                       (networking) Network CIDR to use for services IPs (default: "10.43.0.0/16")
   --cluster-dns value                        (networking) Cluster IP for coredns service. Should be in your service-cidr range (default: 10.43.0.10)
   --cluster-domain value                     (networking) Cluster Domain (default: "cluster.local")
   --flannel-backend value                    (networking) One of 'none', 'vxlan', 'ipsec', or 'flannel' (default: "vxlan")
   --token value, -t value                    (cluster) Shared secret used to join a server or agent to a cluster [$K3S_TOKEN]
   --token-file value                         (cluster) File containing the cluster-secret/token [$K3S_TOKEN_FILE]
   --write-kubeconfig value, -o value         (client) Write kubeconfig for admin client to this file [$K3S_KUBECONFIG_OUTPUT]
   --write-kubeconfig-mode value              (client) Write kubeconfig with this mode [$K3S_KUBECONFIG_MODE]
   --kube-apiserver-arg value                 (flags) Customized flag for kube-apiserver process
   --kube-scheduler-arg value                 (flags) Customized flag for kube-scheduler process
   --kube-controller-manager-arg value        (flags) Customized flag for kube-controller-manager process
   --kube-cloud-controller-manager-arg value  (flags) Customized flag for kube-cloud-controller-manager process
   --datastore-endpoint value                 (db) Specify etcd, Mysql, Postgres, or Sqlite (default) data source name [$K3S_DATASTORE_ENDPOINT]
   --datastore-cafile value                   (db) TLS Certificate Authority file used to secure datastore backend communication [$K3S_DATASTORE_CAFILE]
   --datastore-certfile value                 (db) TLS certification file used to secure datastore backend communication [$K3S_DATASTORE_CERTFILE]
   --datastore-keyfile value                  (db) TLS key file used to secure datastore backend communication [$K3S_DATASTORE_KEYFILE]
   --default-local-storage-path value         (storage) Default local storage path for local provisioner storage class
   --no-deploy value                          (components) Do not deploy packaged components (valid items: coredns, servicelb, traefik, local-storage, metrics-server)
   --disable-scheduler                        (components) Disable Kubernetes default scheduler
   --disable-cloud-controller                 (components) Disable k3s default cloud controller manager
   --disable-network-policy                   (components) Disable k3s default network policy controller
   --node-name value                          (agent/node) Node name [$K3S_NODE_NAME]
   --with-node-id                             (agent/node) Append id to node name
   --node-label value                         (agent/node) Registering kubelet with set of labels
   --node-taint value                         (agent/node) Registering kubelet with set of taints
   --docker                                   (agent/runtime) Use docker instead of containerd
   --container-runtime-endpoint value         (agent/runtime) Disable embedded containerd and use alternative CRI implementation
   --pause-image value                        (agent/runtime) Customized pause image for containerd sandbox
   --private-registry value                   (agent/runtime) Private registry configuration file (default: "/etc/rancher/k3s/registries.yaml")
   --node-ip value, -i value                  (agent/networking) IP address to advertise for node
   --node-external-ip value                   (agent/networking) External IP address to advertise for node
   --resolv-conf value                        (agent/networking) Kubelet resolv.conf file [$K3S_RESOLV_CONF]
   --flannel-iface value                      (agent/networking) Override default flannel interface
   --flannel-conf value                       (agent/networking) Override default flannel config file
   --kubelet-arg value                        (agent/flags) Customized flag for kubelet process
   --kube-proxy-arg value                     (agent/flags) Customized flag for kube-proxy process
   --rootless                                 (experimental) Run rootless
   --agent-token value                        (experimental/cluster) Shared secret used to join agents to the cluster, but not servers [$K3S_AGENT_TOKEN]
   --agent-token-file value                   (experimental/cluster) File containing the agent secret [$K3S_AGENT_TOKEN_FILE]
   --server value, -s value                   (experimental/cluster) Server to connect to, used to join a cluster [$K3S_URL]
   --cluster-init                             (experimental/cluster) Initialize new cluster master [$K3S_CLUSTER_INIT]
   --cluster-reset                            (experimental/cluster) Forget all peers and become a single cluster new cluster master [$K3S_CLUSTER_RESET]
   --no-flannel                               (deprecated) use --flannel-backend=none
   --cluster-secret value                     (deprecated) use --token [$K3S_CLUSTER_SECRET]
  • K3s代理的注册选项
NAME:
   k3s agent - Run node agent

USAGE:
   k3s agent [OPTIONS]

OPTIONS:
   -v value                            (logging) Number for the log level verbosity (default: 0)
   --vmodule value                     (logging) Comma-separated list of pattern=N settings for file-filtered logging
   --log value, -l value               (logging) Log to file
   --alsologtostderr                   (logging) Log to standard error as well as file (if set)
   --token value, -t value             (cluster) Token to use for authentication [$K3S_TOKEN]
   --token-file value                  (cluster) Token file to use for authentication [$K3S_TOKEN_FILE]
   --server value, -s value            (cluster) Server to connect to [$K3S_URL]
   --data-dir value, -d value          (agent/data) Folder to hold state (default: "/var/lib/rancher/k3s")
   --node-name value                   (agent/node) Node name [$K3S_NODE_NAME]
   --with-node-id                      (agent/node) Append id to node name
   --node-label value                  (agent/node) Registering kubelet with set of labels
   --node-taint value                  (agent/node) Registering kubelet with set of taints
   --docker                            (agent/runtime) Use docker instead of containerd
   --container-runtime-endpoint value  (agent/runtime) Disable embedded containerd and use alternative CRI implementation
   --pause-image value                 (agent/runtime) Customized pause image for containerd sandbox
   --private-registry value            (agent/runtime) Private registry configuration file (default: "/etc/rancher/k3s/registries.yaml")
   --node-ip value, -i value           (agent/networking) IP address to advertise for node
   --node-external-ip value            (agent/networking) External IP address to advertise for node
   --resolv-conf value                 (agent/networking) Kubelet resolv.conf file [$K3S_RESOLV_CONF]
   --flannel-iface value               (agent/networking) Override default flannel interface
   --flannel-conf value                (agent/networking) Override default flannel config file
   --kubelet-arg value                 (agent/flags) Customized flag for kubelet process
   --kube-proxy-arg value              (agent/flags) Customized flag for kube-proxy process
   --rootless                          (experimental) Run rootless
   --no-flannel                        (deprecated) use --flannel-backend=none
   --cluster-secret value              (deprecated) use --token [$K3S_CLUSTER_SECRET]
2.2、版本更新
  • 从发行版下载所需版本的K3
  • 安装到适当的位置(通常为/usr/local/bin/k3s)
  • 停止旧版本
  • 开始新版本
  • 重新启动K3s

systemd和openrc的安装脚本支持重启K3s。如果有使用systemd,则需要手动重启K3s:

sudo systemctl restart k3s

如果有使用openrc,则需要手动重启K3s:

sudo service k3s restart

三、网络配置

注意: 请参考网络页面以获取有关CoreDNS,Traefik和 Service LB 的信息。

默认情况下,使用VXLAN作为默认后端,K3s将以Flannel作为CNI运行。要更改CNI,请参阅有关配置自定义CNI的部分。要更改Flannel后端,请参考Flannel配置部分。

Flannel 配置

Flannel的默认后端是VXLAN。要启用加密,请通过下面的IPSec(Internet协议安全性)或WireGuard选项。

如果您希望将WireGuard用作Flannel后端,则可能需要其他内核模块。有关详细信息,请参见《WireGuard安装指南》。WireGuard安装步骤将确保为您的操作系统安装适当的内核模块。您需要在尝试利用WireGuard Flannel 后端选件之前,在服务器和代理的每个节点上安装WireGuard。

CLI标志和值 描述
–flannel-backend=vxlan (默认)使用VXLAN后端
–flannel-backend=ipsec 使用IPSEC后端对网络流量进行加密
–flannel-backend=wireguard 使用WireGuard后端对网络流量进行加密。可能需要其他内核模块和配置。

自定义CNI

运行K3s,--flannel-backend=none 并安装您选择的CNI。应该为Canal和Calico启用IP转发。请参考以下步骤。

  • Canal

访问 Project Calico Docs 网站。请按照以下步骤安装Canal。修改 Canal YAML,以便在container_settings部分中允许IP转发,例如:

"container_settings": {
              "allow_ip_forwarding": true
          }

应用 Canal YAML 配置.
通过在主机上运行以下命令,确保已应用设置:

cat /etc/cni/net.d/10-calico.conflist

您应该看到IP转发设置为true。

  • Calico

遵循《Calico CNI插件指南》。修改 Calico YAML,以便在container_settings部分中允许IP转发,例如:

"container_settings": {
              "allow_ip_forwarding": true
          }

应用 Calico YAML 配置.
通过在主机上运行以下命令,确保已应用设置:

cat /etc/cni/net.d/10-canal.conflist

您应该看到IP转发设置为true。

清理安装

如果您在install.sh脚本的帮助下安装了K3,则会在安装过程中生成一个卸载脚本。该脚本是在您的节点上/usr/local/bin/k3s-uninstall.sh(在或处k3s-agent-uninstall.sh)创建的。

作者:Jeebiz  创建时间:2019-08-14 15:08
 更新时间:2024-08-02 14:28