默認(rèn)情況下,K3s 的證書在 12 個(gè)月內(nèi)過期。
如果證書已經(jīng)過期或剩余的時(shí)間不足 90 天,則在 K3s 重啟時(shí)輪換證書。
在?/var/lib/rancher/k3s/server/manifests
?中找到的任何文件都會(huì)以類似?kubectl apply
?的方式自動(dòng)部署到 Kubernetes,在啟動(dòng)和在磁盤上更改文件時(shí)都是如此。從該目錄中刪除文件不會(huì)從集群中刪除相應(yīng)的資源。
關(guān)于部署 Helm charts 的信息,請(qǐng)參閱Helm章節(jié)。
K3s 包含并默認(rèn)為containerd, 一個(gè)行業(yè)標(biāo)準(zhǔn)的容器運(yùn)行時(shí)。
要使用 Docker 而不是 containerd,
curl https://releases.rancher.com/install-docker/19.03.sh | sh
--docker
?選項(xiàng)安裝 K3s: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
$ 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
$ 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 為兼容 CRI 的容器運(yùn)行時(shí)提供了 CLI
如果你想在使用?--docker
?選項(xiàng)安裝 K3s 后使用 crictl,請(qǐng)參考官方文檔來安裝 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 為 etcd 提供了一個(gè) CLI。
如果你想在嵌入式 etcd 的 K3s 里使用 etcdctl,請(qǐng)先參考官方文檔安裝 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
然后開始使用帶有適當(dāng) K3s 標(biāo)志的 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
K3s 將會(huì)在?/var/lib/rancher/k3s/agent/etc/containerd/config.toml
?中為 containerd 生成 config.toml。
如果要對(duì)這個(gè)文件進(jìn)行高級(jí)定制,你可以在同一目錄中創(chuàng)建另一個(gè)名為 ?config.toml.tmpl
? 的文件,此文件將會(huì)代替默認(rèn)設(shè)置。
?config.toml.tmpl
? 其實(shí)是一個(gè) Go 模板文件,并且 ?config.Node
? 結(jié)構(gòu)傳遞給模板。
警告: 這個(gè)功能是試驗(yàn)性的
Rootless 模式允許以非特權(quán)用戶的身份運(yùn)行 k3s,這樣可以保護(hù)主機(jī)上的真正的 root 免受潛在的容器攻擊。
請(qǐng)參閱 https://rootlesscontaine.rs/ 了解 Rootless 模式。
在 rootless 運(yùn)行時(shí),將創(chuàng)建一個(gè)新的網(wǎng)絡(luò)名稱空間。這意味著 K3s 實(shí)例在與主機(jī)完全分離的網(wǎng)絡(luò)上運(yùn)行。從主機(jī)訪問在 K3s 中運(yùn)行的服務(wù)的唯一方法是設(shè)置端口轉(zhuǎn)發(fā)到 K3s 網(wǎng)絡(luò)名稱空間。我們有一個(gè)控制器,它將自動(dòng)將 6443 和 1024 以下的服務(wù)端口綁定到主機(jī),偏移量為 10000。
也就是說服務(wù)端口 80 在主機(jī)上會(huì)變成 10080,但 8080 會(huì)變成 8080,沒有任何偏移。
目前,只有?LoadBalancer
?服務(wù)會(huì)自動(dòng)綁定。
不支持 Cgroup v1,支持 V2。
多集群安裝沒有經(jīng)過測(cè)試,也沒有記錄。
k3s-rootless.service
?。確保使用相同版本的?k3s-rootless.service
?和?k3s
?。k3s-rootless.service
? 安裝到 ?~/.config/systemd/user/k3s-rootless.service
?。不支持將該文件安裝為全系統(tǒng)服務(wù)(?/etc/systemd/...
?)。根據(jù) ?k3s
? 二進(jìn)制文件的路徑,你可能需要修改文件中的 ?ExecStart=/usr/local/bin/k3s ...
? 行。systemctl --user daemon-reload
?。systemctl --user enable --now k3s-rootless
?。KUBECONFIG=~/.kube/k3s.yaml kubectl get pods -A
?,并確保 pods 正在運(yùn)行。注意:不要嘗試在終端上運(yùn)行?k3s server --rootless
?,因?yàn)樗荒軉⒂?nbsp;cgroup v2 授權(quán)。 如果你真的需要在終端上運(yùn)行,請(qǐng)?jiān)?nbsp;?systemd-run --user -p Delegate=yes --tty
? 前加上一個(gè) systemd 范圍。
即:?systemd-run --user -p Delegate=yes --tty k3s server --rootless
?。
systemctl --user status k3s-rootless
? 來檢查守護(hù)進(jìn)程的狀態(tài)。journalctl --user -f -u k3s-rootless
? 查看守護(hù)程序日志。K3s agents 可以通過?--node-label
?和?--node-taint
?選項(xiàng)進(jìn)行配置,這兩個(gè)選項(xiàng)可以給 kubelet 添加標(biāo)簽和污點(diǎn)。這兩個(gè)選項(xiàng)只能在注冊(cè)時(shí)添加標(biāo)簽和/或污點(diǎn),所以它們只能被添加一次,之后不能再通過運(yùn)行 K3s 命令來改變。
如果你想在節(jié)點(diǎn)注冊(cè)后更改節(jié)點(diǎn)標(biāo)簽和污點(diǎn),你應(yīng)該使用?kubectl
?。
安裝腳本將自動(dòng)檢測(cè)您的操作系統(tǒng)是使用 systemd 還是 openrc 并啟動(dòng)服務(wù)。當(dāng)使用 openrc 運(yùn)行時(shí),日志將在?/var/log/k3s.log
?中創(chuàng)建。
當(dāng)使用 systemd 運(yùn)行時(shí),日志將在?/var/log/syslog
?中創(chuàng)建,并使用?journalctl -u k3s
?查看。
使用安裝腳本進(jìn)行安裝和自動(dòng)啟動(dòng)的示例:
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 -
當(dāng)手動(dòng)運(yùn)行 server 時(shí),你應(yīng)該得到一個(gè)類似于下面的輸出:
$ 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)建大量的日志,輸出可能會(huì)更長。默認(rèn)情況下,server 會(huì)將自身注冊(cè)為一個(gè)節(jié)點(diǎn)(運(yùn)行 agent)。
設(shè)置 Alpine Linux 前,您需要進(jìn)行以下準(zhǔn)備工作:
default_kernel_opts="... cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
update-extlinux
reboot
建議關(guān)閉 firewalld:
systemctl disable firewalld --now
如果啟用,則需要禁用 nm-cloud-setup 并重新啟動(dòng)節(jié)點(diǎn):
systemctl disable nm-cloud-setup.service nm-cloud-setup.timer
reboot
Raspberry Pi OS(以前稱為 Raspbian)默認(rèn)使用 ?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
標(biāo)準(zhǔn) Raspberry Pi OS 安裝時(shí)不會(huì)啟用 ?cgroups
?。 K3S 需要 ?cgroups
?來啟動(dòng) systemd 服務(wù)。可以通過將 ?cgroup_memory=1 cgroup_enable=memory
? 附加到 ?/boot/cmdline.txt
? 來啟用 ?cgroups
?。
從 Ubuntu 21.10 開始,Raspberry Pi 上的 vxlan 支持已移至單獨(dú)的內(nèi)核模塊中。
sudo apt install linux-modules-extra-raspi
k3d是一個(gè)設(shè)計(jì)用于在 Docker 中輕松運(yùn)行 K3s 的工具。
它可以通過 MacOS 上的brew工具安裝:
brew install k3d
?rancher/k3s
?鏡像也可用于在 Docker 運(yùn)行的 K3s server 和 agent。
在 K3s repo 的根目錄下有一個(gè)?docker-compose.yml
?,作為如何從 Docker 運(yùn)行 K3s 的示例。要從這個(gè) repo 中運(yùn)行?docker-compose
?,請(qǐng)運(yùn)行:
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 中運(yùn)行 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
console=serial0,115200 console=tty1 root=PARTUUID=58b06195-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory
從 v1.19.4+k3s1 開始支持。從 v1.17.4+k3s1 開始是試驗(yàn)性的。
如果您在默認(rèn)啟用 SELinux 的系統(tǒng)(如 CentOS)上安裝 K3s,您必須確保安裝了正確的 SELinux 策略。
從 v1.19.3+k3s2 開始可用。
如果在兼容的系統(tǒng)上,如果不執(zhí)行離線安裝,則安裝腳本將從 Rancher RPM 存儲(chǔ)庫自動(dòng)安裝 SELinux RPM??梢酝ㄟ^設(shè)置 ?INSTALL_K3S_SKIP_SELINUX_RPM=true
? 來跳過自動(dòng)安裝。
可以使用以下命令安裝必要的策略:
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
要強(qiáng)制安裝腳本記錄警告而不是失敗,您可以設(shè)置以下環(huán)境變量: ?INSTALL_K3S_SELINUX_WARN=true
?。
SELinux enforcement 的啟用或禁用方式取決于 K3s 的版本。
要使用 SELinux,請(qǐng)?jiān)趩?dòng) K3s server 和 agent 時(shí)指定?--selinux
?標(biāo)志。
這個(gè)選項(xiàng)也可以在 K3s配置文件中指定:
selinux: true
不要使用?--disable-selinux
?選項(xiàng)。它已經(jīng)被廢棄,在未來的小版本中,它可能會(huì)因?yàn)楸缓雎曰虿槐蛔R(shí)別,從而導(dǎo)致錯(cuò)誤。
在 SELinux 下不支持使用自定義的?--data-dir
?。要自定義它,你很可能需要編寫自己的自定義策略。為了獲得指導(dǎo),你可以參考container/container-selinux資源庫,它包含了容器運(yùn)行時(shí)的 SELinux 策略文件,以及rancher/k3s-selinux資源庫,它包含了 K3s 的 SELinux 策略。
內(nèi)置 containerd 會(huì)自動(dòng)啟用 SELinux。
要關(guān)閉嵌入式 containerd 中的 SELinux enforcement,請(qǐng)使用?--disable-selinux
?標(biāo)志啟動(dòng) K3s。
在 SELinux 下不支持使用自定義的?--data-dir
?。要自定義它,你很可能需要編寫自己的自定義策略。為了獲得指導(dǎo),你可以參考container/container-selinux資源庫,它包含了容器運(yùn)行時(shí)的 SELinux 策略文件,以及rancher/k3s-selinux資源庫,它包含了 K3s 的 SELinux 策略。
拉取鏡像被稱為容器生命周期中耗時(shí)的步驟之一。根據(jù)Harter, et al.:
拉取包占容器啟動(dòng)時(shí)間的 76%,但其中只有 6.4%的數(shù)據(jù)被讀取
為了解決這個(gè)問題,k3s 實(shí)驗(yàn)性地支持鏡像內(nèi)容的延遲拉取。這允許 k3s 在拉取整個(gè)鏡像之前啟動(dòng)一個(gè)容器。相反,按需獲取必要的內(nèi)容塊(例如單個(gè)文件)。特別是對(duì)于大鏡像,這種技術(shù)可以縮短容器啟動(dòng)延遲。
要啟用延遲拉取,目標(biāo)鏡像需要格式化為 eStargz。這是一種 OCI 的替代品,但 100% 與 OCI 兼容的鏡像格式,用于延遲拉取。由于兼容性,eStargz 可以推送到標(biāo)準(zhǔn)容器注冊(cè)表(例如 ghcr.io),并且即使在 eStargz-agnostic 運(yùn)行時(shí),它也仍然可運(yùn)行。
eStargz 是基于谷歌 CRFS 項(xiàng)目提出的 stargz 格式開發(fā)的,具有內(nèi)容驗(yàn)證、性能優(yōu)化等實(shí)用功能。
關(guān)于延遲拉取和 eStargz 的更多細(xì)節(jié),請(qǐng)參考 Stargz Snapshotter 項(xiàng)目資源庫。
如以下所示,k3s server 和 agent 需要 ?--snapshotter=stargz
? 選項(xiàng)。
k3s server --snapshotter=stargz
使用此配置,您可以對(duì) eStargz 格式的鏡像執(zhí)行延遲拉取。以下 Pod 清單使用 eStargz 格式的 ?node:13.13.0
? 鏡像 (?ghcr.io/stargz-containers/node:13.13.0-esgz
?)。k3s 對(duì)這個(gè)鏡像進(jìn)行了延遲拉取。
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í)行以下指令來實(shí)現(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
在 K3s 中,有兩種類型的 token:K3S_TOKEN 和 K3S_AGENT_TOKEN。
K3S_TOKEN:定義了 server 提供 HTTP 配置資源所需的密鑰。其他 server 在加入 K3s HA 集群之前會(huì)請(qǐng)求這些資源。如果沒有定義 K3S_AGENT_TOKEN,agent 也使用這個(gè) token 來訪問加入集群所需的 HTTP 資源。請(qǐng)注意,這個(gè) token 還用于為數(shù)據(jù)庫中的重要內(nèi)容(例如引導(dǎo)數(shù)據(jù))生成加密密鑰。
K3S_AGENT_TOKEN(可選):定義了 server 向 agent 提供 HTTP 配置資源所需的密鑰。如果沒有定義,agent 將需要 K3S_TOKEN。推薦使用 K3S_AGENT_TOKEN 避免 agent 節(jié)點(diǎn)必須知道 K3S_TOKEN,它也用于加密數(shù)據(jù)。
如果沒有定義 K3S_TOKEN,第一個(gè) K3s server 將生成一個(gè)隨機(jī)的 K3S_TOKEN。其結(jié)果是 /var/lib/rancher/k3s/server/token
中的部分內(nèi)容。例如,K1070878408e06a827960208f84ed18b65fa10f27864e71a57d9e053c4caff8504b::server:df54383b5659b9280aa1e73e60ef78fc
,其中 df54383b5659b9280aa1e73e60ef78fc
是 K3S_TOKEN。
更多建議: