如何在 Ubuntu 18.04 上安装和配置 K3s

K3s是什么?

K3s 是 Kubernetes 的轻量级版本。 它是一种高度可用的 Kubernetes 认证发行版,专为无人值守、资源有限、远程位置或物联网设备内的生产工作负载而设计。 K3s 的开发者宣称 K3s 几乎可以做 K8s 能做的所有事情。

那么,是什么让它成为如此轻量级的发行版呢?

通过在单个进程中运行多个组件来减少内存使用。 这消除了否则会为每个组件重复的显着开销。 通过删除第三方存储驱动程序和云服务提供商,二进制文件更小。

  • 运行它需要更少的内存。
  • 一个 40Mb 的小二进制文件,其中包含用于启动集群的所有非容器组件。

特征

K3s 是一个完全兼容的 K8s 发行版,具有以下特性:

  • 它被打包为单个二进制文件。
  • 它包含一个基于 SQLite3(轻量级嵌入式数据库管理系统)作为默认存储引擎的轻量级后端存储介质。 Etcd3、MySQL 和 Postgres 数据库也可用。
  • K3s 使用一个简单的启动器来处理许多复杂的 TLS 职责和其他功能。
  • 新增功能包括本地存储提供者、负载均衡器、Helm 控制器(工具提示:帮助安装和管理 K8s 应用程序生命周期的打包器)和 Traefik 登录控制器(工具提示:支持 Docker 的反向代理,提供内置仪表板)。
  • 所有控制组件都在单个二进制文件和进程中运行。
  • 大多数所有外部依赖项都已最小化(仅需要内核和 cgroup)以减小大小。

先决条件

  • 两个节点不能共享相同的主机名,因此必须注意提前实现符合此要求的命名方案。
  • 如果节点已经共享相同的主机名,我们可以使用“–with-node-id”标志为每个节点附加一个随机后缀。 否则,我们必须使用 –node-name 标志或 $K3S_NODE_NAME 为我们添加到集群的每个节点创建一个唯一的名称来分配。

依赖关系

K3s 包需要以下依赖项才能工作:

  • 集装箱
  • 绒布
  • 核心DNS
  • CNI – 容器网络接口
  • 主机实用程序(iptables、socat 等)
  • 一个入口控制器(traefik)
  • 内置负载均衡服务
  • 内置网络策略控制器

内部配置

K3s架构

与 K8s 相比,K3s 没有明确区分 master 节点和 worker 节点。 这意味着可以在任何节点上调度和管理模块。 因此,主节点和工作节点名称并不严格适用于 K3s。

在 K3s 集群中,运行管理组件和 Kubelet 的节点称为服务器。 只运行 Kubelet 的节点称为代理。 服务器和代理有一个容器运行时来管理集群中的隧道和网络流量。 在典型的 K3s 环境中,我们运行一台服务器和多个代理。 如果您在安装期间传递 URL,则该节点将成为代理。 否则,您将启动另一个独立的 K3s 集群及其管理。

另一个关键点是如何管理集群的状态。 K8s 依赖于 etcd(一个开源分布式键值存储)和一个键值分布式数据库来存储集群状态信息的其余部分。 K3s 用轻量级 SQLite 数据库替换了 etcd。 通过在至少三个节点上运行 etcd,K8s 管理级别变得高可用。 另一方面,由于 SQLite 不是分布式数据库,因此它成为链中最薄弱的环节。

K3s安装配置

要部署具有主节点和工作节点的 K3s 集群,我们需要三台运行 Ubuntu 18 的服务器,每台至少有 1GB 的 RAM 和 1 个处理器。 一台服务器将用作主服务器,另外两台用作工作服务器。

注意:对于我们的测试服务器,我们已打开所有端口,但我们无法在生产环境中执行此操作。 但是由于我们有一个测试选项,默认情况下,我们已经打开了所有端口。 我们将需要打开端口 6443。

更新服务器

首先,我们将更新每个服务器。 我们将在master上显示基本信息和主要命令。

接下来,使用此命令更新主服务器和任何其他包含的服务器。

[email protected]:~# sudo apt update && sudo apt -y upgrade 

现在,我们需要找出虚拟网络的 IP,我们可以使用以下命令完成此操作。

[email protected]:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1/8 scope host lo        valid_lft forever preferred_lft forever     inet6 ::1/128 scope host        valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000     link/ether 02:35:cf:4e:e6:fe brd ff:ff:ff:ff:ff:ff     inet 172.31.11.188/20 brd 172.31.15.255 scope global dynamic eth0        valid_lft 3158sec preferred_lft 3158sec     inet6 fe80::35:cfff:fe4e:e6fe/64 scope link        valid_lft forever preferred_lft forever [email protected]:~#

主IP 172.31.11.188

现在,以相同的方式定位其他服务器的 IP。 确保将任何虚拟网络条目添加到每台服务器上的 /etc/hosts 文件中。

[email protected]:~# sudo tee -a /etc/hosts<<EOF 172.31.11.188 k3s-master 172.31.10.103 k3s-worker1 172.31.10.103 k3s-worker2 EOF  [email protected]:~# sudo tee -a /etc/hosts<<EOF > 172.31.11.188 k3s-master > 172.31.10.103 k3s-worker1 > 172.31.10.103 k3s-worker2 > EOF 172.31.11.188 k3s-master 172.31.10.103 k3s-worker1 172.31.10.103 k3s-worker2 [email protected]:~#

再次提醒,这些任务需要在每台服务器上完成。 这样,代理就知道在哪里以及在哪些主机上查找更新。

在 Master 上安装 K3s

接下来,我们可以在主服务器上安装 K3s。 有很多方法可以做到这一点,但这是最简单的方法。

[email protected]:~# curl -sfL https://get.k3s.io | sh - /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service. [INFO] systemd: Starting k3s [email protected]:~#

验证安装

K3s 安装后应该会自动启动。 让我们使用此命令进行验证。

[email protected]:~# systemctl status k3s ● k3s.service - Lightweight Kubernetes    Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)    Active: active (running) since Tue 2020-09-22 18:39:02 UTC; 29s ago      Docs: https://k3s.io   Process: 13245 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)   Process: 13240 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)  Main PID: 13249 (k3s-server)     Tasks: 78    CGroup: /system.slice/k3s.service            ├─13249 /usr/local/bin/k3s server            ├─13285 containerd -c /var/lib/rancher/k3s/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var/lib/rancher/k3s/agent/containerd            ├─13718 /var/lib/rancher/k3s/data/19bb6a9b46ad0013de084cf1e0feb7927ff9e4e06624685ff87f003c208fded1/bin/containerd-shim-runc-v2 -namespace k8s.io -id fbb9d4ec16b5e70b08ae9c968d4ae96f35b0d3328303c1            ├─13720 /var/lib/rancher/k3s/data/19bb6a9b46ad0013de084cf1e0feb7927ff9e4e06624685ff87f003c208fded1/bin/containerd-shim-runc-v2 -namespace k8s.io -id da00cf5a839e4d0cc89849317ed96b3269ba78ce92108e            ├─13721 /var/lib/rancher/k3s/data/19bb6a9b46ad0013de084cf1e0feb7927ff9e4e06624685ff87f003c208fded1/bin/containerd-shim-runc-v2 -namespace k8s.io -id 3271695d6f8cb7d38d86901faf719f840c236e236f9490            ├─13723 /var/lib/rancher/k3s/data/19bb6a9b46ad0013de084cf1e0feb7927ff9e4e06624685ff87f003c208fded1/bin/containerd-shim-runc-v2 -namespace k8s.io -id 23cdd690357129d8e0eb4a520a282c9428ce57ef359524            ├─13809 /pause            ├─13816 /pause            ├─13822 /pause            ├─13829 /pause            ├─13944 /coredns -conf /etc/coredns/Corefile            ├─13963 local-path-provisioner start --config /etc/config/config.json            ├─13976 /metrics-server            ├─14098 runc --root /run/containerd/runc/k8s.io --log /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/9f95dec13ba16620529007939afb598816a14073b175ca44c7e6ac8b7b0384b8/log.json --log-form            └─14109 runc init  Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.601394 13249 iptables.go:167] Deleting iptables rule: ! -s 10.42.0.0/16 -d 10.42.0.0/16 -j MASQUERADE --random-fully Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.601853 13249 iptables.go:155] Adding iptables rule: -s 10.42.0.0/16 -d 10.42.0.0/16 -j RETURN Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.603951 13249 iptables.go:155] Adding iptables rule: -s 10.42.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE --random-fully Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.606755 13249 iptables.go:155] Adding iptables rule: ! -s 10.42.0.0/16 -d 10.42.0.0/24 -j RETURN Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.607633 13249 iptables.go:155] Adding iptables rule: ! -s 10.42.0.0/16 -d 10.42.0.0/16 -j MASQUERADE --random-fully Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.612464 13249 iptables.go:145] Some iptables rules are missing; deleting and recreating rules Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.612479 13249 iptables.go:167] Deleting iptables rule: -s 10.42.0.0/16 -j ACCEPT Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.612994 13249 iptables.go:167] Deleting iptables rule: -d 10.42.0.0/16 -j ACCEPT Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.614222 13249 iptables.go:155] Adding iptables rule: -s 10.42.0.0/16 -j ACCEPT Sep 22 18:39:17 ip-172-31-11-188 k3s[13249]: I0922 18:39:17.615668 13249 iptables.go:155] Adding iptables rule: -d 10.42.0.0/16 -j ACCEPT lines 1-35/35 (END)

为什么用这种方式安装k3s更方便?

因为它会立即为我们安装以下程序

  • kubectl – 一个方便的基于 CLI 的程序,用于通过控制台或终端与 K3s 交互。
  • crictl – 这是一个用于与容器和其他容器运行时通信的程序。
  • k3s-killall.sh – :这是一个 bash 安装后清理所有容器和网络组件的脚本。
  • k3s-uninstall.sh:这是一个 bash 删除所有集群和脚本的脚本。

配置

kubeconfig 文件写入 /etc/rancher/k3s/k3s.yaml。 Kubernetes 配置需要此文件。

[email protected]master:~# sudo cat /etc/rancher/k3s/k3s.yaml apiVersion: v1 clusters: - cluster:     certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJWekNCL3FBREFnRUNBZ0VBTUFvR0NDcUdTTTQ5QkFNQ01DTXhJVEFmQmdOVkJBTU1HR3N6Y3kxelpYSjIKWlhJdFkyRkFNVFl3TURjNU9Ua3pOREFlRncweU1EQTVNakl4T0RNNE5UUmFGdzB6TURBNU1qQXhPRE00TlRSYQpNQ014SVRBZkJnTlZCQU1NR0dzemN5MXpaWEoyWlhJdFkyRkFNVFl3TURjNU9Ua3pOREJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQkdvU3pZQnBxWWduMzdTTnozZU9kOUgxcU1YSEpmNzljLzVOZm1xN2k3c1oKWWZ4TndPcXBkM3VtQ2NFLzl1MHgzYjVmUHRaR3g5RHUxK0RQTTQwYjlybWpJekFoTUE0R0ExVWREd0VCL3dRRQpBd0lDcERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSUc3eUtsTVFabmQ0ClVTRTJSbG5WdWlGeDJheCs4SjBkajcxY3BUTExlbUJ2QWlFQTl6L0tDZjAzR3poN3JCTjlaRnZOWWdydFBldkYKZDZBLzd5Q0RraEMwNlRZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==     server: https://127.0.0.1:6443   name: default contexts: - context:     cluster: default     user: default   name: default current-context: default kind: Config preferences: {} users: - name: default   user:     password: 7dff7a3015f352089c2cd1bfe3048a3d     username: admin [email protected]:~#

要在服务器上安装 K3s,代理需要将 K3S_URL 与 K3S_TOKEN 或 K3S_CLUSTER_SECRET 变量一起传递。

我们将使用 K3S_TOKEN 变量,我们可以在以下文件中看到它

[email protected]:~# sudo cat /var/lib/rancher/k3s/server/node-token K10a5185782c494893a4efada19b97fca7fd0b1e628a8a9f70eb7d21413a2fa2a3b::server:56b49545f3bf8dd01810268ea2579e12 [email protected]:~#

现在,让我们添加变量。 将数据插入令牌,如果我们有不同的 URL,我们可以在此处插入我们自己的 URL。

k3s_url="https://k3s-master:6443" k3s_token="K10a5185782c494893a4efada19b97fca7fd0b1e628a8a9f70eb7d21413a2fa2a3b::server:56b49545f3bf8dd01810268ea2579e12" curl -sfL https://get.k3s.io | K3S_URL=${k3s_url} K3S_TOKEN=${k3s_token} sh - 

工人 1 配置

现在将以下信息输入到 worker1 服务器中。

[email protected]:~# k3s_url="https://k3s-master:6443" [email protected]:~# [email protected]:~# k3s_token="K10a5185782c494893a4efada19b97fca7fd0b1e628a8a9f70eb7d21413a2fa2a3b::server:56b49545f3bf8dd01810268ea2579e12" [email protected]:~#

重要的是不要在等号前后放置任何空格。 如果它不起作用,请阅读 Linux 中的变量。 下一个。 开始安装。

[email protected]:~# curl -sfL https://get.k3s.io | K3S_URL=${k3s_url} K3S_TOKEN=${k3s_token} sh - [INFO] Finding release for channel stable [INFO] Using v1.18.8+k3s1 as release [INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v1.18.8+k3s1/sha256sum-amd64.txt [INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v1.18.8+k3s1/k3s [INFO] Verifying binary download [INFO] Installing k3s to /usr/local/bin/k3s [INFO] Creating /usr/local/bin/kubectl symlink to k3s [INFO] Creating /usr/local/bin/crictl symlink to k3s [INFO] Creating /usr/local/bin/ctr symlink to k3s [INFO] Creating killall script /usr/local/bin/k3s-killall.sh [INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh [INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env [INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service [INFO] systemd: Enabling k3s-agent unit Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service. [INFO] systemd: Starting k3s-agent [email protected]:~#

工人 2 配置

现在我们转到 worker2 服务器并重复整个过程。

[email protected]:~# k3s_url="https://k3s-master:6443" [email protected]:~# [email protected]:~# k3s_token="K10a5185782c494893a4efada19b97fca7fd0b1e628a8a9f70eb7d21413a2fa2a3b::server:56b49545f3bf8dd01810268ea2579e12" [email protected]:~# [email protected]:~# curl -sfL https://get.k3s.io | K3S_URL=${k3s_url} K3S_TOKEN=${k3s_token} sh - [INFO] Finding release for channel stable [INFO] Using v1.18.8+k3s1 as release [INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v1.18.8+k3s1/sha256sum-amd64.txt [INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v1.18.8+k3s1/k3s [INFO] Verifying binary download [INFO] Installing k3s to /usr/local/bin/k3s [INFO] Creating /usr/local/bin/kubectl symlink to k3s [INFO] Creating /usr/local/bin/crictl symlink to k3s [INFO] Creating /usr/local/bin/ctr symlink to k3s [INFO] Creating killall script /usr/local/bin/k3s-killall.sh [INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh [INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env [INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service [INFO] systemd: Enabling k3s-agent unit Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service. [INFO] systemd: Starting k3s-agent [email protected]:~#

验证配置

转到主服务器并检查所有内容。 我们使用此命令检查集群是否正常工作并且一切正常。

[email protected]:~# sudo kubectl cluster-info Kubernetes master is running at https://127.0.0.1:6443 CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy Metrics-server is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

进一步调试 诊断集群问题,使用“kubectl cluster-info dump”命令。

[email protected]:~# kubectl cluster-info dump

接下来,我们可以使用以下命令检查我们安装的代理。

[email protected]:~# sudo kubectl get nodes NAME STATUS ROLES AGE     VERSION k3s-master        Ready      master     10m     v1.18.8+k3s1 k3s-agent1 Ready worker 3m3s v1.18.8+k3s1 k3s-agent2 Ready worker 2m12s v1.18.8+k3s1 [email protected]:~#

验证正在运行的容器

现在,让我们检查容器是否已启动并正在运行。

主服务器

[email protected]:~# sudo crictl ps CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID 4dc55cbcce136 aa764f7db3051 18 minutes ago Running traefik 0 778fac0e94f4d b02177043c6aa 897ce3c5fc8ff 18 minutes ago Running lb-port-443 0 eae6017fa3438 838e79e984c34 897ce3c5fc8ff 19 minutes ago Running lb-port-80 0 eae6017fa3438 d212118979a23 9dd718864ce61 19 minutes ago Running metrics-server 0 23cdd69035712 102a4627832f3 9d12f9848b99f 19 minutes ago Running local-path-provisioner 0 da00cf5a839e4 512d452933667 4e797b3234604 19 minutes ago Running coredns 0 3271695d6f8cb [email protected]:~$

Worker1 服务器

[email protected]:~# sudo crictl ps CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID 2356fce5b5c8d 897ce3c5fc8ff 12 minutes ago Running lb-port-443 0 7a5f8c5198106 b68b8db0d827f 897ce3c5fc8ff 12 minutes ago Running lb-port-80 0 7a5f8c5198106 [email protected]:~#

工人 2 服务器

[email protected]:~# sudo crictl ps CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID 472a69994eedc 897ce3c5fc8ff 19 minutes ago Running lb-port-443 0 ff52371139711 08efc4ccaa735 897ce3c5fc8ff 19 minutes ago Running lb-port-80 0 ff52371139711 [email protected]:~#

结论

在本教程中,我们讨论了 k3s 的安装方式和配置方式。 更重要的是,K3s 提供了一种快速、经济高效的方法来横向扩展功能齐全的 Kubernetes 集群并经济地使用多用途应用程序。

今天就开始吧!

我们以成为 Hosting™ 中最有帮助的人而自豪!

我们的支持团队由经验丰富的 Linux 技术人员和才华横溢的系统管理员组成,他们对多种网络托管技术(尤其是本文中讨论的技术)了如指掌。

如果您对此信息有任何疑问,我们随时可以回答与本文相关的任何问题,一年 365 天,一周 7 天,一天 24 小时。

如果您是完全托管的 VPS 服务器, Cloud 专用,VMWare 私有 Cloud, 私有父服务器, 托管 Cloud 服务器或专用服务器所有者,并且您对执行列出的任何步骤感到不舒服,可以通过电话@800.580.4985 与我们联系,一个 聊天 或支持票以协助您完成此过程。