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

什么是K3s?

K3s 是 Kubernetes 的轻量级版本。 它是一种高度可用的 Kubernetes 认证发行版,专为无人值守、资源有限、远程位置或 IoT 设备内部的生产工作负载而设计。 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
  • A CNI – 容器网络接口
  • 主机实用程序(iptables、socat 等)
  • 入口控制器(traefik)
  • 内置负载均衡服务
  • 内置网络策略控制器

内部配置

K3s 架构

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

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

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

K3s 安装和配置

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

注意:对于我们的测试服务器,我们已经打开了所有端口,但我们不能在生产环境中这样做。 但是由于我们有一个测试选项,默认情况下,我们已经打开了所有端口。 我们需要打开 6443 端口。

更新服务器

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

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

root@host-master:~# sudo apt update && sudo apt -y upgrade 

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

root@host-master:~# 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
root@host-master:~#

主IP 172.31.11.188

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

root@host-master:~#
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

root@host-master:~# 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
root@host-master:~#

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

在 Master 上安装 K3s

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

root@host-master:~# 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
root@host-master:~#

验证安装

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

root@host-master:~# 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 配置需要此文件。

root@host-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
root@host-master:~#

要在服务器上安装 K3s,代理需要传递 K3S_URL 以及 K3S_TOKEN 或 K3S_CLUSTER_SECRET 变量。

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

root@host-master:~# sudo cat /var/lib/rancher/k3s/server/node-token
K10a5185782c494893a4efada19b97fca7fd0b1e628a8a9f70eb7d21413a2fa2a3b::server:56b49545f3bf8dd01810268ea2579e12
root@host-master:~#

现在,让我们添加我们的变量。 将数据插入到令牌中,如果我们有不同的 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服务器中输入以下信息。

root@host-worker1:~# k3s_url="https://k3s-master:6443"
root@host-worker1:~#
root@host-worker1:~# k3s_token="K10a5185782c494893a4efada19b97fca7fd0b1e628a8a9f70eb7d21413a2fa2a3b::server:56b49545f3bf8dd01810268ea2579e12"
root@host-worker1:~#

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

root@host-worker1:~# 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
root@host-worker1:~#

工人 2 配置

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

root@host-worker2:~# k3s_url="https://k3s-master:6443"
root@host-worker2:~#
root@host-worker2:~# k3s_token="K10a5185782c494893a4efada19b97fca7fd0b1e628a8a9f70eb7d21413a2fa2a3b::server:56b49545f3bf8dd01810268ea2579e12"
root@host-worker2:~#
root@host-worker2:~# 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
root@host-worker2:~#

验证配置

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

root@host-master:~# 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”命令。

root@host-master:~# kubectl cluster-info dump

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

root@host-master:~# 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
root@host-master:~#

验证正在运行的容器

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

主服务器

root@host-master:~# 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
ubuntu@ip-172-31-11-188:~$

Worker1 服务器

root@host-worker1:~# 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
root@host-worker1:~#

工人 2 服务器

root@host-worker2:~# 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
root@host-worker2:~#

结论

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

今天就开始吧!

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

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

如果您对此信息有任何疑问,我们将随时为您解答与本文相关问题的任何询问,每天 24 小时、每周 7 天、每年 365 天。

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