輕量級 Kubernetes 集羣發行版 K3s 完全進階指南

深入理解官方文檔,輕鬆學會使用 K3S 工具!

K3s 是一個輕量級的 Kubernetes 發行版,它針對邊緣計算、物聯網等場景進行了高度優化。

1. K3S 工具介紹

爲你提供 k3s 的產品介紹

K3s 有以下增強功能:

之所以叫做 K3S 是因爲希望安裝的 K8S 在內存佔用方面只是一半的大小,而一半大的東西就是一個 5 個字母的單詞,簡寫爲 K3S。

# K3s軟件包需要的依賴項
containerd  # 容器運行時(可以使用docker替代)
Flannel     # 網絡
CoreDNS     # DNS
CNI         # CNI
Traefik     # 默認的controller服務(apisix/ingress-controller)
iptables    # 主機實用程序
service load balancer     # 嵌入式服務負載均衡器
network policy controller # 嵌入式網絡策略控制器

# K3s適用於以下場景
CI
Development
ARM
嵌入 K8s
物聯網-IoT
邊緣計算-Edge

與此同時,Rancher 中國團隊推出了一款針對 K3s 的效率提升工具:AutoK3s。只需要輸入一行命令,即可快速創建 K3s 集羣並添加指定數量的 master 節點和 worker 節點。

2. K3S 快速入門

原理就是,將 K8S 的相關組件封裝到 K3S 的二進制文件中去!

原理就是,將 K8S 的相關組件封裝到 K3S 的二進制文件中去,然後啓動這二進制文件就可以啓動一個成熟的 K8S 集羣。我們可以看到 K3S 和 K8S 的架構基本差不多,其中 k3s-server 對應這個 control-plane,而 k3s-agent 對應着 node 節點。

可以看到 k3s 中使用的默認存儲是 SQLite(自帶),且默認的網絡使用的是 Flannel(自帶)。當服務端和客戶端都啓動之後,通過 Tunnel-Proxy 這個組件進行通信,通過這個通道去管理網絡流量。在 agent 節點中,通過 kubelet 操作 contaninerd 來創建對應 Pod。

K3S 工具進階指南

K3S 工具進階指南

國內的話,建議使用官方提供的 鏡像地址,這樣不但可以加速本地 K3s 的時候,而且方便部署和更新服務。這也是爲什麼建議國內使用 k3s-install.sh 部署服務的原因,因爲其內部使用的地址都是從國內去獲取的。

3. K3S 安裝事項

3.1 安裝指南

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

雖然可以通過下載二進制文件進行服務端和工作節點的運行 (./k3s server),但是一旦我們退出進程,之前創建的節點也就立即銷燬了,所以還是建議使用腳本進行安裝。

# 主節點
$ ./k3s server

# 工作節點
$ ./k3s agent K3S_URL=xxx K3S_TOKEN=xxx

# 清除垃圾文件
$ rm -rf /etc/rancher /var/lib/rancher
# 添加配置
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  "docker.io":
    endpoint:
      - "https://fogjl973.mirror.aliyuncs.com"
      - "https://registry-1.docker.io"
EOF

# 重啓服務
$ sudo systemctl restart k3s

# 是否生效
$ sudo crictl info | grep -A 2 "endpoint"

K3s 提供了一個安裝腳本,可以方便的在 systemd 或 openrc 的系統上將其作爲服務安裝。運行此安裝後,K3s 服務將被配置爲在節點重啓後或進程崩潰或被殺死時自動重啓。

# 安裝腳本
# https://get.k3s.io
$ curl -sfL https://get.k3s.io | sh -

# 建議使用這個安裝腳本(國內化了)
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn K3S_NODE_NAME=k3s1 \
    K3S_KUBECONFIG_OUTPUT=/home/escape/.kube/config \
    INSTALL_K3S_EXEC="--docker" sh -
# 查找stable分支版本信息
[INFO]  Finding release for channel stable
[INFO]  Using v1.23.6+k3s1 as release

# 獲取國內鏡像版本地址
[INFO]  Downloading hash https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/k3s
[INFO]  Verifying binary download

# 安裝k3s二進制工具並鏈接相關工具(內置)
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr

# 安裝清除和卸載k3s生成的配置和工具
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh

# 常見了兩個systemd的配置
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.

# 啓動k3s服務
[INFO]  systemd: Starting k3s
# 工作節點上安裝並將它們添加到集羣
# https://docs.rancher.cn/docs/k3s/architecture/_index#註冊-agent-節點
$ curl -sfL https://get.k3s.io | \
    K3S_URL=https://myserver:6443 \
    K3S_TOKEN=mynodetoken sh -

# 建議使用這個安裝命令(國內化了)
# K3S_URL: 會使K3s以worker模式運行
# K3S_TOKEN: 使用的值存儲在你的服務器節點上
# K3S_NODE_NAME: 爲每個節點提供一個有效且唯一的主機名
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn K3S_NODE_NAME=k3s2 \
    K3S_KUBECONFIG_OUTPUT=/home/escape/.kube/config \
    K3S_URL=https://192.168.100.100:6443 \
    K3S_TOKEN=mynodetoken sh -

# mynodetoken
$ sudo cat /var/lib/rancher/k3s/server/token
# 查找stable分支版本信息
[INFO]  Finding release for channel stable
[INFO]  Using v1.23.6+k3s1 as release

# 獲取國內鏡像版本地址
[INFO]  Downloading hash https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/k3s
[INFO]  Verifying binary download

# 安裝k3s二進制工具並鏈接相關工具(內置)
[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]  Skipping /usr/local/bin/ctr symlink to k3s

# 安裝清除和卸載k3s生成的配置和工具
[INFO]  Creating killall script /usr/local/bin/k3s-agent-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh

# 常見了兩個systemd的配置
[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.

# 啓動k3s服務
[INFO]  systemd: Starting k3s-agent

3.2 配置要求

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

# 爲每個節點添加隨機後綴
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.100.100:6443 \
    K3S_TOKEN=xxx sh -s - --with-node-id

# 爲每個節點指定主機名
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    K3S_NODE_ INSTALL_K3S_MIRROR=cn \
    K3S_URL=https://192.168.64.3:6443 K3S_TOKEN=xxx sh -

# 爲每個節點指定主機名
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.64.3:6443 \
    K3S_TOKEN=xxx sh -s - --node-name k3s2

4QS5SI

7WOwRc

# 其實就把對應參數加到systemd配置文件裏面去了
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="--docker" sh -

# 自動化部署(不用獲取token值了)
# 主節點和工作節點使用我們指定的key來通信
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    K3S_TOKEN=rancher-k3s sh -
$ sudo cat /var/lib/rancher/k3s/server/token

3.3 命令參數

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

在整個 K3s 文檔中,你會看到一些選項可以作爲命令標誌和環境變量傳遞進來,那該如何使用標誌和環境變量呢?

# 使用標誌
$ curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -s -
$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644

# 環境變量
$ curl -sfL https://get.k3s.io | \
    INSTALL_K3S_EXEC="--flannel-backend none" sh -s -
$ curl -sfL https://get.k3s.io | \
    sh -s - server --flannel-backend none
# write-kubeconfig
# 將管理客戶端的kubeconfig寫入這個文件
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    K3S_KUBECONFIG_OUTPUT=/root/.kube/config \
    sh -
# 使用docker作爲容器運行時
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="--docker" sh -

# 指定運行時工具
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="--container-runtime-endpoint containerd" \
    sh -


# 設置私有鏡像倉庫配置文件
# 默認配置文件: /etc/rancher/k3s/registries.yaml
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="--private-registry xxx" \
    sh -
# 針對多網卡主機安裝K3s集羣
# 默認多網卡會使用默認網關的那個卡
$ rout -n

# K3s server
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="--node-ip=192.168.100.100" \
    sh -

# K3s agent
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    K3S_URL=https://192.168.99.211:6443 K3S_TOKEN=xxx \
    INSTALL_K3S_EXEC="--node-ip=192.168.100.100" \
    sh -
# --tls-san
# 在TLS證書中添加其他主機名或IP作爲主機備用名稱
# 即在公網環境下允許通過公網IP訪問控制、操作遠程集羣
# 或者部署多個Server並使用LB進行負責,就需要保留公網地址
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC="--tls-san 1.1.1.1"  \
    sh -

# 獲取配置
$ kubectl get secret k3s-serving -n kube-system -o yaml

# 然後本機複製公網主節點對應的yaml文件即可本地操作了
$ scp ci@1.1.1.1:/etc/rancher/k3s/k3s.yaml ~/.kube/config
# 修改啓動的服務對應配置(調整節點的啓動的最大Pod數量)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--kubelet-arg=max-pods=200' \
    sh -

# 修改啓動的服務對應配置(使用ipvs作爲服務調度工具)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--kube-proxy-arg=proxy-mode=ipvs' \
    sh -

# 修改啓動的服務對應配置(調整服務啓動的端口範圍)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--kube-apiserver-arg=service-node-port-range=40000-50000' \
    sh -

# kubelet-arg     --kubelet-arg
# kube-apiserver  --kube-apiserver-arg
# kube-proxy-arg  --kube-proxy-arg
# kube-proxy-arg  --kube-proxy-arg=proxy-mode=ipvs
# --data-dir
# 修改K3s數據存儲目錄
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--data-dir=/opt/k3s-data' \
    sh -
# 禁用組件
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--disable traefik' \
    sh -

# 自己加自己需要的服務
$ ls /var/lib/rancher/k3s/server/manifests
$ kubectl get pods -A | grep traefik
# 添加label和taint標識
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--node-label foo=bar,hello=world \
        --node-taint key1=value1:NoExecute'
    sh -

# 查看一下
$ kubectl describe nodes
# 指定數據源名稱
# 標誌位: --datastore-endpoint value
# 環境變量: K3S_DATASTORE_ENDPOINT
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--datastore-endpoint etcd' \
    sh -
# cron規範中的快照間隔時間
# --etcd-snapshot-schedule-cron value
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--etcd-snapshot-schedule-cron * */5 * * *' \
    sh -

3.4 網絡選項

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

默認情況下,K3s 將以 flannel 作爲 CNI 運行,使用 VXLAN 作爲默認後端,CNI 和默認後端都可以通過參數修改。要啓用加密,請使用下面的 IPSec 或 WireGuard 選項。

# 默認安裝K3s之後的網絡配置
$ sudo cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json
{
    "Network": "10.42.0.0/16",
    "EnableIPv6": false,
    "EnableIPv4": true,
    "IPv6Network": "::/0",
    "Backend": {
        "Type": "vxlan"
    }
}

NHD5Jx

這樣,我就可以在安裝 K3s 或者之後修改對應配置文件,來修改 Flannel 默認的後端網絡配置選項 (重啓會覆蓋不生效) 了。下面,我們演示下,如何修改爲 host-gw 模式。

# 主節點
# flannel-backend使用host-gw
# 該模式會把對端主機的IP當做默認網管(多Server情況)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--flannel-backend=host-gw' \
    sh -

# 工作節點
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.100.100:6443 \
    K3S_TOKEN=xxx sh -
# 默認的路由信息
$ route -n
0.0.0.0         172.16.64.1     0.0.0.0         UG    100    0        0 enp0s2
10.42.1.0       172.16.64.9     255.255.255.0   UG    0      0        0 enp0s2

# 查看配置之後的網絡配置
$ sudo cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json
{
    "Network": "10.42.0.0/16",
    "Backend": {
        "Type": "host-gw"
    }
}

Flannel 自身的特性:當主機在同一子網時,啓用 direct routes(如 host-gw)。vxlan 只用於將數據包封裝到不同子網的主機上,同子網的主機之間使用  host-gw,默認值爲  false。

要添加我們就不能修改其對應的網絡配置文件,因爲重新安裝或者重啓都會把這個配置沖掉 (變成默認配置),所以需要折中下。我們自建一個網絡配置文件,然後在啓動的時候執行從哪個配置文件裏面加載對應配置。

# k3s的master和agent
$ sudo cat /etc/flannel/net-conf.json
{
    "Network": "10.42.0.0/16",
    "Backend": {
        "Type": "vxlan",
        "Directrouting": true
    }
}

# k3s master
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--flannel-backend=host-gw' \
    sh -

使用  --flannel-backend=none(禁用) 運行 K3s,然後在安裝你選擇的 CNI。按照 Calico CNI 插件指南 來修改 Calico 的 YAML 配置文件,在 container_settings 部分中允許 IP 轉發。

# 加到Calico的YAML文件中
# 允許IP轉發(這個是K3s的一個限制;需要開啓)
"container_settings": {
    "allow_ip_forwarding": true
}

- name: CALICO_IPV4POOL_CIDR
  value: "192.168.200.0/24"
# 通過在主機上運行以下命令,確保設置已被應用(true)
$ sudo cat /etc/cni/net.d/10-canal.conflist

# calico
# 其中--cluster-cidr可不設置
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--flannel-backend=none \
        --cluster-cidr=192.168.200.0/24"' \
    sh -

# 啓動網絡服務
$ kubectl apply -f ./calico.yaml

3.5 外部數據庫

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

雖然單節點 k3s server 集羣可以滿足各種用例,但是對於需要穩定運行的重要環境,可以在 HA 配置中運行 K3s,如何使用外部數據庫安裝一個高可用的 K3s 集羣?

K3S 安裝事項 - 外部數據庫

g9VECn

# 1.創建一個外部數據存儲
$ docker run --name some-mysql \
    --restart=unless-stopped -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7

# 2.啓動k3s-server節點(有讀寫權限不用加庫名)
# mysql://username:password@tcp(hostname:3306)/database-name
# 可加污點 --node-taint CriticalAddonsOnly=true:NoExecute
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn sh - server \
    --datastore-endpoint="mysql://root:password@ip:3306/k3s" \
    --tls-san 172.31.13.97
# 3.配置固定的註冊地址(k3s-lb節點)
# Agent節點需要一個URL來註冊(LB)
$ cat >> /etc/nginx.conf <<EOF
worker_processes 4;
worker_rlimit_nofile 40000;

events {
    worker_connections 8192;
}

stream {
    upstream k3s_api {
        least_conn;
        server 172.31.2.134:6443 max_fails=3 fail_timeout=5s;
        server 172.31.2.42:6443 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     6443;
        proxy_pass k3s_api;
    }
}
EOF

# 啓動服務
$ docker run -d --restart=unless-stopped \
  -p 6443:6443 \
  -v /etc/nginx.conf:/etc/nginx/nginx.conf \
  nginx:1.14
# 4.加入Agent節點
# Agent會保存LB節點和每個Server節點的IP信息
# cat /var/lib/rancher/k3s/agent/etc/k3s-agent-load-balancer.json
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn
    K3S_URL=https://172.31.13.97:6443 K3S_TOKEN=mynodetoken \
    sh -

# 5.通過kubeconfig訪問K3s集羣
$ kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
k3s-server-1   Ready    control-plane,master   68s   v1.20.7+k3s1
k3s-server-2   Ready    control-plane,master   66s   v1.20.7+k3s1

要在這種模式下運行 K3s,你必須有奇數的服務器節點,建議從三個節點開始。在嵌入式中,默認使用 Etcd 作爲高可用的數據庫。

# 服務器節點(啓動etcd集羣)
# SECRET我們預定一個key值
# 使用cluster-init標誌來啓用集羣
# 並使用一個標記作爲共享的密鑰來加入其他服務器到集羣中
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn K3S_TOKEN=SECRET \
    sh -s - --cluster-init

# 查看類型
$ sudo  kubectl get nodes
NAME    STATUS  ROLES                      AGE  VERSION
ip-xxx  Ready   control-plane,etcd,master  19h  v1.23.6+k3s1

# 其他服務器節點(2/3)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn K3S_TOKEN=SECRET \
    sh -s - --server https://<ip-or-host-server>:6443

# 查詢ETCD集羣狀態
# etcd證書默認目錄:/var/lib/rancher/k3s/server/tls/etcd
# etcd數據默認目錄:/var/lib/rancher/k3s/server/db/etcd
$ ETCDCTL_ENDPOINTS='https://172.31.12.136:2379,\
    https://172.31.4.43:2379,\
    https://172.31.4.190:2379' \
ETCDCTL_CACERT='/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt' \
ETCDCTL_CERT='/var/lib/rancher/k3s/server/tls/etcd/server-client.crt'\
ETCDCTL_KEY='/var/lib/rancher/k3s/server/tls/etcd/server-client.key' \
ETCDCTL_API=3 etcdctl endpoint status --write-out=table

使用 etcd 以外的數據存儲運行 K8S 的能力使 K3s 區別於其他 K8S 發行版。該功能爲 K8S 操作者提供了靈活性,可用的數據存儲選項允許你選擇一個最適合用例的數據存儲。

如果你的團隊沒有操作 etcd 的專業知識,可以選擇 MySQL 或 PostgreSQL 等企業級 SQL 數據庫。如果您需要在 CI/CD 環境中運行一個簡單的、短暫的集羣,可以使用嵌入式 SQLite 數據庫

如果你想使用外部數據存儲,如 PostgreSQL、MySQL 或 etcd,你必須設置 datastore-endpoint 參數,以便 K3s 知道如何連接到它,也可以指定參數來配置連接的認證和加密。下表總結了這些參數,它們可以作爲 CLI 標誌或環境變量傳遞。

ufHlNT

作爲最佳實踐,我們建議將這些參數設置爲環境變量,而不是命令行參數,這樣你的數據庫證書或其他敏感信息就不會作爲進程信息的一部分暴露出來。

3.6 私有鏡像倉庫

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

K3s 默認使用 containerd 作爲容器運行時,所以在 docker 上配置鏡像倉庫是不生效的。K3s 鏡像倉庫配置文件由兩大部分組成:mirrors 和  configs。

K3s registry 配置目錄爲:/etc/rancher/k3s/registries.yaml。K3s 啓動時會檢查  /etc/rancher/k3s/ 中是否存在  registries.yaml 文件,並指示 containerd 使用文件中定義的鏡像倉庫。如果你想使用一個私有的鏡像倉庫,那麼你需要在每個使用鏡像倉庫的節點上以 root 身份創建這個文件。

請注意,server 節點默認是可以調度的。如果你沒有在 server 節點上設置污點,那麼將在它們上運行工作負載,請確保在每個 server 節點上創建  registries.yaml 文件。

containerd 使用了類似 K8S 中 svc 與 endpoint 的概念,svc 可以理解爲訪問名稱,這個名稱會解析到對應的 endpoint 上。也可以理解 mirror 配置就是一個反向代理,它把客戶端的請求代理到 endpoint 配置的後端鏡像倉庫。mirror 名稱可以隨意填寫,但是必須符合 IP 或域名的定義規則。並且可以配置多個 endpoint,默認解析到第一個 endpoint,如果第一個 endpoint 沒有返回數據,則自動切換到第二個 endpoint,以此類推。

# /etc/rancher/k3s/registries.yaml
# 同時可以設置多個mirrors地址
# 可以對mirrors設置權限和證書
mirrors:
  "172.31.6.200:5000":
    endpoint:
      - "http://172.31.6.200:5000"
      - "http://x.x.x.x:5000"
      - "http://y.y.y.y:5000"
  "rancher.ksd.top:5000":
    endpoint:
      - "http://172.31.6.200:5000"
  "docker.io":
    endpoint:
      - "https://fogjl973.mirror.aliyuncs.com"
      - "https://registry-1.docker.io"

configs:
  "172.31.6.200:5000":
    auth:
      username: admin
      password: Harbor@12345
    tls:
      cert_file: /home/ubuntu/harbor2.escapelife.site.cert
      key_file: /home/ubuntu/harbor2.escapelife.site.key
      ca_file: /home/ubuntu/ca.crt
# 鏡像都是從同一個倉庫獲取到的
$ sudo systemctl restart k3s.service
$ sudo crictl pull 172.31.6.200:5000/library/alpine
$ sudo crictl pull rancher.ksd.top:5000/library/alpine

這裏我們介紹下,如何使用 TLS 配置。

# 證書頒發機構頒發的證書
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  "harbor.escapelife.site":
    endpoint:
      - "https://harbor.escapelife.site"
configs:
  "harbor.escapelife.site":
    auth:
      username: admin
      password: Harbor@12345
EOF

$ sudo systemctl restart k3s
# 自簽名證書
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  "harbor2.escapelife.site":
    endpoint:
      - "https://harbor2.escapelife.site"
configs:
  "harbor2.escapelife.site":
    auth:
      username: admin
      password: Harbor@12345
    tls:
      cert_file: /home/ubuntu/harbor2.escapelife.site.cert
      key_file:  /home/ubuntu/harbor2.escapelife.site.key
      ca_file:   /home/ubuntu/ca.crt
EOF

$ sudo systemctl restart k3s
# 不使用TLS證書
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  "docker.io":
    endpoint:
      - "https://fogjl973.mirror.aliyuncs.com"
      - "https://registry-1.docker.io"
EOF

$ sudo systemctl restart k3s

K3s 將會在 /var/lib/rancher/k3s/agent/etc/containerd/config.toml 中爲 containerd 生成  config.toml。如果要對這個文件進行高級設置,你可以在同一目錄中創建另一個名爲  config.toml.tmpl 的文件,此文件將會代替默認設置。

# 完整示例
$ cat >> /etc/rancher/k3s/registries.yaml
mirrors:
  "harbor.escapelife.site":
     endpoint:
     - "https://harbor.escapelife.site"
  "harbor2.escapelife.site":
     endpoint:
     - "https://harbor2.escapelife.site"
  "172.31.19.227:5000":
     endpoint:
     - "http://172.31.19.227:5000"
  "docker.io":
     endpoint:
     - "https://fogjl973.mirror.aliyuncs.com"
     - "https://registry-1.docker.io"

configs:
  "harbor.escapelife.site":
     auth:
       username: admin
       password: Harbor@12345

  "harbor2.escapelife.site":
     auth:
       username: admin
       password: Harbor@12345
     tls:
       cert_file: /home/ubuntu/harbor2.escapelife.site.cert
       key_file:  /home/ubuntu/harbor2.escapelife.site.key
       ca_file:   /home/ubuntu/ca.crt

3.7 離線安裝

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

離線安裝的過程主要分爲以下兩個步驟:

# 將所需鏡像上傳到私有鏡像倉庫
# https://github.com/k3s-io/k3s/releases
可以從K3s鏡像列表獲取到版本,下載上傳到私有鏡像倉庫

# 創建鏡像倉庫(YAML)
# 按照私有鏡像倉庫配置指南創建並配置registry.yaml文件
$ mkdir -p /etc/rancher/k3s/
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  "docker.io":
    endpoint:
      - "https://harbor.escapelife.site"
configs:
  "docker.io":
    auth:
      username: admin
      password: Harbor@12345
EOF
# 安裝單節點K3s集羣
# https://github.com/k3s-io/k3s/releases
可以從K3s倉庫獲取到版本(二進制文件)

# 獲取K3s安裝腳本
$ wget https://get.k3s.io -o ./install.sh
$ wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh

# 安裝K3s-server
$ INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh

# 將agent加入到K3s集羣
$ INSTALL_K3S_SKIP_DOWNLOAD=true \
    K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken \
    ./install.sh
# 從Github頁面獲取你所運行的K3s版本及文件
# https://github.com/rancher/k3s/releases
k3s二進制文件+鏡像tar文件

# 將tar文件放在images目錄下
$ sudo mkdir -p /var/lib/rancher/k3s/agent/images/
$ sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/

# 將k3s二進制文件放在/usr/local/bin/k3s路徑上
$ mv ./k3s /usr/local/bin/
$ chmod 755 /usr/local/bin/k3s

# 安裝K3s-server
$ INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh

# 將agent加入到K3s集羣
$ INSTALL_K3S_SKIP_DOWNLOAD=true \
    K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken \
    ./install.sh

離線升級 K3s 版本,完成離線安裝 K3s 後,還可以通過腳本升級 K3s 版本,或啓用自動升級功能,以保持離線環境中的 K3s 版本與最新的 K3s 版本同步。

# 通過腳本升級
# https://github.com/rancher/k3s/releases
從Github頁面下載要升級到的K3s版本

# 替換
# 複製並替換每個節點上/usr/local/bin中的舊K3s二進制文件
$ mv ./k3s /usr/local/bin/
$ chmod 755 /usr/local/bin/k3s
$ wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh

# 重啓K3s服務
$ sudo systemctl restart k3s.service

3.8 儀表盤及卸載

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

推薦使用三種儀表盤工具,分別是對應是 Kubernetes Dashboard、kube-explorer 和 Rancher UI,其各自各有優劣。

# 部署Kubernetes儀表盤
$ GITHUB_URL=https://github.com/kubernetes/dashboard/releases
$ VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S \
    ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
$ sudo k3s kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml
# 儀表盤RBAC配置
# 本指南中創建的admin-user將在儀表盤中擁有管理權限
$ sudo k3s kubectl create \
    -f dashboard.admin-user.yml \
    -f dashboard.admin-user-role.yml

# dashboard.admin-user.yml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

# dashboard.admin-user-role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: admin-user
    namespace: kubernetes-dashboard
# 獲得Bearer-Token
$ sudo k3s kubectl -n kubernetes-dashboard \
    describe secret admin-user-token | grep '^token'

# 本地訪問儀表盤
# https://192.168.100.100:8443
# https://www.escapelife.site/posts/180e93f1.html
# https://www.escapelife.site/posts/538ec6b1.html
$ sudo k3s kubectl proxy
$ sudo kubectl -n kubernetes-dashboard port-forward \
    --address 0.0.0.0 svc/kubernets-dashboard 8443:443
# 升級儀表盤
$ sudo k3s kubectl delete ns kubernetes-dashboard
$ GITHUB_URL=https://github.com/kubernetes/dashboard/releases
$ VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
$ sudo k3s kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml

# ## 刪除儀表盤和admin-user配置
$ sudo k3s kubectl delete ns kubernetes-dashboard
$ sudo k3s kubectl delete clusterrolebinding kubernetes-dashboard
$ sudo k3s kubectl delete clusterrole kubernetes-dashboard
# 從發佈頁面下載二進制文件
# https://github.com/cnrancher/kube-explorer

# 運行
# --kubeconfig 可以不配置(自己可以找到)
$ ./kube-explorer --kubeconfig=/etc/rancher/k3s/kube.yaml \
    --http-listen-port=9898 \
    --https-listen-port=0

# 打開瀏覽器訪問
http://192.168.100.100:9898
# 導入K3s集羣時,Rancher會將其識別爲K3s類型,並且附件額外功能
# 1.能夠升級K3s版本
# 2.可配置升級集羣時升級的最大節點數
# 3.在主機詳情頁能夠查看啓動K3s集羣時每個節點的配置參數和環境變量

# 配置K3s集羣以允許導入到Rancher
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn sh -s - \
    --write-kubeconfig-mode 644
# 主節點
$ /usr/local/bin/k3s-uninstall.sh

# 工作節點
$ /usr/local/bin/k3s-agent-uninstall.sh
# 包括docker等信息一併清理

#!/bin/bash

KUBE_SVC='
kubelet
kube-scheduler
kube-proxy
kube-controller-manager
kube-apiserver
'

for kube_svc in ${KUBE_SVC};
do
  # 停止服務
  if [[ `systemctl is-active ${kube_svc}` == 'active' ]]; then
    systemctl stop ${kube_svc}
  fi
  # 禁止服務開機啓動
  if [[ `systemctl is-enabled ${kube_svc}` == 'enabled' ]]; then
    systemctl disable ${kube_svc}
  fi
done

# 停止所有容器
docker stop $(docker ps -aq)

# 刪除所有容器
docker rm -f $(docker ps -qa)

# 刪除所有容器卷
docker volume rm $(docker volume ls -q)

# 卸載mount目錄
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher;
do
  umount $mount;
done

# 備份目錄
mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")

# 刪除殘留路徑
rm -rf /etc/ceph \
    /etc/cni \
    /opt/cni \
    /run/secrets/kubernetes.io \
    /run/calico \
    /run/flannel \
    /var/lib/calico \
    /var/lib/cni \
    /var/lib/kubelet \
    /var/log/containers \
    /var/log/kube-audit \
    /var/log/pods \
    /var/run/calico \
    /usr/libexec/kubernetes

# 清理網絡接口
no_del_net_inter='
lo
docker0
eth
ens
bond
'

network_interface=`ls /sys/class/net`

for net_inter in $network_interface;
do
  if ! echo "${no_del_net_inter}" | grep -qE ${net_inter:0:3}; then
    ip link delete $net_inter
  fi
done

# 清理殘留進程
port_list='
80
443
6443
2376
2379
2380
8472
9099
10250
10254
'

for port in $port_list;
do
  pid=`netstat -atlnup | grep $port | awk '{print $7}' | awk -F '/' '{print $1}' | grep -v - | sort -rnk2 | uniq`
  if [[ -n $pid ]]; then
    kill -9 $pid
  fi
done

kube_pid=`ps -ef | grep -v grep | grep kube | awk '{print $2}'`

if [[ -n $kube_pid ]]; then
  kill -9 $kube_pid
fi

# 清理Iptables表
## 注意:如果節點Iptables有特殊配置,以下命令請謹慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain
systemctl restart docker

3.9 注意事項

理解 Server 節點的安裝,以及註冊 Agent 節點的步驟!

對於我們希望使用的組件,可以在啓動的時候禁用默認組件,在手動部署你需要的一些組件 (通常是放到一個指定目錄下面,隨着服務啓動自動拉起),從而達到靈活使用的目的。

# 查看所有Pod服務
# 比如helm/coredns也不是自帶的就是通過這個方式創建的
$ sudo kubectl get pods -A

在 agent 節點運行註冊命令,會和 server 節點發起 websocket 連接,然後會在工作節點上面創建一個隨機的密碼。然後會拿着這個密碼和工作節點的主機名,發送給主節點。然後主節點會將這個信息在保存 (k8s secrets) 起來,隨後的任何嘗試都必須使用相同的密碼。

# 工作節點的密碼信息(password+hostname)
$ sudo cat /etc/rancher/node/password

# 查看主節點的密碼信息
# https://docs.rancher.cn/docs/k3s/architecture/_index#註冊-agent-節點
$ sudo kubectl get secret k3s2.node-password.k3s -o yaml -n kube-system

# 可以查看日誌信息驗證這個信息的存在
$ sudo tail -f 200 /var/log/syslog | grep k3s
# 發現節點信息提示NotReady狀態
# 可以嘗試刪除節點的密碼存儲信息,之後會自動獲取新的
$ sudo kubectl delete secret k3s2.node-password.k3s -n kube-system

集羣啓動之後,默認會啓動一個 local-path 的組件,用於提供服務掛載存儲使用,其默認以 PVC 的形式。之後,將其存儲在 /var/lib/rancher/k3s/server/storageclass 目錄下面。

# 查看組件
$ sudo kubectl get pods -A

# 查看對應存儲
$ sudo kubectl get storageclass

# 可以使用參數修改默認存儲地址
# --default-local-storage-path value
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \
    INSTALL_K3S_MIRROR=cn \
    INSTALL_K3S_EXEC='--etcd-snapshot-schedule-cron * */5 * * *' \
    sh -

4. K3S 集羣升級

手動升級 + 自動升級

當升級 K3s 時,K3s 服務會重啓或停止,但 K3s 容器會繼續運行。要停止所有的 K3s 容器並重置容器的狀態,可以使用  k3s-killall.sh 腳本。killall 腳本清理容器、K3s 目錄和網絡組件,同時也刪除了 iptables 鏈和所有相關規則。集羣數據不會被刪除。

你可以通過使用安裝腳本升級 K3s,或者手動安裝所需版本的二進制文件。

# 升級到最新stable版本
$ curl -sfL https://get.k3s.io | sh -

# 升級到latest版本
$ curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=latest sh -

# 升級到v1.20的最新版本
$ curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL="v1.20" sh -

# 升級到指定版本
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -

你可以通過使用安裝腳本升級 K3s,或者手動安裝所需版本的二進制文件。

# 從發佈下載所需版本的K3s二進制文件
https://github.com/rancher/k3s/releases

# 將下載的二進制文件複製到/usr/local/bin/k3s
$ mv ./k3s /usr/local/bin/k3s

# 停止舊的K3s二進制文件
$ curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL="v1.20" sh -

# 啓動新的K3s二進制文件
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -

你可以使用 Rancher 的 system-upgrad-controller 來管理 K3s 集羣升級。這是一種 Kubernetes 原生的集羣升級方法。它利用自定義資源定義 (CRD)、計劃和控制器,根據配置的計劃安排升級。

控制器通過監控計劃和選擇要在其上運行升級 job 的節點來調度升級,計劃通過標籤選擇器定義哪些節點應該升級。當一個 job 成功運行完成後,控制器會給它運行的節點打上相應的標籤。

# 將system-upgrade-controller安裝到您的集羣中
$ kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/download/v0.6.2/system-upgrade-controller.yaml
# 配置計劃
# 建議您最少創建兩個計劃
# 升級server節點的計劃和升級agent節點的計劃

# Server plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: server-plan
  namespace: system-upgrade
spec:
  concurrency: 1
  cordon: true
  nodeSelector:
    matchExpressions:
    - key: node-role.kubernetes.io/master # 選擇主節點
      operator: In
      values:
      - "true"
  serviceAccountName: system-upgrade
  upgrade:
    image: rancher/k3s-upgrade
  version: v1.20.4+k3s1

# Agent plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: agent-plan
  namespace: system-upgrade
spec:
  concurrency: 1
  cordon: true
  nodeSelector:
    matchExpressions:
    - key: node-role.kubernetes.io/master # 選擇工作節點
      operator: DoesNotExist
  prepare:
    args:
    - prepare
    - server-plan
    image: rancher/k3s-upgrade
  serviceAccountName: system-upgrade
  upgrade:
    image: rancher/k3s-upgrade
  version: v1.20.4+k3s1
# 自動升級到最新版本(不指定版本)
apiVersion: upgrade.cattle.io/v1
kind: Plan
...
spec:
  ...
  upgrade:
    image: rancher/k3s-upgrade
  channel: https://update.k3s.io/v1-release/channels/stable

K3S 集羣升級

5. K3S 備份恢復

SQLite + etcd + 外部數據存儲

# 方式1:備份/恢復數據目錄

# 備份
$ cp -rf /var/lib/rancher/k3s/server/db /opt/db

# 恢復
$ systemctl stop k3s
$ rm -rf /var/lib/rancher/k3s/server/db
$ cp -rf /opt/db /var/lib/rancher/k3s/server/db
$ systemctl start k3s
# 方式2:通過 SQLite cli

# 備份
sqlite3 /var/lib/rancher/k3s/server/db/state.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> .backup "/opt/kine.db"
sqlite> .exit

# 恢復
$ sudo systemctl stop k3s

sqlite3 /var/lib/rancher/k3s/server/db/state.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> .restore '/opt/kine.db'
sqlite> .exit

$ sudo systemctl start k3s

當使用外部數據存儲時,備份和恢復操作是在 K3s 之外處理的。數據庫管理員需要對外部數據庫進行備份,或者從快照或轉儲中進行恢復。我們建議將數據庫配置爲執行定期快照。

# 備份
$ mysqldump -uroot -p --all-databases --master-data > k3s-dbdump.db

# 恢復
$ systemctl stop k3s
$ mysql -uroot -p  < k3s-dbdump.db
$ systemctl start k3s
# 創建快照(K3s默認啓用快照)
# 快照目錄默認: /var/lib/rancher/k3s/server/db/snapshots

# 要配置快照間隔或保留的快照數量
--etcd-disable-snapshots       禁用自動etcd快照
--etcd-snapshot-schedule-cron  定時快照的時間點;認值爲每12小時觸發一次
--etcd-snapshot-retention      保留的快照數量;默認值爲5
--etcd-snapshot-dir            保存數據庫快照的目錄路徑
--cluster-reset                忘記所有的對等體;成爲新集羣的唯一成員
--cluster-reset-restore-path   要恢復的快照文件的路徑

當 K3s 從備份中恢復時,舊的數據目錄將被移動到/var/lib/rancher/k3s/server/db/etcd-old/。然後 K3s 會嘗試通過創建一個新的數據目錄來恢復快照,然後從一個帶有一個 etcd 成員的新 K3s 集羣啓動 etcd。

# 從快照恢復集羣
# 使用--cluster-reset選項運行K3s
# 同時給出--cluster-reset-restore-path
$ ./k3s server \
    --cluster-reset \
    --cluster-reset-restore-path=<PATH-TO-SNAPSHOT>

6. K3S 卷和存儲

介紹瞭如何通過 local storage provider 或 Longhorn 來設置持久存儲。

當部署一個需要保留數據的應用程序時,你需要創建持久存儲。持久存儲允許您從運行應用程序的 pod 外部存儲應用程序數據。即使應用程序的 pod 發生故障,這種存儲方式也可以使您維護應用程序數據。

K3s 自帶 Rancher 的 Local Path Provisioner(LPP),這使得能夠使用各自節點上的本地存儲來開箱即用地創建 pvc。根據用戶配置,LPP 將自動在節點上創建基於 hostPath 的持久卷。它利用了 K8s 的 Local Persistent Volume 特性引入的特性,但它比 K8s 中內置的  local pv 特性更簡單的解決方案。

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-path-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 2Gi

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
  namespace: default
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: local-path-pvc
# 應用yaml服務
$ kubectl create -f pvc.yaml pod.yaml

# 確認PV和PVC已創建
$ kubectl get pv
$ kubectl get pvc

K3s 支持 Longhorn(是 K8s 的一個開源分佈式塊存儲系統)。

# 安裝Longhorn
# 將被安裝在命名空間longhorn-system中
$ kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-volv-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
  namespace: default
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-volv-pvc
# 應用yaml服務
$ kubectl create -f pvc.yaml pod.yaml

# 確認PV和PVC已創建
$ kubectl get pv
$ kubectl get pvc

7. K3S 網絡相關

簡單介紹下 K3s 相關的網絡配置組件!

CoreDNS 是在 agent 節點啓動時部署的。要禁用,請在每臺服務器上運行 --disable coredns 選項。如果你不安裝 CoreDNS,你將需要自己安裝一個集羣 DNS 提供商。

# 如何修改coredns參數
# /var/lib/rancher/k3s/server/manifests/coredns.yaml
# 該文件重啓K3s服務的話會導致coredns配置重新初始化
1.將coredns.yaml保存到其他目錄
2.通過 --disable coredns 禁用coredns
3.複製coredns.yaml到/var/lib/rancher/k3s/server/manifests/目錄並修改參數

啓動 server 時,默認情況下會部署 Traefik,對該文件的任何修改都會以類似 kubectl apply 的方式自動部署到 Kubernetes 中,將使用主機上的 80 和 443 端口。

# 操作和上面基本是一致的
# 請使用 --disable traefik 選項啓動每個server
# /var/lib/rancher/k3s/server/manifests/traefik.yaml
# 如何啓用 treafik2 dashboard
# http://traefik.example.com/dashboard

# Note: in a kubernetes secret the string (e.g. generated by htpasswd) must be base64-encoded first.
# To create an encoded user:password pair, the following command can be used:
# htpasswd -nb admin admin | openssl base64

apiVersion: v1
kind: Secret
metadata:
  name: authsecret
  namespace: default
data:
  users: |2
    YWRtaW46JGFwcjEkLkUweHd1Z0EkUjBmLi85WndJNXZWRFMyR2F2LmtELwoK

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
spec:
  routes:
    - match: Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService
      middlewares:
        - name: auth

---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: auth
spec:
  basicAuth:
    secret: authsecret # Kubernetes secret named "secretName"

K3s 提供了一個名爲 Klipper Load Balancer 的負載均衡器,它可以使用可用的主機端口。允許創建 LoadBalancer 類型的 Service,但不包括 LB 的實現。某些 LB 服務需要雲提供商,例如 Amazon EC2。相比之下,K3s service LB 使得可以在沒有云提供商的情況下使用 LB 服務。

8. K3S 與 Helm

Helm 是 Kubernetes 的包管理工具。Helm Chart 爲 Kubernetes YAML 清單文件提供了模板化語法,可以通過 Helm 安裝對應的 chart。K3s 不需要任何特殊的配置就可以使用 Helm 命令行工具。

在 /var/lib/rancher/k3s/server/manifests 中找到的任何 Kubernetes 清單將以類似 kubectl apply 的方式自動部署到 K3s。以這種方式部署的 manifests 是作爲 AddOn 自定義資源來管理的。你會發現打包組件的 AddOns,如 CoreDNS、Local-Storage 等。AddOns 是由部署控制器自動創建的,並根據它們在 manifests 目錄下的文件名命名。

# 查看運行AddOn資源
$ kubectl get addon -A

# 也可以將Helm-Chart作爲AddOns部署
https://github.com/rancher/helm-controller/

HelmChart CRD 捕獲了大多數你通常會傳遞給 helm 命令行工具的選項。下面是一個例子,說明如何從默認的 Chart 資源庫中部署 Grafana,覆蓋一些默認的 Chart 值。請注意,HelmChart 資源本身在 kube-system 命名空間,但 Chart 資源將被部署到 monitoring 命名空間。

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: grafana
  namespace: kube-system
spec:
  chart: stable/grafana
  targetNamespace: monitoring
  set:
    adminPassword: "NotVerySafePassword"
  valuesContent: |-
    image:
      tag: master
    env:
      GF_EXPLORE_ENABLED: true
    adminUser: admin
    sidecar:
      datasources:
        enabled: true

9. K3S 高級選項

包含高級選項和配置

默認情況下,K3s 的證書在 12 個月內過期。如果證書已經過期或剩餘的時間不足 90 天,則在 K3s 重啓時輪換證書。

# 查詢K3s證書過期時間
$ for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; \
  do \
    echo $i;\
    openssl x509 -enddate -noout -in $i; \
  done

# 修改系統時間爲證書過期前90天或證書過期後
$ timedatectl set-ntp no
$ date -s 20220807

# 重啓K3s服務
$ service k3s restart

建議運行以下命令,關閉 firewalld 防火牆。

$ sudo systemctl disable firewalld --now

10. 參考鏈接

送人玫瑰,手有餘香!

     完全基於 K8S 管理的輕量級操作系統

    用於簡化 K3s 集羣部署和管理的輕量級工具

    即在阿里雲和 aws 等雲服務器上面部署 k3s

本文轉載自:「 Escape 的博客 」,原文:https://url.hi-linux.com/ytP71 ,版權歸原作者所有。歡迎投稿,投稿郵箱: editor@hi-linux.com。

最近,我們建立了一個技術交流微信羣。目前羣裏已加入了不少行業內的大神,有興趣的同學可以加入和我們一起交流技術,在 「奇妙的 Linux 世界」 公衆號直接回復 「加羣」 邀請你入羣。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/kLmDLt7MSEfchYj8XsoQnQ