K3s 高級選項和配置

2022-08-24 10:14 更新

證書輪換

默認情況下,K3s 的證書在 12 個月內(nèi)過期。

如果證書已經(jīng)過期或剩余的時間不足 90 天,則在 K3s 重啟時輪換證書。

自動部署清單

在?/var/lib/rancher/k3s/server/manifests?中找到的任何文件都會以類似?kubectl apply?的方式自動部署到 Kubernetes,在啟動和在磁盤上更改文件時都是如此。從該目錄中刪除文件不會從集群中刪除相應(yīng)的資源。

關(guān)于部署 Helm charts 的信息,請參閱Helm章節(jié)。

使用 Docker 作為容器運行時

K3s 包含并默認為containerd, 一個行業(yè)標準的容器運行時。

要使用 Docker 而不是 containerd,

  1. 在 K3s 節(jié)點上安裝 Docker。可以使用 Rancher 的一個Docker 安裝腳本來安裝 Docker:
  2. curl https://releases.rancher.com/install-docker/19.03.sh | sh
  3. 使用?--docker?選項安裝 K3s:
  4. curl -sfL https://get.k3s.io | sh -s - --docker

    國內(nèi)用戶,可以使用以下方法加速安裝:

    curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --docker
  5. 確認集群可用:
  6. $ sudo k3s kubectl get pods --all-namespaces
    NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE
    kube-system   local-path-provisioner-6d59f47c7-lncxn   1/1     Running     0          51s
    kube-system   metrics-server-7566d596c8-9tnck          1/1     Running     0          51s
    kube-system   helm-install-traefik-mbkn9               0/1     Completed   1          51s
    kube-system   coredns-8655855d6-rtbnb                  1/1     Running     0          51s
    kube-system   svclb-traefik-jbmvl                      2/2     Running     0          43s
    kube-system   traefik-758cd5fc85-2wz97                 1/1     Running     0          43s
  7. 確認 Docker 容器正在運行:
  8. $ sudo docker ps
    CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS               NAMES
    3e4d34729602        897ce3c5fc8f              "entry"                  About a minute ago   Up About a minute                       k8s_lb-port-443_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
    bffdc9d7a65f        rancher/klipper-lb        "entry"                  About a minute ago   Up About a minute                       k8s_lb-port-80_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
    436b85c5e38d        rancher/library-traefik   "/traefik --configfi…"   About a minute ago   Up About a minute                       k8s_traefik_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
    de8fded06188        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
    7c6a30aeeb2f        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
    ae6c58cab4a7        9d12f9848b99              "local-path-provisio…"   About a minute ago   Up About a minute                       k8s_local-path-provisioner_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
    be1450e1a11e        9dd718864ce6              "/metrics-server"        About a minute ago   Up About a minute                       k8s_metrics-server_metrics-server-7566d596c8-9tnck_kube-system_031e74b5-e9ef-47ef-a88d-fbf3f726cbc6_0
    4454d14e4d3f        c4d3d16fe508              "/coredns -conf /etc…"   About a minute ago   Up About a minute                       k8s_coredns_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
    c3675b87f96c        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
    4b1fddbe6ca6        rancher/pause:3.1         "/pause"                 About a minute ago   Up About a minute                       k8s_POD_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
    64d3517d4a95        rancher/pause:3.1         "/pause"

可選:將 crictl 與 Docker 一起使用

crictl 為兼容 CRI 的容器運行時提供了 CLI

如果你想在使用?--docker?選項安裝 K3s 后使用 crictl,請參考官方文檔來安裝 crictl。

$ VERSION="v1.17.0"
$ curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-amd64.tar.gz --output crictl-${VERSION}-linux-amd64.tar.gz
$ sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
crictl

然后開始使用 crictl 命令:

$ sudo crictl version
Version:  0.1.0
RuntimeName:  docker
RuntimeVersion:  19.03.9
RuntimeApiVersion:  1.40.0
$ sudo crictl images
IMAGE                            TAG                 IMAGE ID            SIZE
rancher/coredns-coredns          1.6.3               c4d3d16fe508b       44.3MB
rancher/klipper-helm             v0.2.5              6207e2a3f5225       136MB
rancher/klipper-lb               v0.1.2              897ce3c5fc8ff       6.1MB
rancher/library-traefik          1.7.19              aa764f7db3051       85.7MB
rancher/local-path-provisioner   v0.0.11             9d12f9848b99f       36.2MB
rancher/metrics-server           v0.3.6              9dd718864ce61       39.9MB
rancher/pause                    3.1                 da86e6ba6ca19       742kB

使用 etcdctl

etcdctl 為 etcd 提供了一個 CLI。

如果你想在嵌入式 etcd 的 K3s 里使用 etcdctl,請先參考官方文檔安裝 etcdctl。

$ VERSION="v3.5.0"
$ curl -L https://github.com/etcd-io/etcd/releases/download/${VERSION}/etcd-${VERSION}-linux-amd64.tar.gz --output etcdctl-linux-amd64.tar.gz
$ sudo tar -zxvf etcdctl-linux-amd64.tar.gz --strip-components=1 -C /usr/local/bin etcd-${VERSION}-linux-amd64/etcdctl

然后開始使用帶有適當 K3s 標志的 etcdctl 命令:

$ sudo etcdctl --cacert=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/k3s/server/tls/etcd/client.crt --key=/var/lib/rancher/k3s/server/tls/etcd/client.key version

配置 containerd

K3s 將會在?/var/lib/rancher/k3s/agent/etc/containerd/config.toml?中為 containerd 生成 config.toml。

如果要對這個文件進行高級定制,你可以在同一目錄中創(chuàng)建另一個名為 ?config.toml.tmpl? 的文件,此文件將會代替默認設(shè)置。

?config.toml.tmpl? 其實是一個 Go 模板文件,并且 ?config.Node? 結(jié)構(gòu)傳遞給模板。

使用 Rootless 運行 K3s (實驗)

警告: 這個功能是試驗性的

Rootless 模式允許以非特權(quán)用戶的身份運行 k3s,這樣可以保護主機上的真正的 root 免受潛在的容器攻擊。

請參閱 https://rootlesscontaine.rs/ 了解 Rootless 模式。

Rootless 模式的已知問題

  • 端口
  • 在 rootless 運行時,將創(chuàng)建一個新的網(wǎng)絡(luò)名稱空間。這意味著 K3s 實例在與主機完全分離的網(wǎng)絡(luò)上運行。從主機訪問在 K3s 中運行的服務(wù)的唯一方法是設(shè)置端口轉(zhuǎn)發(fā)到 K3s 網(wǎng)絡(luò)名稱空間。我們有一個控制器,它將自動將 6443 和 1024 以下的服務(wù)端口綁定到主機,偏移量為 10000。

    也就是說服務(wù)端口 80 在主機上會變成 10080,但 8080 會變成 8080,沒有任何偏移。

    目前,只有?LoadBalancer?服務(wù)會自動綁定。

  • Cgroups

    不支持 Cgroup v1,支持 V2。

  • 多節(jié)點集群
  • 多集群安裝沒有經(jīng)過測試,也沒有記錄。

使用 Rootless 運行 Server 和 Agent

  • 啟用 cgroup v2 授權(quán),請參閱 https://rootlesscontaine.rs/getting-started/common/cgroup2/ 。這一步是可選的,但強烈建議啟用 CPU 和內(nèi)存資源的限制。
  • https://github.com/k3s-io/k3s/blob/<VERSION>/k3s-rootless.service下載?k3s-rootless.service?。確保使用相同版本的?k3s-rootless.service?和?k3s?。
  • 將 ?k3s-rootless.service? 安裝到 ?~/.config/systemd/user/k3s-rootless.service?。不支持將該文件安裝為全系統(tǒng)服務(wù)(?/etc/systemd/...?)。根據(jù) ?k3s? 二進制文件的路徑,你可能需要修改文件中的 ?ExecStart=/usr/local/bin/k3s ...? 行。
  • 運行?systemctl --user daemon-reload?。
  • 運行?systemctl --user enable --now k3s-rootless?。
  • 運行?KUBECONFIG=~/.kube/k3s.yaml kubectl get pods -A?,并確保 pods 正在運行。
注意:不要嘗試在終端上運行?k3s server --rootless?,因為它不能啟用 cgroup v2 授權(quán)。 如果你真的需要在終端上運行,請在 ?systemd-run --user -p Delegate=yes --tty? 前加上一個 systemd 范圍。
即:?systemd-run --user -p Delegate=yes --tty k3s server --rootless?。

故障排除

  • 運行?systemctl --user status k3s-rootless? 來檢查守護進程的狀態(tài)。
  • 運行?journalctl --user -f -u k3s-rootless? 查看守護程序日志。
  • 參見 https://rootlesscontaine.rs/

節(jié)點標簽和污點

K3s agents 可以通過?--node-label?和?--node-taint?選項進行配置,這兩個選項可以給 kubelet 添加標簽和污點。這兩個選項只能在注冊時添加標簽和/或污點,所以它們只能被添加一次,之后不能再通過運行 K3s 命令來改變。

如果你想在節(jié)點注冊后更改節(jié)點標簽和污點,你應(yīng)該使用?kubectl?。

使用安裝腳本啟動 Server 節(jié)點

安裝腳本將自動檢測您的操作系統(tǒng)是使用 systemd 還是 openrc 并啟動服務(wù)。當使用 openrc 運行時,日志將在?/var/log/k3s.log?中創(chuàng)建。

當使用 systemd 運行時,日志將在?/var/log/syslog?中創(chuàng)建,并使用?journalctl -u k3s?查看。

使用安裝腳本進行安裝和自動啟動的示例:

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

國內(nèi)用戶,可以使用以下方法加速安裝:

curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

當手動運行 server 時,你應(yīng)該得到一個類似于下面的輸出:

$ k3s server
INFO[2019-01-22T15:16:19.908493986-07:00] Starting k3s dev
INFO[2019-01-22T15:16:19.908934479-07:00] Running kube-apiserver --allow-privileged=true --authorization-mode Node,RBAC --service-account-signing-key-file /var/lib/rancher/k3s/server/tls/service.key --service-cluster-ip-range 10.43.0.0/16 --advertise-port 6445 --advertise-address 127.0.0.1 --insecure-port 0 --secure-port 6444 --bind-address 127.0.0.1 --tls-cert-file /var/lib/rancher/k3s/server/tls/localhost.crt --tls-private-key-file /var/lib/rancher/k3s/server/tls/localhost.key --service-account-key-file /var/lib/rancher/k3s/server/tls/service.key --service-account-issuer k3s --api-audiences unknown --basic-auth-file /var/lib/rancher/k3s/server/cred/passwd --kubelet-client-certificate /var/lib/rancher/k3s/server/tls/token-node.crt --kubelet-client-key /var/lib/rancher/k3s/server/tls/token-node.key
Flag --insecure-port has been deprecated, This flag will be removed in a future version.
INFO[2019-01-22T15:16:20.196766005-07:00] Running kube-scheduler --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --port 0 --secure-port 0 --leader-elect=false
INFO[2019-01-22T15:16:20.196880841-07:00] Running kube-controller-manager --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --service-account-private-key-file /var/lib/rancher/k3s/server/tls/service.key --allocate-node-cidrs --cluster-cidr 10.42.0.0/16 --root-ca-file /var/lib/rancher/k3s/server/tls/token-ca.crt --port 0 --secure-port 0 --leader-elect=false
Flag --port has been deprecated, see --secure-port instead.
INFO[2019-01-22T15:16:20.273441984-07:00] Listening on :6443
INFO[2019-01-22T15:16:20.278383446-07:00] Writing manifest: /var/lib/rancher/k3s/server/manifests/coredns.yaml
INFO[2019-01-22T15:16:20.474454524-07:00] Node token is available at /var/lib/rancher/k3s/server/node-token
INFO[2019-01-22T15:16:20.474471391-07:00] To join node to cluster: k3s agent -s https://10.20.0.3:6443 -t ${NODE_TOKEN}
INFO[2019-01-22T15:16:20.541027133-07:00] Wrote kubeconfig /etc/rancher/k3s/k3s.yaml
INFO[2019-01-22T15:16:20.541049100-07:00] Run: k3s kubectl

由于 agent 將創(chuàng)建大量的日志,輸出可能會更長。默認情況下,server 會將自身注冊為一個節(jié)點(運行 agent)。

Alpine Linux 安裝的額外準備工作

設(shè)置 Alpine Linux 前,您需要進行以下準備工作:

  1. 更新 /etc/update-extlinux.conf 添加:
  2. default_kernel_opts="...  cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
  3. 更新配置并重啟:
  4. update-extlinux
    reboot

Red Hat/CentOS Enterprise Linux 的額外準備工作

建議關(guān)閉 firewalld:

systemctl disable firewalld --now

如果啟用,則需要禁用 nm-cloud-setup 并重新啟動節(jié)點:

systemctl disable nm-cloud-setup.service nm-cloud-setup.timer
reboot

Raspberry Pi OS Setup 的額外準備工作

在 Raspberry Pi OS 上啟用舊版 iptables

Raspberry Pi OS(以前稱為 Raspbian)默認使用 ?nftables ?而不是 ?iptables?。 K3S 網(wǎng)絡(luò)功能需要 ?iptables ?并且不能與 ?nftables ?一起使用。按照以下步驟切換配置 Buster 以使用 ?legacy iptables?:

sudo iptables -F
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo reboot

為 Raspberry Pi OS 啟用 cgroups

標準 Raspberry Pi OS 安裝時不會啟用 ?cgroups?。 K3S 需要 ?cgroups ?來啟動 systemd 服務(wù)??梢酝ㄟ^將 ?cgroup_memory=1 cgroup_enable=memory? 附加到 ?/boot/cmdline.txt? 來啟用 ?cgroups?。

在 Raspberry Pi 上的 Ubuntu 21.10+ 上啟用 vxlan

從 Ubuntu 21.10 開始,Raspberry Pi 上的 vxlan 支持已移至單獨的內(nèi)核模塊中。

sudo apt install linux-modules-extra-raspi

運行 K3d(Docker 中的 K3s)和 docker-compose

k3d是一個設(shè)計用于在 Docker 中輕松運行 K3s 的工具。

它可以通過 MacOS 上的brew工具安裝:

brew install k3d

?rancher/k3s?鏡像也可用于在 Docker 運行的 K3s server 和 agent。

在 K3s repo 的根目錄下有一個?docker-compose.yml?,作為如何從 Docker 運行 K3s 的示例。要從這個 repo 中運行?docker-compose?,請運行:

docker-compose up --scale agent=3
    # kubeconfig is written to current dir

kubectl --kubeconfig kubeconfig.yaml get node

    NAME           STATUS   ROLES    AGE   VERSION
    497278a2d6a2   Ready    <none>   11s   v1.13.2-k3s2
    d54c8b17c055   Ready    <none>   11s   v1.13.2-k3s2
    db7a5a5a5bdd   Ready    <none>   12s   v1.13.2-k3s2

要只在 Docker 中運行 agent,使用?docker-compose up agent?。

或者,也可以使用?docker run?命令:

sudo docker run \
  -d --tmpfs /run \
  --tmpfs /var/run \
  -e K3S_URL=${SERVER_URL} \
  -e K3S_TOKEN=${NODE_TOKEN} \
  --privileged rancher/k3s:vX.Y.Z

/boot/cmdline.txt 的示例

console=serial0,115200 console=tty1 root=PARTUUID=58b06195-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory

SELinux 支持

從 v1.19.4+k3s1 開始支持。從 v1.17.4+k3s1 開始是試驗性的。

如果您在默認啟用 SELinux 的系統(tǒng)(如 CentOS)上安裝 K3s,您必須確保安裝了正確的 SELinux 策略。

自動安裝

從 v1.19.3+k3s2 開始可用。

如果在兼容的系統(tǒng)上,如果不執(zhí)行離線安裝,則安裝腳本將從 Rancher RPM 存儲庫自動安裝 SELinux RPM??梢酝ㄟ^設(shè)置 ?INSTALL_K3S_SKIP_SELINUX_RPM=true? 來跳過自動安裝。

手動安裝

可以使用以下命令安裝必要的策略:

yum install -y container-selinux selinux-policy-base
yum install -y https://rpm.rancher.io/k3s/latest/common/centos/7/noarch/k3s-selinux-0.2-1.el7_8.noarch.rpm

要強制安裝腳本記錄警告而不是失敗,您可以設(shè)置以下環(huán)境變量: ?INSTALL_K3S_SELINUX_WARN=true?。

啟用和禁用 SELinux Enforcement

SELinux enforcement 的啟用或禁用方式取決于 K3s 的版本。

K3s v1.19.1+k3s1

要使用 SELinux,請在啟動 K3s server 和 agent 時指定?--selinux?標志。

這個選項也可以在 K3s配置文件中指定:

selinux: true

不要使用?--disable-selinux?選項。它已經(jīng)被廢棄,在未來的小版本中,它可能會因為被忽略或不被識別,從而導(dǎo)致錯誤。

在 SELinux 下不支持使用自定義的?--data-dir?。要自定義它,你很可能需要編寫自己的自定義策略。為了獲得指導(dǎo),你可以參考container/container-selinux資源庫,它包含了容器運行時的 SELinux 策略文件,以及rancher/k3s-selinux資源庫,它包含了 K3s 的 SELinux 策略。

V1.19.1+k3s1 之前的 K3s

內(nèi)置 containerd 會自動啟用 SELinux。

要關(guān)閉嵌入式 containerd 中的 SELinux enforcement,請使用?--disable-selinux?標志啟動 K3s。

在 SELinux 下不支持使用自定義的?--data-dir?。要自定義它,你很可能需要編寫自己的自定義策略。為了獲得指導(dǎo),你可以參考container/container-selinux資源庫,它包含了容器運行時的 SELinux 策略文件,以及rancher/k3s-selinux資源庫,它包含了 K3s 的 SELinux 策略。

啟用 eStargz 的延遲拉?。▽嶒炐裕?/h2>

什么是延遲拉取和 eStargz?

拉取鏡像被稱為容器生命周期中耗時的步驟之一。根據(jù)Harter, et al.:

拉取包占容器啟動時間的 76%,但其中只有 6.4%的數(shù)據(jù)被讀取

為了解決這個問題,k3s 實驗性地支持鏡像內(nèi)容的延遲拉取。這允許 k3s 在拉取整個鏡像之前啟動一個容器。相反,按需獲取必要的內(nèi)容塊(例如單個文件)。特別是對于大鏡像,這種技術(shù)可以縮短容器啟動延遲。

要啟用延遲拉取,目標鏡像需要格式化為 eStargz。這是一種 OCI 的替代品,但 100% 與 OCI 兼容的鏡像格式,用于延遲拉取。由于兼容性,eStargz 可以推送到標準容器注冊表(例如 ghcr.io),并且即使在 eStargz-agnostic 運行時,它也仍然可運行。

eStargz 是基于谷歌 CRFS 項目提出的 stargz 格式開發(fā)的,具有內(nèi)容驗證、性能優(yōu)化等實用功能。

關(guān)于延遲拉取和 eStargz 的更多細節(jié),請參考 Stargz Snapshotter 項目資源庫。

配置 k3s 進行 eStargz 的延遲拉取

如以下所示,k3s server 和 agent 需要 ?--snapshotter=stargz? 選項。

k3s server --snapshotter=stargz

使用此配置,您可以對 eStargz 格式的鏡像執(zhí)行延遲拉取。以下 Pod 清單使用 eStargz 格式的 ?node:13.13.0? 鏡像 (?ghcr.io/stargz-containers/node:13.13.0-esgz?)。k3s 對這個鏡像進行了延遲拉取。

apiVersion: v1
kind: Pod
metadata:
  name: nodejs
spec:
  containers:
  - name: nodejs-estargz
    image: ghcr.io/stargz-containers/node:13.13.0-esgz
    command: ["node"]
    args:
    - -e
    - var http = require('http');
      http.createServer(function(req, res) {
        res.writeHead(200);
        res.end('Hello World!\n');
      }).listen(80);
    ports:
    - containerPort: 80

其他日志源

可以在不使用 Rancher 的情況下安裝 K3s 的 Rancher 日志。應(yīng)執(zhí)行以下指令來實現(xiàn):

helm repo add rancher-charts https://charts.rancher.io
helm repo update
helm install --create-namespace -n cattle-logging-system rancher-logging-crd rancher-charts/rancher-logging-crd
helm install --create-namespace -n cattle-logging-system rancher-logging --set additionalLoggingSources.k3s.enabled=true rancher-charts/rancher-logging

Server 和 agent token

在 K3s 中,有兩種類型的 token:K3S_TOKEN 和 K3S_AGENT_TOKEN。

K3S_TOKEN:定義了 server 提供 HTTP 配置資源所需的密鑰。其他 server 在加入 K3s HA 集群之前會請求這些資源。如果沒有定義 K3S_AGENT_TOKEN,agent 也使用這個 token 來訪問加入集群所需的 HTTP 資源。請注意,這個 token 還用于為數(shù)據(jù)庫中的重要內(nèi)容(例如引導(dǎo)數(shù)據(jù))生成加密密鑰。

K3S_AGENT_TOKEN(可選):定義了 server 向 agent 提供 HTTP 配置資源所需的密鑰。如果沒有定義,agent 將需要 K3S_TOKEN。推薦使用 K3S_AGENT_TOKEN 避免 agent 節(jié)點必須知道 K3S_TOKEN,它也用于加密數(shù)據(jù)。

如果沒有定義 K3S_TOKEN,第一個 K3s server 將生成一個隨機的 K3S_TOKEN。其結(jié)果是 /var/lib/rancher/k3s/server/token 中的部分內(nèi)容。例如,K1070878408e06a827960208f84ed18b65fa10f27864e71a57d9e053c4caff8504b::server:df54383b5659b9280aa1e73e60ef78fc,其中 df54383b5659b9280aa1e73e60ef78fc 是 K3S_TOKEN。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號