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


什麼是K3s?

K3s 是 Kubernetes 的輕量級版本。它是一種高度可用的 Kubernetes 認證發行版,專為無人值守、資源受限的遠程位置或物聯網設備內部的生產工作負載而設計。 K3s 開發人員聲稱 K3s 幾乎可以做 K8s 可以做的所有事情。

那麼為什麼會有這樣一個輕量級的發行版呢?

通過在單個進程中運行多個組件來減少內存使用量。這消除了為每個組件重複的大量開銷。通過刪除第三方存儲驅動程序和雲服務提供商,二進製文件更小。

  • 運行所需的內存更少。
  • 一個 40Mb 的小型二進製文件,包含用於啟動集群的所有非容器組件。

特徵

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

  • 打包為單個二進製文件。
  • 作為默認存儲引擎,它包含一個基於輕量級嵌入式數據庫管理系統 SQLite3 的輕量級後端存儲介質。 Etcd3、MySQL 和 Postgres 數據庫也可用。
  • K3s 使用一個簡單的 starter 來處理許多複雜的 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 節點。這意味著可以在任何節點上調度和管理模塊。因此,master 和 worker 的名稱並不嚴格適用於 K3。

在 K3s 集群中,運行管理組件和 Kubelet 的節點稱為服務器。 僅運行 Kubelet 的節點稱為代理。服務器和代理具有容器運行時來管理集群內的隧道和網絡流量。一個典型的 K3s 環境運行一個服務器和多個代理。如果您在安裝期間傳遞 URL,Node 將成為代理。否則,您將啟動另一個獨立的 K3s 集群及其管理。

另一個重點是如何管理集群狀態。 K8s 依靠 etcd(一個開源的分佈式鍵值存儲)和一個鍵值分佈式數據庫來存儲集群狀態信息的其餘部分。 K3s 用一個輕量級的 SQLite 數據庫替換了 etcd。 通過在至少三個節點上運行 etcd 可以使 K8s 管理員級別具有高可用性。另一方面,SQLite 不是分佈式數據庫,因此它是鏈條中最薄弱的環節。

K3s安裝配置

要部署具有主節點和工作節點的 K3s 集群,您需要三台運行 Ubuntu 18 的服務器。每個都至少有 1 GB 的 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

接下來,在主服務器上安裝 K3。有很多方法可以做到這一點,但這是最簡單的。

[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 的程序,用於通過控制台或終端與 K3 交互。
  • 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]:~#

要在服務器上安裝 K3,代理必須使用 K3S_TOKEN 或 K3S_CLUSTER_SECRET 變量傳遞 K3S_URL。

使用 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 工程師和稱職的系統管理員組成,他們特別熟悉本文中提到的許多網絡託管技術。

如果您對此信息有任何疑問,我們可以每天 24 小時、每週 7 天、每年 365 天為您解答有關本文的任何問題。

如果您是完全託管的 VPS 服務器、雲專用服務器、VMWare 私有云、私有父服務器、託管雲服務器或專用服務器的所有者,並且不習慣按照記錄的步驟操作,請致電 @800.580。致電 4985。聯繫地址 和…聊天 或支持票以協助此過程。